From a6e2e46b54dac4d99ad8b87359d9772ace5dc447 Mon Sep 17 00:00:00 2001 From: Carl Dong Date: Sun, 28 Jan 2018 01:13:56 +0000 Subject: [PATCH] Submodulize and update libwally-core for LTO removal. --- .gitmodules | 3 + external/libwally-core | 1 + external/libwally-core/.gitignore | 59 - external/libwally-core/.travis.yml | 43 - external/libwally-core/1README | 1 - external/libwally-core/INSTALL | 13 - external/libwally-core/LICENSE | 23 - external/libwally-core/Makefile.am | 3 - external/libwally-core/README.md | 111 - external/libwally-core/configure.ac | 268 - external/libwally-core/include/wally_bip32.h | 226 - external/libwally-core/include/wally_bip38.h | 96 - external/libwally-core/include/wally_bip39.h | 113 - external/libwally-core/include/wally_core.h | 206 - external/libwally-core/include/wally_crypto.h | 442 -- external/libwally-core/setup.py | 54 - external/libwally-core/src/Makefile.am | 150 - external/libwally-core/src/aes.c | 179 - external/libwally-core/src/base58.c | 290 -- external/libwally-core/src/base58.h | 14 - external/libwally-core/src/bip32.c | 678 --- external/libwally-core/src/bip32_int.h | 18 - external/libwally-core/src/bip38.c | 317 -- external/libwally-core/src/bip39.c | 240 - external/libwally-core/src/ccan/README | 8 - .../src/ccan/ccan/build_assert/LICENSE | 1 - .../src/ccan/ccan/build_assert/_info | 49 - .../src/ccan/ccan/build_assert/build_assert.h | 40 - .../build_assert/test/compile_fail-expr.c | 10 - .../ccan/build_assert/test/compile_fail.c | 9 - .../ccan/ccan/build_assert/test/compile_ok.c | 7 - .../test/run-BUILD_ASSERT_OR_ZERO.c | 9 - .../src/ccan/ccan/compiler/LICENSE | 1 - .../src/ccan/ccan/compiler/_info | 64 - .../src/ccan/ccan/compiler/compiler.h | 231 - .../ccan/compiler/test/compile_fail-printf.c | 22 - .../compiler/test/run-is_compile_constant.c | 15 - .../src/ccan/ccan/crypto/ripemd160/LICENSE | 1 - .../src/ccan/ccan/crypto/ripemd160/_info | 55 - .../ccan/ccan/crypto/ripemd160/ripemd160.c | 402 -- .../ccan/ccan/crypto/ripemd160/ripemd160.h | 148 - .../crypto/ripemd160/test/run-lotsa-data.c | 23 - .../crypto/ripemd160/test/run-test-vectors.c | 84 - .../ccan/crypto/ripemd160/test/run-types.c | 63 - .../src/ccan/ccan/crypto/sha256/LICENSE | 1 - .../src/ccan/ccan/crypto/sha256/_info | 55 - .../src/ccan/ccan/crypto/sha256/sha256.c | 300 -- .../src/ccan/ccan/crypto/sha256/sha256.h | 147 - .../ccan/crypto/sha256/test/run-33-bit-test.c | 54 - .../ccan/crypto/sha256/test/run-lotsa-data.c | 23 - .../crypto/sha256/test/run-test-vectors.c | 83 - .../ccan/ccan/crypto/sha256/test/run-types.c | 63 - .../src/ccan/ccan/crypto/sha512/LICENSE | 1 - .../src/ccan/ccan/crypto/sha512/_info | 55 - .../src/ccan/ccan/crypto/sha512/sha512.c | 260 - .../src/ccan/ccan/crypto/sha512/sha512.h | 135 - .../src/ccan/ccan/endian/LICENSE | 1 - .../libwally-core/src/ccan/ccan/endian/_info | 55 - .../src/ccan/ccan/endian/endian.h | 346 -- .../ccan/endian/test/compile_ok-constant.c | 12 - .../src/ccan/ccan/endian/test/run.c | 106 - .../src/ccan/ccan/str/hex/LICENSE | 1 - .../libwally-core/src/ccan/ccan/str/hex/_info | 39 - .../libwally-core/src/ccan/ccan/str/hex/hex.c | 66 - .../libwally-core/src/ccan/ccan/str/hex/hex.h | 73 - .../src/ccan/ccan/str/hex/test/run.c | 42 - .../libwally-core/src/ccan/ccan/tap/_info | 61 - .../libwally-core/src/ccan/ccan/tap/tap.3 | 362 -- .../libwally-core/src/ccan/ccan/tap/tap.c | 457 -- .../libwally-core/src/ccan/ccan/tap/tap.h | 251 - .../src/ccan/ccan/tap/test/run.c | 133 - .../libwally-core/src/ccan/licenses/BSD-MIT | 17 - external/libwally-core/src/ccan/licenses/CC0 | 28 - external/libwally-core/src/ccan_config.h | 34 - external/libwally-core/src/cpufeatures/NOTICE | 13 - .../src/cpufeatures/cpu-features.c | 1281 ----- .../src/cpufeatures/cpu-features.h | 318 -- external/libwally-core/src/ctaes/COPYING | 21 - external/libwally-core/src/ctaes/README.md | 41 - external/libwally-core/src/ctaes/bench.c | 170 - external/libwally-core/src/ctaes/ctaes.c | 556 -- external/libwally-core/src/ctaes/ctaes.h | 41 - external/libwally-core/src/ctaes/test.c | 110 - external/libwally-core/src/ctest/test_clear.c | 163 - .../src/data/address_vectors.txt | 1099 ---- .../libwally-core/src/data/aes-cbc-pkcs7.txt | 237 - .../src/data/ecdsa_secp256k1_vectors.txt | 535 -- .../src/data/pbkdf2_hmac_sha_vectors.txt | 265 - .../libwally-core/src/data/wordlists/README | 9 - .../src/data/wordlists/chinese_simplified.c | 2408 --------- .../src/data/wordlists/chinese_simplified.txt | 2048 -------- .../src/data/wordlists/chinese_traditional.c | 2408 --------- .../data/wordlists/chinese_traditional.txt | 2048 -------- .../src/data/wordlists/english.c | 2408 --------- .../src/data/wordlists/english.txt | 2048 -------- .../libwally-core/src/data/wordlists/french.c | 2408 --------- .../src/data/wordlists/french.txt | 2048 -------- .../src/data/wordlists/italian.c | 2408 --------- .../src/data/wordlists/italian.txt | 2048 -------- .../src/data/wordlists/japanese.c | 2408 --------- .../src/data/wordlists/japanese.txt | 2048 -------- .../src/data/wordlists/spanish.c | 2408 --------- .../src/data/wordlists/spanish.txt | 2048 -------- .../src/data/wordlists/vectors.json | 150 - external/libwally-core/src/hex.c | 46 - external/libwally-core/src/hmac.c | 25 - external/libwally-core/src/hmac.h | 33 - external/libwally-core/src/hmac.inl | 66 - external/libwally-core/src/internal.c | 252 - external/libwally-core/src/internal.h | 43 - external/libwally-core/src/mnemonic.c | 97 - external/libwally-core/src/mnemonic.h | 36 - external/libwally-core/src/pbkdf2.c | 28 - external/libwally-core/src/pbkdf2.inl | 75 - external/libwally-core/src/scrypt.c | 76 - .../libwally-core/src/scrypt/crypto_scrypt.c | 274 - .../src/scrypt/crypto_scrypt_smix.c | 217 - .../src/scrypt/crypto_scrypt_smix_neon.c | 266 - .../src/scrypt/crypto_scrypt_smix_sse2.c | 251 - .../libwally-core/src/secp256k1/.gitignore | 48 - .../libwally-core/src/secp256k1/.travis.yml | 70 - external/libwally-core/src/secp256k1/COPYING | 19 - .../libwally-core/src/secp256k1/Makefile.am | 167 - .../libwally-core/src/secp256k1/README.md | 61 - external/libwally-core/src/secp256k1/TODO | 3 - .../libwally-core/src/secp256k1/autogen.sh | 3 - .../build-aux/m4/ax_jni_include_dir.m4 | 140 - .../build-aux/m4/ax_prog_cc_for_build.m4 | 125 - .../secp256k1/build-aux/m4/bitcoin_secp.m4 | 65 - .../libwally-core/src/secp256k1/configure.ac | 510 -- .../src/secp256k1/contrib/lax_der_parsing.c | 150 - .../src/secp256k1/contrib/lax_der_parsing.h | 91 - .../contrib/lax_der_privatekey_parsing.c | 113 - .../contrib/lax_der_privatekey_parsing.h | 90 - .../src/secp256k1/include/secp256k1.h | 577 --- .../src/secp256k1/include/secp256k1_ecdh.h | 31 - .../secp256k1/include/secp256k1_rangeproof.h | 186 - .../secp256k1/include/secp256k1_recovery.h | 110 - .../src/secp256k1/include/secp256k1_schnorr.h | 173 - .../src/secp256k1/libsecp256k1.pc.in | 13 - .../src/secp256k1/obj/.gitignore | 0 .../src/secp256k1/sage/group_prover.sage | 322 -- .../src/secp256k1/sage/secp256k1.sage | 306 -- .../secp256k1/sage/weierstrass_prover.sage | 264 - .../src/secp256k1/src/asm/field_10x26_arm.s | 919 ---- .../src/secp256k1/src/basic-config.h | 32 - .../libwally-core/src/secp256k1/src/bench.h | 66 - .../src/secp256k1/src/bench_ecdh.c | 54 - .../src/secp256k1/src/bench_internal.c | 382 -- .../src/secp256k1/src/bench_rangeproof.c | 65 - .../src/secp256k1/src/bench_recover.c | 60 - .../src/secp256k1/src/bench_schnorr_verify.c | 73 - .../src/secp256k1/src/bench_sign.c | 56 - .../src/secp256k1/src/bench_verify.c | 112 - .../libwally-core/src/secp256k1/src/ecdsa.h | 21 - .../src/secp256k1/src/ecdsa_impl.h | 303 -- .../libwally-core/src/secp256k1/src/eckey.h | 25 - .../src/secp256k1/src/eckey_impl.h | 99 - .../libwally-core/src/secp256k1/src/ecmult.h | 31 - .../src/secp256k1/src/ecmult_const.h | 15 - .../src/secp256k1/src/ecmult_const_impl.h | 239 - .../src/secp256k1/src/ecmult_gen.h | 43 - .../src/secp256k1/src/ecmult_gen_impl.h | 210 - .../src/secp256k1/src/ecmult_impl.h | 391 -- .../libwally-core/src/secp256k1/src/field.h | 127 - .../src/secp256k1/src/field_10x26.h | 47 - .../src/secp256k1/src/field_10x26_impl.h | 1144 ---- .../src/secp256k1/src/field_5x52.h | 47 - .../src/secp256k1/src/field_5x52_asm_impl.h | 502 -- .../src/secp256k1/src/field_5x52_impl.h | 455 -- .../secp256k1/src/field_5x52_int128_impl.h | 277 - .../src/secp256k1/src/field_impl.h | 315 -- .../src/secp256k1/src/gen_context.c | 74 - .../libwally-core/src/secp256k1/src/group.h | 144 - .../src/secp256k1/src/group_impl.h | 650 --- .../libwally-core/src/secp256k1/src/hash.h | 41 - .../src/secp256k1/src/hash_impl.h | 281 - .../src/java/org/bitcoin/NativeSecp256k1.java | 478 -- .../java/org/bitcoin/NativeSecp256k1Test.java | 247 - .../java/org/bitcoin/NativeSecp256k1Util.java | 45 - .../java/org/bitcoin/Secp256k1Context.java | 51 - .../src/java/org_bitcoin_NativeSecp256k1.c | 411 -- .../src/java/org_bitcoin_NativeSecp256k1.h | 127 - .../src/java/org_bitcoin_Secp256k1Context.c | 15 - .../src/java/org_bitcoin_Secp256k1Context.h | 22 - .../src/modules/ecdh/Makefile.am.include | 8 - .../secp256k1/src/modules/ecdh/main_impl.h | 54 - .../secp256k1/src/modules/ecdh/tests_impl.h | 75 - .../modules/rangeproof/Makefile.am.include | 15 - .../src/modules/rangeproof/borromean.h | 24 - .../src/modules/rangeproof/borromean_impl.h | 201 - .../src/modules/rangeproof/main_impl.h | 176 - .../src/modules/rangeproof/pedersen.h | 34 - .../src/modules/rangeproof/pedersen_impl.h | 139 - .../src/modules/rangeproof/rangeproof.h | 31 - .../src/modules/rangeproof/rangeproof_impl.h | 736 --- .../src/modules/rangeproof/tests_impl.h | 281 - .../src/modules/recovery/Makefile.am.include | 8 - .../src/modules/recovery/main_impl.h | 193 - .../src/modules/recovery/tests_impl.h | 250 - .../src/modules/schnorr/Makefile.am.include | 10 - .../secp256k1/src/modules/schnorr/main_impl.h | 164 - .../secp256k1/src/modules/schnorr/schnorr.h | 20 - .../src/modules/schnorr/schnorr_impl.h | 207 - .../src/modules/schnorr/tests_impl.h | 175 - .../libwally-core/src/secp256k1/src/num.h | 74 - .../libwally-core/src/secp256k1/src/num_gmp.h | 20 - .../src/secp256k1/src/num_gmp_impl.h | 288 -- .../src/secp256k1/src/num_impl.h | 24 - .../libwally-core/src/secp256k1/src/scalar.h | 104 - .../src/secp256k1/src/scalar_4x64.h | 19 - .../src/secp256k1/src/scalar_4x64_impl.h | 949 ---- .../src/secp256k1/src/scalar_8x32.h | 19 - .../src/secp256k1/src/scalar_8x32_impl.h | 721 --- .../src/secp256k1/src/scalar_impl.h | 335 -- .../src/secp256k1/src/secp256k1.c | 586 --- .../src/secp256k1/src/testrand.h | 41 - .../src/secp256k1/src/testrand_impl.h | 127 - .../libwally-core/src/secp256k1/src/tests.c | 4580 ----------------- .../libwally-core/src/secp256k1/src/util.h | 137 - external/libwally-core/src/sign.c | 292 -- .../src/swig_java/jni_extra.java_in | 104 - .../src/com/blockstream/test/test_bip32.java | 62 - .../com/blockstream/test/test_mnemonic.java | 109 - external/libwally-core/src/swig_java/swig.i | 354 -- .../src/swig_python/contrib/mnemonic.py | 67 - .../src/swig_python/python_extra.py_in | 65 - external/libwally-core/src/swig_python/swig.i | 188 - .../src/swig_python/wallycore/README | 1 - external/libwally-core/src/test/test_aes.py | 97 - .../libwally-core/src/test/test_base58.py | 154 - external/libwally-core/src/test/test_bip32.py | 283 - external/libwally-core/src/test/test_bip38.py | 97 - external/libwally-core/src/test/test_bip39.py | 123 - external/libwally-core/src/test/test_hash.py | 112 - external/libwally-core/src/test/test_hex.py | 52 - external/libwally-core/src/test/test_hmac.py | 95 - .../libwally-core/src/test/test_mnemonic.py | 36 - .../libwally-core/src/test/test_pbkdf2.py | 91 - .../libwally-core/src/test/test_scrypt.py | 55 - external/libwally-core/src/test/test_sign.py | 183 - .../libwally-core/src/test/test_wordlist.py | 54 - external/libwally-core/src/test/util.py | 224 - external/libwally-core/src/wordlist.c | 105 - external/libwally-core/src/wordlist.h | 65 - external/libwally-core/tools/autogen.sh | 2 - .../tools/build-aux/m4/ac_pkg_swig.m4 | 155 - .../build-aux/m4/ax_check_compile_flag.m4 | 74 - .../tools/build-aux/m4/ax_check_link_flag.m4 | 74 - .../tools/build-aux/m4/ax_jni_include_dir.m4 | 140 - .../tools/build-aux/m4/ax_pthread.m4 | 485 -- .../tools/build-aux/m4/ax_python_devel.m4 | 332 -- .../libwally-core/tools/build_python_eggs.sh | 31 - external/libwally-core/tools/cleanup.sh | 45 - external/libwally-core/tools/coverage.sh | 17 - external/libwally-core/tools/swigjavapost.sh | 16 - external/libwally-core/tools/travis_build.sh | 18 - .../libwally-core/tools/travis_install.sh | 7 - external/libwally-core/tools/uncrustify | 8 - external/libwally-core/tools/uncrustify.cfg | 1578 ------ external/libwally-core/tools/wordlist_cc.py | 53 - 261 files changed, 4 insertions(+), 75294 deletions(-) create mode 160000 external/libwally-core delete mode 100644 external/libwally-core/.gitignore delete mode 100644 external/libwally-core/.travis.yml delete mode 100644 external/libwally-core/1README delete mode 100644 external/libwally-core/INSTALL delete mode 100644 external/libwally-core/LICENSE delete mode 100644 external/libwally-core/Makefile.am delete mode 100644 external/libwally-core/README.md delete mode 100644 external/libwally-core/configure.ac delete mode 100644 external/libwally-core/include/wally_bip32.h delete mode 100644 external/libwally-core/include/wally_bip38.h delete mode 100644 external/libwally-core/include/wally_bip39.h delete mode 100644 external/libwally-core/include/wally_core.h delete mode 100644 external/libwally-core/include/wally_crypto.h delete mode 100644 external/libwally-core/setup.py delete mode 100644 external/libwally-core/src/Makefile.am delete mode 100644 external/libwally-core/src/aes.c delete mode 100644 external/libwally-core/src/base58.c delete mode 100644 external/libwally-core/src/base58.h delete mode 100644 external/libwally-core/src/bip32.c delete mode 100644 external/libwally-core/src/bip32_int.h delete mode 100644 external/libwally-core/src/bip38.c delete mode 100644 external/libwally-core/src/bip39.c delete mode 100644 external/libwally-core/src/ccan/README delete mode 120000 external/libwally-core/src/ccan/ccan/build_assert/LICENSE delete mode 100644 external/libwally-core/src/ccan/ccan/build_assert/_info delete mode 100644 external/libwally-core/src/ccan/ccan/build_assert/build_assert.h delete mode 100644 external/libwally-core/src/ccan/ccan/build_assert/test/compile_fail-expr.c delete mode 100644 external/libwally-core/src/ccan/ccan/build_assert/test/compile_fail.c delete mode 100644 external/libwally-core/src/ccan/ccan/build_assert/test/compile_ok.c delete mode 100644 external/libwally-core/src/ccan/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c delete mode 120000 external/libwally-core/src/ccan/ccan/compiler/LICENSE delete mode 100644 external/libwally-core/src/ccan/ccan/compiler/_info delete mode 100644 external/libwally-core/src/ccan/ccan/compiler/compiler.h delete mode 100644 external/libwally-core/src/ccan/ccan/compiler/test/compile_fail-printf.c delete mode 100644 external/libwally-core/src/ccan/ccan/compiler/test/run-is_compile_constant.c delete mode 120000 external/libwally-core/src/ccan/ccan/crypto/ripemd160/LICENSE delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/ripemd160/_info delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/ripemd160/ripemd160.c delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/ripemd160/ripemd160.h delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-lotsa-data.c delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-test-vectors.c delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-types.c delete mode 120000 external/libwally-core/src/ccan/ccan/crypto/sha256/LICENSE delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha256/_info delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha256/sha256.c delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha256/sha256.h delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-33-bit-test.c delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-lotsa-data.c delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-test-vectors.c delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-types.c delete mode 120000 external/libwally-core/src/ccan/ccan/crypto/sha512/LICENSE delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha512/_info delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha512/sha512.c delete mode 100644 external/libwally-core/src/ccan/ccan/crypto/sha512/sha512.h delete mode 120000 external/libwally-core/src/ccan/ccan/endian/LICENSE delete mode 100644 external/libwally-core/src/ccan/ccan/endian/_info delete mode 100644 external/libwally-core/src/ccan/ccan/endian/endian.h delete mode 100644 external/libwally-core/src/ccan/ccan/endian/test/compile_ok-constant.c delete mode 100644 external/libwally-core/src/ccan/ccan/endian/test/run.c delete mode 120000 external/libwally-core/src/ccan/ccan/str/hex/LICENSE delete mode 100644 external/libwally-core/src/ccan/ccan/str/hex/_info delete mode 100644 external/libwally-core/src/ccan/ccan/str/hex/hex.c delete mode 100644 external/libwally-core/src/ccan/ccan/str/hex/hex.h delete mode 100644 external/libwally-core/src/ccan/ccan/str/hex/test/run.c delete mode 100644 external/libwally-core/src/ccan/ccan/tap/_info delete mode 100644 external/libwally-core/src/ccan/ccan/tap/tap.3 delete mode 100644 external/libwally-core/src/ccan/ccan/tap/tap.c delete mode 100644 external/libwally-core/src/ccan/ccan/tap/tap.h delete mode 100644 external/libwally-core/src/ccan/ccan/tap/test/run.c delete mode 100644 external/libwally-core/src/ccan/licenses/BSD-MIT delete mode 100644 external/libwally-core/src/ccan/licenses/CC0 delete mode 100644 external/libwally-core/src/ccan_config.h delete mode 100644 external/libwally-core/src/cpufeatures/NOTICE delete mode 100644 external/libwally-core/src/cpufeatures/cpu-features.c delete mode 100644 external/libwally-core/src/cpufeatures/cpu-features.h delete mode 100644 external/libwally-core/src/ctaes/COPYING delete mode 100644 external/libwally-core/src/ctaes/README.md delete mode 100644 external/libwally-core/src/ctaes/bench.c delete mode 100644 external/libwally-core/src/ctaes/ctaes.c delete mode 100644 external/libwally-core/src/ctaes/ctaes.h delete mode 100644 external/libwally-core/src/ctaes/test.c delete mode 100644 external/libwally-core/src/ctest/test_clear.c delete mode 100644 external/libwally-core/src/data/address_vectors.txt delete mode 100644 external/libwally-core/src/data/aes-cbc-pkcs7.txt delete mode 100644 external/libwally-core/src/data/ecdsa_secp256k1_vectors.txt delete mode 100644 external/libwally-core/src/data/pbkdf2_hmac_sha_vectors.txt delete mode 100644 external/libwally-core/src/data/wordlists/README delete mode 100644 external/libwally-core/src/data/wordlists/chinese_simplified.c delete mode 100644 external/libwally-core/src/data/wordlists/chinese_simplified.txt delete mode 100644 external/libwally-core/src/data/wordlists/chinese_traditional.c delete mode 100644 external/libwally-core/src/data/wordlists/chinese_traditional.txt delete mode 100644 external/libwally-core/src/data/wordlists/english.c delete mode 100644 external/libwally-core/src/data/wordlists/english.txt delete mode 100644 external/libwally-core/src/data/wordlists/french.c delete mode 100644 external/libwally-core/src/data/wordlists/french.txt delete mode 100644 external/libwally-core/src/data/wordlists/italian.c delete mode 100644 external/libwally-core/src/data/wordlists/italian.txt delete mode 100644 external/libwally-core/src/data/wordlists/japanese.c delete mode 100644 external/libwally-core/src/data/wordlists/japanese.txt delete mode 100644 external/libwally-core/src/data/wordlists/spanish.c delete mode 100644 external/libwally-core/src/data/wordlists/spanish.txt delete mode 100644 external/libwally-core/src/data/wordlists/vectors.json delete mode 100644 external/libwally-core/src/hex.c delete mode 100644 external/libwally-core/src/hmac.c delete mode 100644 external/libwally-core/src/hmac.h delete mode 100644 external/libwally-core/src/hmac.inl delete mode 100644 external/libwally-core/src/internal.c delete mode 100644 external/libwally-core/src/internal.h delete mode 100644 external/libwally-core/src/mnemonic.c delete mode 100644 external/libwally-core/src/mnemonic.h delete mode 100644 external/libwally-core/src/pbkdf2.c delete mode 100644 external/libwally-core/src/pbkdf2.inl delete mode 100644 external/libwally-core/src/scrypt.c delete mode 100644 external/libwally-core/src/scrypt/crypto_scrypt.c delete mode 100644 external/libwally-core/src/scrypt/crypto_scrypt_smix.c delete mode 100644 external/libwally-core/src/scrypt/crypto_scrypt_smix_neon.c delete mode 100644 external/libwally-core/src/scrypt/crypto_scrypt_smix_sse2.c delete mode 100644 external/libwally-core/src/secp256k1/.gitignore delete mode 100644 external/libwally-core/src/secp256k1/.travis.yml delete mode 100644 external/libwally-core/src/secp256k1/COPYING delete mode 100644 external/libwally-core/src/secp256k1/Makefile.am delete mode 100644 external/libwally-core/src/secp256k1/README.md delete mode 100644 external/libwally-core/src/secp256k1/TODO delete mode 100755 external/libwally-core/src/secp256k1/autogen.sh delete mode 100644 external/libwally-core/src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 delete mode 100644 external/libwally-core/src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 delete mode 100644 external/libwally-core/src/secp256k1/build-aux/m4/bitcoin_secp.m4 delete mode 100644 external/libwally-core/src/secp256k1/configure.ac delete mode 100644 external/libwally-core/src/secp256k1/contrib/lax_der_parsing.c delete mode 100644 external/libwally-core/src/secp256k1/contrib/lax_der_parsing.h delete mode 100644 external/libwally-core/src/secp256k1/contrib/lax_der_privatekey_parsing.c delete mode 100644 external/libwally-core/src/secp256k1/contrib/lax_der_privatekey_parsing.h delete mode 100644 external/libwally-core/src/secp256k1/include/secp256k1.h delete mode 100644 external/libwally-core/src/secp256k1/include/secp256k1_ecdh.h delete mode 100644 external/libwally-core/src/secp256k1/include/secp256k1_rangeproof.h delete mode 100644 external/libwally-core/src/secp256k1/include/secp256k1_recovery.h delete mode 100644 external/libwally-core/src/secp256k1/include/secp256k1_schnorr.h delete mode 100644 external/libwally-core/src/secp256k1/libsecp256k1.pc.in delete mode 100644 external/libwally-core/src/secp256k1/obj/.gitignore delete mode 100644 external/libwally-core/src/secp256k1/sage/group_prover.sage delete mode 100644 external/libwally-core/src/secp256k1/sage/secp256k1.sage delete mode 100644 external/libwally-core/src/secp256k1/sage/weierstrass_prover.sage delete mode 100644 external/libwally-core/src/secp256k1/src/asm/field_10x26_arm.s delete mode 100644 external/libwally-core/src/secp256k1/src/basic-config.h delete mode 100644 external/libwally-core/src/secp256k1/src/bench.h delete mode 100644 external/libwally-core/src/secp256k1/src/bench_ecdh.c delete mode 100644 external/libwally-core/src/secp256k1/src/bench_internal.c delete mode 100644 external/libwally-core/src/secp256k1/src/bench_rangeproof.c delete mode 100644 external/libwally-core/src/secp256k1/src/bench_recover.c delete mode 100644 external/libwally-core/src/secp256k1/src/bench_schnorr_verify.c delete mode 100644 external/libwally-core/src/secp256k1/src/bench_sign.c delete mode 100644 external/libwally-core/src/secp256k1/src/bench_verify.c delete mode 100644 external/libwally-core/src/secp256k1/src/ecdsa.h delete mode 100644 external/libwally-core/src/secp256k1/src/ecdsa_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/eckey.h delete mode 100644 external/libwally-core/src/secp256k1/src/eckey_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/ecmult.h delete mode 100644 external/libwally-core/src/secp256k1/src/ecmult_const.h delete mode 100644 external/libwally-core/src/secp256k1/src/ecmult_const_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/ecmult_gen.h delete mode 100644 external/libwally-core/src/secp256k1/src/ecmult_gen_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/ecmult_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/field.h delete mode 100644 external/libwally-core/src/secp256k1/src/field_10x26.h delete mode 100644 external/libwally-core/src/secp256k1/src/field_10x26_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/field_5x52.h delete mode 100644 external/libwally-core/src/secp256k1/src/field_5x52_asm_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/field_5x52_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/field_5x52_int128_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/field_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/gen_context.c delete mode 100644 external/libwally-core/src/secp256k1/src/group.h delete mode 100644 external/libwally-core/src/secp256k1/src/group_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/hash.h delete mode 100644 external/libwally-core/src/secp256k1/src/hash_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java delete mode 100644 external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java delete mode 100644 external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java delete mode 100644 external/libwally-core/src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java delete mode 100644 external/libwally-core/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c delete mode 100644 external/libwally-core/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h delete mode 100644 external/libwally-core/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c delete mode 100644 external/libwally-core/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/ecdh/Makefile.am.include delete mode 100644 external/libwally-core/src/secp256k1/src/modules/ecdh/main_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/ecdh/tests_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/Makefile.am.include delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/borromean.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/borromean_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/main_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/pedersen.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/pedersen_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/rangeproof.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/rangeproof_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/rangeproof/tests_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/recovery/Makefile.am.include delete mode 100755 external/libwally-core/src/secp256k1/src/modules/recovery/main_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/recovery/tests_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/schnorr/Makefile.am.include delete mode 100755 external/libwally-core/src/secp256k1/src/modules/schnorr/main_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/schnorr/schnorr.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/schnorr/schnorr_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/modules/schnorr/tests_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/num.h delete mode 100644 external/libwally-core/src/secp256k1/src/num_gmp.h delete mode 100644 external/libwally-core/src/secp256k1/src/num_gmp_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/num_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/scalar.h delete mode 100644 external/libwally-core/src/secp256k1/src/scalar_4x64.h delete mode 100644 external/libwally-core/src/secp256k1/src/scalar_4x64_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/scalar_8x32.h delete mode 100644 external/libwally-core/src/secp256k1/src/scalar_8x32_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/scalar_impl.h delete mode 100755 external/libwally-core/src/secp256k1/src/secp256k1.c delete mode 100644 external/libwally-core/src/secp256k1/src/testrand.h delete mode 100644 external/libwally-core/src/secp256k1/src/testrand_impl.h delete mode 100644 external/libwally-core/src/secp256k1/src/tests.c delete mode 100644 external/libwally-core/src/secp256k1/src/util.h delete mode 100644 external/libwally-core/src/sign.c delete mode 100644 external/libwally-core/src/swig_java/jni_extra.java_in delete mode 100644 external/libwally-core/src/swig_java/src/com/blockstream/test/test_bip32.java delete mode 100644 external/libwally-core/src/swig_java/src/com/blockstream/test/test_mnemonic.java delete mode 100644 external/libwally-core/src/swig_java/swig.i delete mode 100644 external/libwally-core/src/swig_python/contrib/mnemonic.py delete mode 100644 external/libwally-core/src/swig_python/python_extra.py_in delete mode 100644 external/libwally-core/src/swig_python/swig.i delete mode 100644 external/libwally-core/src/swig_python/wallycore/README delete mode 100755 external/libwally-core/src/test/test_aes.py delete mode 100755 external/libwally-core/src/test/test_base58.py delete mode 100755 external/libwally-core/src/test/test_bip32.py delete mode 100755 external/libwally-core/src/test/test_bip38.py delete mode 100755 external/libwally-core/src/test/test_bip39.py delete mode 100755 external/libwally-core/src/test/test_hash.py delete mode 100755 external/libwally-core/src/test/test_hex.py delete mode 100755 external/libwally-core/src/test/test_hmac.py delete mode 100755 external/libwally-core/src/test/test_mnemonic.py delete mode 100755 external/libwally-core/src/test/test_pbkdf2.py delete mode 100755 external/libwally-core/src/test/test_scrypt.py delete mode 100755 external/libwally-core/src/test/test_sign.py delete mode 100755 external/libwally-core/src/test/test_wordlist.py delete mode 100755 external/libwally-core/src/test/util.py delete mode 100644 external/libwally-core/src/wordlist.c delete mode 100644 external/libwally-core/src/wordlist.h delete mode 100755 external/libwally-core/tools/autogen.sh delete mode 100644 external/libwally-core/tools/build-aux/m4/ac_pkg_swig.m4 delete mode 100644 external/libwally-core/tools/build-aux/m4/ax_check_compile_flag.m4 delete mode 100644 external/libwally-core/tools/build-aux/m4/ax_check_link_flag.m4 delete mode 100644 external/libwally-core/tools/build-aux/m4/ax_jni_include_dir.m4 delete mode 100644 external/libwally-core/tools/build-aux/m4/ax_pthread.m4 delete mode 100644 external/libwally-core/tools/build-aux/m4/ax_python_devel.m4 delete mode 100755 external/libwally-core/tools/build_python_eggs.sh delete mode 100755 external/libwally-core/tools/cleanup.sh delete mode 100755 external/libwally-core/tools/coverage.sh delete mode 100755 external/libwally-core/tools/swigjavapost.sh delete mode 100755 external/libwally-core/tools/travis_build.sh delete mode 100755 external/libwally-core/tools/travis_install.sh delete mode 100755 external/libwally-core/tools/uncrustify delete mode 100644 external/libwally-core/tools/uncrustify.cfg delete mode 100755 external/libwally-core/tools/wordlist_cc.py diff --git a/.gitmodules b/.gitmodules index b9188af1b..9d07a09d9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "external/libbacktrace"] path = external/libbacktrace url = https://github.com/ianlancetaylor/libbacktrace.git +[submodule "external/libwally-core"] + path = external/libwally-core + url = https://github.com/ElementsProject/libwally-core.git diff --git a/external/libwally-core b/external/libwally-core new file mode 160000 index 000000000..8e6d990b5 --- /dev/null +++ b/external/libwally-core @@ -0,0 +1 @@ +Subproject commit 8e6d990b5e62ff4d1c9bc68af29423cc98a232fa diff --git a/external/libwally-core/.gitignore b/external/libwally-core/.gitignore deleted file mode 100644 index 55cf03a2b..000000000 --- a/external/libwally-core/.gitignore +++ /dev/null @@ -1,59 +0,0 @@ -bld -src/*.pyc -src/test/*.pyc -src/test/__pycache__/ -*~ -*.class -*.gcno -*.gcda -*.o -*.lo -*.la -*.deps -*.dirstamp -*.libs -*.venv -Makefile -Makefile.in -aclocal.m4 -autom4te.cache/ -build -compile -config.guess -config.log -config.status -config.sub -configure -depcomp -dist -install-sh -libtool -ltmain.sh -missing -src/*~ -src/lcov* -src/Makefile -src/Makefile.in -src/config.h -src/config.h.in -src/stamp-h1 -src/test/Makefile -src/test/Makefile.in -src/test_clear* -src/test-suite.log -src/swig_java/swig_java_wrap.c -src/swig_java/*.java -src/swig_java/*.jar -src/swig_java/src/com/blockstream/libwally -src/swig_python/swig_python_wrap.c -src/swig_python/wallycore/__init__.py -src/swig_python/wallycore/wallycore.egg-info -tools/build-aux/m4/l*.m4 -tools/build-aux/test-driver -src/secp256k1/test-suite.log -src/secp256k1/tests.log -src/secp256k1/tests.trs -wallycore.egg-info/ -wally*.gz -wally*.sha256 -wally*.asc diff --git a/external/libwally-core/.travis.yml b/external/libwally-core/.travis.yml deleted file mode 100644 index 77952b28a..000000000 --- a/external/libwally-core/.travis.yml +++ /dev/null @@ -1,43 +0,0 @@ -git: - depth: 5 -branches: - only: - - master -language: c -sudo: required -os: - - linux - - osx -dist: trusty -compiler: - - clang - - gcc -addons: - apt: - packages: - - python - - python-dev - - python3 - - python3-dev - - swig - - gcc-multilib -matrix: - include: - - os: linux - compiler: clang - env: HOST=i686-linux-gnu - - os: linux - compiler: gcc - env: HOST=i686-linux-gnu - - compiler: gcc - os: linux - env: PYTHON_VERSION=3.4 - -before_script: - - ./tools/cleanup.sh && ./tools/autogen.sh -before_install: - - ./tools/travis_install.sh -script: - - ./tools/travis_build.sh -notifications: - email: false diff --git a/external/libwally-core/1README b/external/libwally-core/1README deleted file mode 100644 index af609d927..000000000 --- a/external/libwally-core/1README +++ /dev/null @@ -1 +0,0 @@ -Stolen from 3b025127cbf11912f8b95e7ff3c905d74e8433ce, with hmac_256 -> hmac_256_internal to avoid name clash diff --git a/external/libwally-core/INSTALL b/external/libwally-core/INSTALL deleted file mode 100644 index fbb9051ae..000000000 --- a/external/libwally-core/INSTALL +++ /dev/null @@ -1,13 +0,0 @@ - -Use the following commands to build and install the library: - -$ ./tools/autogen.sh -$ ./configure [options] -$ make -$ make install - -Note that ./configure --help can be used to determine configuration options. - -To fully clean the library, run: - -$ ./tools/cleanup.sh diff --git a/external/libwally-core/LICENSE b/external/libwally-core/LICENSE deleted file mode 100644 index c61ed391e..000000000 --- a/external/libwally-core/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Note: the modules in the src/ccan/ directory have their own licenses, but -except where noted in an individual source file, the rest of the code is -covered by the following (BSD-MIT) license: - - Copyright Jon Griffiths (Blockstream) 2016. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/external/libwally-core/Makefile.am b/external/libwally-core/Makefile.am deleted file mode 100644 index c43744058..000000000 --- a/external/libwally-core/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -ACLOCAL_AMFLAGS = -I tools/build-aux/m4 -AUTOMAKE_OPTIONS = foreign -SUBDIRS = src diff --git a/external/libwally-core/README.md b/external/libwally-core/README.md deleted file mode 100644 index df0f64b0b..000000000 --- a/external/libwally-core/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# libwally-core - -Wally is a collection of useful primitives for cryptocurrency wallets. - -Note that the library is currently pre-release and so the API may change -without notice. - -Please report bugs and submit patches to https://github.com/jgriffiths/libwally-core. - -[![Build Status](https://travis-ci.org/jgriffiths/libwally-core.svg?branch=master)](https://travis-ci.org/jgriffiths/libwally-core) - -## Platforms - -Wally currently builds on all linux and OSX platforms as well as all supported -Android NDK targets. Bindings for Python and Java are included. - -Windows support and further language bindings such as JavaScript are planned. - -## Building - -``` -$ ./tools/autogen.sh -$ ./configure -$ make -$ make check -``` - -### configure options - -- `--enable-debug`. Enables debugging information and disables compiler - optimisations (default: no). -- `--enable-export-all`. Export all functions from the wally shared library. - Ordinarily only API functions are exported. (default: no). Enable this - if you want to test the internal functions of the library or are planning - to submit patches. -- `--enable-swig-python`. Enable the [SWIG](http://www.swig.org/) Python - interface. The resulting shared library can be imported from Python using - the generated interface file `src/swig_python/wallycore/wallycore.py`. (default: no). -- `--enable-swig-java`. Enable the [SWIG](http://www.swig.org/) Java (JNI) - interface. After building, see `src/swig_java/src/com/blockstream/libwally/Wally.java` - for the Java interface definition (default: no). -- `--enable-coverage`. Enables code coverage (default: no) Note that you will - need [lcov](http://ltp.sourceforge.net/coverage/lcov.php) installed to - build with this option enabled and generate coverage reports. - -NOTE: If you wish to run the Python tests you currently need to pass - the `--enable-swig-python` option. This requirement will be removed - in a future version. - -### Recommended development configure options - -``` -$ ./configure --enable-debug --enable-export-all --enable-swig-python --enable-coverage -``` - -### Python - -For python development, you can build and install wally using: - -``` -$ python setup.py install -``` - -It is suggested you only install this way into a virtualenv while the library -is under heavy development. - -## Cleaning - -``` -$ ./tools/cleanup.sh -``` - -## Submitting patches - -Please use pull requests on github to submit. Before producing your patch you -should format your changes using [uncrustify](https://github.com/uncrustify/uncrustify.git) -version 0.60 or later. The script `./tools/uncrustify` will reformat all C -sources in the library as needed, with the currently chosen uncrustify options. - -The version of uncrustify in Debian is unfortunately out of date and buggy. If -you are using Debian this means you will need to download and build uncrustify -from source using something like: - -``` -$ git clone --depth 1 https://github.com/uncrustify/uncrustify.git -$ cd uncrustify -$ ./autogen.sh -$ ./configure -$ make -$ sudo make install -``` - -You should also make sure the existing tests pass and if possible write tests -covering any new functionality, following the existing style. - -## Generating a coverage report - -To generate an HTML coverage report, use: - -``` -$ ./tools/cleanup.sh -$ ./tools/autogen.sh -$ ./configure --enable-debug --enable-export-all --enable-swig-python --enable-swig-java --enable-coverage -$ make -$ ./tools/coverage.sh clean -$ make check -$ ./tools/coverage.sh -``` - -The coverage report can then be viewed at `src/lcov/index.html`. Patches to -increase the test coverage are welcome. diff --git a/external/libwally-core/configure.ac b/external/libwally-core/configure.ac deleted file mode 100644 index a32625bb6..000000000 --- a/external/libwally-core/configure.ac +++ /dev/null @@ -1,268 +0,0 @@ -AC_PREREQ([2.60]) -AC_INIT([libwallycore],[0.1]) -AC_CONFIG_AUX_DIR([tools/build-aux]) -AC_CONFIG_MACRO_DIR([tools/build-aux/m4]) -AC_CONFIG_SRCDIR([src/mnemonic.h]) -AC_CONFIG_HEADERS([src/config.h]) -AC_CANONICAL_HOST -AH_TOP([#ifndef LIBWALLYCORE_CONFIG_H -#define LIBWALLYCORE_CONFIG_H]) -AH_BOTTOM([#include "ccan_config.h" -#endif /*LIBWALLYCORE_CONFIG_H*/]) - -LDPATH_VAR=LD_LIBRARY_PATH -case $host_os in -*darwin*) - is_osx="yes" - LDPATH_VAR=DYLD_LIBRARY_PATH - ;; -esac -AM_CONDITIONAL([IS_OSX], [test "x$is_osx" == "xyes"]) -AC_SUBST([LDPATH_VAR]) - -AM_INIT_AUTOMAKE([foreign subdir-objects]) -LT_INIT([disable-static]) - -AC_PROG_CC - -# Prefer gccs ar/ranlib as they handle flto files properly -AC_CHECK_PROG(HAVE_GCC_AR,gcc-ar,yes,no) -if test "x$HAVE_GCC_AR" == "xyes"; then - AR=gcc-ar - AC_SUBST([AR]) -fi - -AC_CHECK_PROG(HAVE_GCC_RANLIB,gcc-ranlib,yes,no) -if test "x$HAVE_GCC_RANLIB" == "xyes"; then - RANLIB=gcc-ranlib - AC_SUBST([RANLIB]) -fi - -GNU_SED=sed -AC_CHECK_PROG(HAVE_GSED,gsed,yes,no) -if test "x$HAVE_GSED" == "xyes"; then - GNU_SED=gsed -else - if test "x$is_osx" == "xyes"; then - AC_MSG_ERROR([gsed must be available to build this library]) - fi -fi -AC_SUBST([GNU_SED]) - -# -# C facilities -# -AC_ARG_ENABLE(debug, - AS_HELP_STRING([--enable-debug],[enable debugging (default: no)]), - [debug=$enableval], [debug=no]) -AC_ARG_ENABLE(coverage, - AS_HELP_STRING([--enable-coverage],[enable code coverage (default: no)]), - [coverage=$enableval], [coverage=no]) - -CFLAGS=`echo $CFLAGS | $GNU_SED -e 's/-O2//g' | $GNU_SED -e 's/-g//g'` - -AC_C_BIGENDIAN() -AC_C_INLINE -AC_TYPE_SIZE_T -AC_TYPE_UINT64_T -AC_TYPE_UINT32_T -AC_TYPE_UINT16_T -AC_TYPE_UINT8_T - -AM_CFLAGS= -if test "x$debug" == "xyes"; then - # Make debugging easier, leave assertions in - AX_CHECK_COMPILE_FLAG([-O0], [AM_CFLAGS="$AM_CFLAGS -O0"]) - AX_CHECK_COMPILE_FLAG([-ggdb], [AM_CFLAGS="$AM_CFLAGS -ggdb"]) - AX_CHECK_LINK_FLAG([-O0], [LDFLAGS="$LDFLAGS -O0"]) - AX_CHECK_LINK_FLAG([-ggdb], [LDFLAGS="$LDFLAGS -ggdb"]) - if test "x$coverage" == "xyes"; then - AX_CHECK_COMPILE_FLAG([-fprofile-arcs -ftest-coverage], [AM_CFLAGS="$AM_CFLAGS -fprofile-arcs -ftest-coverage"]) - AX_CHECK_LINK_FLAG([-lgcov], [LDFLAGS="$LDFLAGS -lgcov"]) - fi -else - # Optimise and harden if we can - AX_CHECK_COMPILE_FLAG([-O3], [AM_CFLAGS="$AM_CFLAGS -O3"]) - AX_CHECK_COMPILE_FLAG([-D_FORTIFY_SOURCE=1], [AM_CFLAGS="$AM_CFLAGS -D_FORTIFY_SOURCE=1"]) - AX_CHECK_COMPILE_FLAG([-fstack-protector-strong], [AM_CFLAGS="$AM_CFLAGS -fstack-protector-strong"]) - AX_CHECK_COMPILE_FLAG([-DNDEBUG=1], [AM_CFLAGS="$AM_CFLAGS -DNDEBUG=1"]) - AX_CHECK_LINK_FLAG([-O3], [LDFLAGS="$LDFLAGS -O3"]) - AX_CHECK_LINK_FLAG([-flto], [LDFLAGS="$LDFLAGS -flto"]) - AX_CHECK_LINK_FLAG([-flto], [AM_CFLAGS="$AM_CFLAGS -flto"]) - AX_CHECK_LINK_FLAG([-Wl,-z,relro], [LDFLAGS="$LDFLAGS -Wl,-z,relro"]) -fi - -# -flax-vector-conversions is needed for our arm assembly -AX_CHECK_COMPILE_FLAG([-flax-vector-conversions], [AM_CFLAGS="$AM_CFLAGS -flax-vector-conversions"]) - -AX_CHECK_COMPILE_FLAG([-Wall], [AM_CFLAGS="$AM_CFLAGS -Wall"]) -AX_CHECK_COMPILE_FLAG([-Wextra], [AM_CFLAGS="$AM_CFLAGS -Wextra"]) -AX_CHECK_COMPILE_FLAG([-Wpedantic], [AM_CFLAGS="$AM_CFLAGS -Wpedantic"]) -AX_CHECK_COMPILE_FLAG([-Wcast-align], [AM_CFLAGS="$AM_CFLAGS -Wcast-align"]) -AX_CHECK_COMPILE_FLAG([-Wnested-externs], [AM_CFLAGS="$AM_CFLAGS -Wnested-externs"]) -AX_CHECK_COMPILE_FLAG([-Wshadow], [AM_CFLAGS="$AM_CFLAGS -Wshadow"]) -AX_CHECK_COMPILE_FLAG([-Wstrict-prototypes], [AM_CFLAGS="$AM_CFLAGS -Wstrict-prototypes"]) -AX_CHECK_COMPILE_FLAG([-Wno-unused-function], [AM_CFLAGS="$AM_CFLAGS -Wno-unused-function"]) -AX_CHECK_COMPILE_FLAG([-Wno-long-long], [AM_CFLAGS="$AM_CFLAGS -Wno-long-long"]) -AX_CHECK_COMPILE_FLAG([-Wno-overlength-strings], [AM_CFLAGS="$AM_CFLAGS -Wno-overlength-strings"]) -AX_CHECK_COMPILE_FLAG([-Wformat], [AM_CFLAGS="$AM_CFLAGS -Wformat"]) -AX_CHECK_COMPILE_FLAG([-Wformat-security], [AM_CFLAGS="$AM_CFLAGS -Wformat-security"]) -AX_CHECK_COMPILE_FLAG([-Wformat-nonliteral], [AM_CFLAGS="$AM_CFLAGS -Wformat-nonliteral"]) -AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing], [NOALIAS_CFLAGS="-fno-strict-aliasing"]) -AC_SUBST([NOALIAS_CFLAGS]) - -# Under OSX the compiler accepts this flag but the linker then fails. -if test "x$is_osx" != "xyes"; then - AX_CHECK_COMPILE_FLAG([-Wl,--whole-archive], [whole_archive=yes]) -fi - -# SWIG versions vary in generated code quality; skip warnings -SWIG_WARN_CFLAGS="-fno-strict-aliasing" -AX_CHECK_COMPILE_FLAG([-Wno-shadow], [SWIG_WARN_CFLAGS="$SWIG_WARN_CFLAGS -Wno-shadow"]) -AX_CHECK_COMPILE_FLAG([-Wno-self-assign], [SWIG_WARN_CFLAGS="$SWIG_WARN_CFLAGS -Wno-self-assign"]) -AX_CHECK_COMPILE_FLAG([-Wno-missing-field-initializers], [SWIG_WARN_CFLAGS="$SWIG_WARN_CFLAGS -Wno-missing-field-initializers"]) -AC_SUBST([SWIG_WARN_CFLAGS]) - -AC_ARG_ENABLE(export-all, - AS_HELP_STRING([--enable-export-all],[export all functions (for testing, default: no)]), - [export_all=$enableval], [export_all=no]) -AM_CONDITIONAL([EXPORT_ALL], [test "x$export_all" == "xyes"]) - -if test "x$export_all" != "xyes"; then - AX_CHECK_COMPILE_FLAG([-fvisibility=hidden], [AM_CFLAGS="$AM_CFLAGS -fvisibility=hidden"]) -fi - -# Assume we have no unaligned access if cross-compiling -AC_RUN_IFELSE([AC_LANG_SOURCE([int main(void){static int a[2];return *((int*)(((char*)a)+1)) != 0;}])], - [AC_DEFINE([HAVE_UNALIGNED_ACCESS], 1, [Define if we have unaligned access])],,[foo=1]) - -if test "x$is_osx" != "xyes"; then - # Assume we are using gcc (i.e. have this attribute) if cross-compiling - AC_COMPILE_IFELSE([AC_LANG_SOURCE([extern int foo(int) __attribute__((weak)); int main(void){return 0;}])], - [AC_DEFINE([HAVE_ATTRIBUTE_WEAK], 1, [Define if we have __attribute__((weak))])]) -fi - -AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]],[[mmap(0,0,0,0,0,0)]])], - [AC_DEFINE(HAVE_MMAP, 1, [Define if we have mmap])]) - -AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]],[[return posix_memalign(NULL,0,0)]])], - [AC_DEFINE(HAVE_POSIX_MEMALIGN, 1, [Define if we have posix_memalign])]) - -AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]],[[int x[1]; memset_s(x, 1, 0, 1)]])], - [AC_DEFINE(HAVE_MEMSET_S, 1, [Define if we have memset_s])]) - -AC_CHECK_HEADERS([byteswap.h]) - -AX_PTHREAD([ac_have_pthread=yes], [ac_have_pthread=no]) -AM_CONDITIONAL([USE_PTHREAD], [test "x$ac_have_pthread" == "xyes"]) -if test "x$ac_have_pthread" == "xyes"; then - AC_DEFINE([HAVE_PTHREAD], 1, [Define if we have pthread support]) -fi - -# -# libsecp256k1 -# -# FIXME: This is needed to force libtool to use all object files from secp. -# We can only build secp properly by recursively invoking -# configure/make, and can't include it as a noinst_ library. Libtool -# assumes that such libraries will be installed along with our library -# target and so won't force all object files in the library to be -# included in ours - despite the fact that we are making a shared -# library and linking to a static one. This is broken and we work -# around it by hacking the whole-archive flags into the _LDADD variable -# for wallycore. -# Because automake tries to police its users very strictly and fails -# hard when flags are passed in this way, we have to substitute the -# flags here. -# Because libtool both intercepts -Wl and arbitrarily re-orders its -# command line inputs, we have to concoct a single expression to -# enforce linking that cannot be split, hence the below expression. -LIBADD_SECP256K1="secp256k1/.libs/libsecp256k1.a" -if test "x$whole_archive" == "xyes"; then - LIBADD_SECP256K1="-Wl,--whole-archive,secp256k1/.libs/libsecp256k1.a,--no-whole-archive" -fi -AC_SUBST([LIBADD_SECP256K1]) - -# -# Python facilities -# -AX_PYTHON_DEVEL([>= '2.7.0']) -AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != ""]) -AM_CONDITIONAL([RUN_PYTHON_TESTS], [test "x$pythonexists" == "xyes"]) - -# -# SWIG -# -AC_PROG_SWIG - -AC_ARG_ENABLE(swig-python, - AS_HELP_STRING([--enable-swig-python],[enable the SWIG python interface (default: no)]), - [swig_python=$enableval], [swig_python=no]) -AM_CONDITIONAL([USE_SWIG_PYTHON], [test "x$swig_python" == "xyes"]) - -if test "x$swig_python" == "xyes"; then - if test "x$pythonexists" != "xyes"; then - AC_MSG_FAILURE([ERROR: No usable python was found for swig-python]) - fi - SWIG_PYTHON - AX_CHECK_COMPILE_FLAG([-DSWIG_PYTHON_BUILD=1], [AM_CFLAGS="$AM_CFLAGS -DSWIG_PYTHON_BUILD=1"]) -fi - -AC_ARG_ENABLE(swig-java, - AS_HELP_STRING([--enable-swig-java],[enable the SWIG java (JNI) interface (default: no)]), - [swig_java=$enableval], [swig_java=no]) -AM_CONDITIONAL([USE_SWIG_JAVA], [test "x$swig_java" == "xyes"]) - -if test "x$swig_java" == "xyes"; then - AX_JNI_INCLUDE_DIR - for JNI_DIR in $JNI_INCLUDE_DIRS; do - SWIG_JAVA_CPPFLAGS="$SWIG_JAVA_CPPFLAGS -I$JNI_DIR" - done - SWIG_JAVA_OPT="-java" - AC_SUBST([SWIG_JAVA_CPPFLAGS]) - AC_SUBST([SWIG_JAVA_OPT]) - AX_CHECK_COMPILE_FLAG([-DSWIG_JAVA_BUILD=1], [AM_CFLAGS="$AM_CFLAGS -DSWIG_JAVA_BUILD=1"]) -fi - -if test "x$JAVA_HOME" != "x"; then - JAVA="$JAVA_HOME/bin/java" - AC_SUBST([JAVA]) - JAVAC="$JAVA_HOME/bin/javac" - AC_SUBST([JAVAC]) - JAR="$JAVA_HOME/bin/jar" - AC_SUBST([JAR]) -else - AC_CHECK_PROGS(JAVA, [java]) - AC_CHECK_PROGS(JAVAC, [javac]) - AC_CHECK_PROGS(JAR, [jar]) -fi -AM_CONDITIONAL([HAVE_JAVA], [test "x$JAVA" != "x"]) -AM_CONDITIONAL([HAVE_JAVAC], [test "x$JAVAC" != "x"]) -if test "x$swig_java" == "xyes"; then - if test "x$JAVAC" != "x"; then - if test "x$JAVA" != "x"; then - # Only run tests if we have java-swig, compiler and interpreter - run_java_tests="yes" - fi - fi -fi -AM_CONDITIONAL([RUN_JAVA_TESTS], [test "x$run_java_tests" != "x"]) -JAVAC_TARGET=1.7 -AC_SUBST([JAVAC_TARGET]) - -AC_SUBST([AM_CFLAGS]) - -AC_CONFIG_FILES([ - Makefile - src/Makefile -]) - -secp_jni="--disable-jni" -if test "x$swig_java" == "xyes"; then - secp_jni="--enable-jni" -fi -ac_configure_args="${ac_configure_args} --disable-shared ${secp_jni} --with-pic --with-bignum=no --enable-experimental --enable-module-schnorr --enable-module-ecdh --enable-openssl-tests=no --disable-dependency-tracking" -AC_CONFIG_SUBDIRS([src/secp256k1]) - - -AC_OUTPUT diff --git a/external/libwally-core/include/wally_bip32.h b/external/libwally-core/include/wally_bip32.h deleted file mode 100644 index 6b749c831..000000000 --- a/external/libwally-core/include/wally_bip32.h +++ /dev/null @@ -1,226 +0,0 @@ -#ifndef LIBWALLY_CORE_BIP32_H -#define LIBWALLY_CORE_BIP32_H - -#include "wally_core.h" - -#include - -/** The required lengths of entropy for @bip32_key_from_seed */ -#define BIP32_ENTROPY_LEN_128 16 -#define BIP32_ENTROPY_LEN_256 32 -#define BIP32_ENTROPY_LEN_512 64 - -/** Length of an ext_key serialized using BIP32 format */ -#define BIP32_SERIALIZED_LEN 78 - -/** Child number of the first hardened child */ -#define BIP32_INITIAL_HARDENED_CHILD 0x80000000 - -/** Indicate that we want to derive a private key in @bip32_key_from_parent */ -#define BIP32_FLAG_KEY_PRIVATE 0x0 -/** Indicate that we want to derive a public key in @bip32_key_from_parent */ -#define BIP32_FLAG_KEY_PUBLIC 0x1 -/** Indicate that we want to skip hash calculation when deriving a key in @bip32_key_from_parent */ -#define BIP32_FLAG_SKIP_HASH 0x2 - -/** Version codes for extended keys */ -#define BIP32_VER_MAIN_PUBLIC 0x0488B21E -#define BIP32_VER_MAIN_PRIVATE 0x0488ADE4 -#define BIP32_VER_TEST_PUBLIC 0x043587CF -#define BIP32_VER_TEST_PRIVATE 0x04358394 - -#ifdef SWIG -struct ext_key; -#else -/** An extended key */ -struct ext_key { - /** The chain code for this key */ - unsigned char chain_code[32]; - /** The Hash160 of this keys parent */ - unsigned char parent160[20]; - /** The depth of this key */ - uint8_t depth; - unsigned char pad1[10]; - /** The private key with prefix byte 0 */ - unsigned char priv_key[33]; - /** The child number of the parent key that this key represents */ - uint32_t child_num; - /** The Hash160 of this key */ - unsigned char hash160[20]; - /** The child number of the parent key that this key represents */ - uint32_t version; - unsigned char pad2[3]; - /** The public key with prefix byte 0x2 or 0x3 */ - unsigned char pub_key[33]; -}; -#endif /* SWIG */ - -#ifndef SWIG_PYTHON -/** - * Free a key allocated by @bip32_key_from_seed_alloc - * or @bip32_key_unserialize_alloc. - * - * @key_in Key to free. - */ -WALLY_CORE_API int bip32_key_free( - const struct ext_key *key_in); -#endif /* SWIG_PYTHON */ - -/** - */ -WALLY_CORE_API int bip32_key_init_alloc( - uint32_t version, - uint32_t depth, - uint32_t child_num, - const unsigned char *chain_code, - size_t chain_code_len, - const unsigned char *pub_key, - size_t pub_key_len, - const unsigned char *priv_key, - size_t priv_key_len, - const unsigned char *hash160, - size_t hash160_len, - const unsigned char *parent160, - size_t parent160_len, - const struct ext_key **output); - -#ifndef SWIG -/** - * Create a new master extended key from entropy. - * - * This creates a new master key, i.e. the root of a new HD tree. - * @bytes_in Entropy to use. - * @len_in Size of @bytes_in in bytes. Must be one of @BIP32_ENTROPY_LEN_128, - * @BIP32_ENTROPY_LEN_256 or @BIP32_ENTROPY_LEN_512. - * @version Either @BIP32_VER_MAIN_PRIVATE or @BIP32_VER_TEST_PRIVATE, - * indicating mainnet or testnet/regtest respectively. - * @flags Either BIP32_FLAG_SKIP_HASH to skip hash160 calculation, or 0. - * @output Destination for the resulting master extended key. - * - * The entropy passed in may produce an invalid key. If this happens, - * WALLY_ERROR will be returned and the caller should retry with - * new entropy. - */ -WALLY_CORE_API int bip32_key_from_seed( - const unsigned char *bytes_in, - size_t len_in, - uint32_t version, - uint32_t flags, - struct ext_key *output); -#endif - -/** - * As per @bip32_key_from_seed, but allocates the key. - * - * @note The returned key should be freed with @bip32_key_free. - */ -WALLY_CORE_API int bip32_key_from_seed_alloc( - const unsigned char *bytes_in, - size_t len_in, - uint32_t version, - uint32_t flags, - const struct ext_key **output); - -/** - * Serialize an extended key to memory using BIP32 format. - * - * @key_in The extended key to serialize. - * @flags BIP32_FLAG_KEY_ Flags indicating which key to serialize. You can not - * serialize a private extended key from a public extended key. - * @bytes_out Destination for the serialized key. - * @len Size of @bytes_out in bytes. Must be @BIP32_SERIALIZED_LEN. - */ -WALLY_CORE_API int bip32_key_serialize( - const struct ext_key *key_in, - uint32_t flags, - unsigned char *bytes_out, - size_t len); - - -#ifndef SWIG -/** - * Un-serialize an extended key from memory. - * - * @bytes_in Storage holding the serialized key. - * @len_in Size of @bytes_in in bytes. Must be @BIP32_SERIALIZED_LEN. - * @output Destination for the resulting extended key. - */ -WALLY_CORE_API int bip32_key_unserialize( - const unsigned char *bytes_in, - size_t len_in, - struct ext_key *output); -#endif - -/** - * As per @bip32_key_unserialize, but allocates the key. - * - * @note The returned key should be freed with @bip32_key_free. - */ -WALLY_CORE_API int bip32_key_unserialize_alloc( - const unsigned char *bytes_in, - size_t len_in, - const struct ext_key **output); - -#ifndef SWIG -/** - * Create a new child extended key from a parent extended key. - * - * @key_in The parent extended key. - * @child_num The child number to create. Numbers greater - * than or equal to @BIP32_INITIAL_HARDENED_CHILD represent - * hardened keys that cannot be created from public parent - * extended keys. - * @flags BIP32_FLAG_KEY_ Flags indicating the type of derivation wanted. - * You can not derive a private child extended key from a public - * parent extended key. - * @output Destination for the resulting child extended key. - */ -WALLY_CORE_API int bip32_key_from_parent( - const struct ext_key *key_in, - uint32_t child_num, - uint32_t flags, - struct ext_key *output); -#endif - -/** - * As per @bip32_key_from_parent, but allocates the key. - * - * @note The returned key should be freed with @bip32_key_free. - */ -WALLY_CORE_API int bip32_key_from_parent_alloc( - const struct ext_key *key_in, - uint32_t child_num, - uint32_t flags, - const struct ext_key **output); - -#endif /* LIBWALLY_CORE_BIP32_H */ - -#ifndef SWIG -/** - * Create a new child extended key from a parent extended key and a path. - * - * @key_in The parent extended key. - * @child_path_in The path of child numbers to create. - * @child_path_len The number of child numbers in @child_path_in. - * @flags BIP32_KEY_ Flags indicating the type of derivation wanted. - * @output Destination for the resulting child extended key. - */ -WALLY_CORE_API int bip32_key_from_parent_path( - const struct ext_key *key_in, - const uint32_t *child_num_in, - size_t child_num_len, - uint32_t flags, - struct ext_key *output); -#endif - -/** - * As per @bip32_key_from_parent_path, but allocates the key. - * - * @note The returned key should be freed with @bip32_key_free. - */ -WALLY_CORE_API int bip32_key_from_parent_path_alloc( - const struct ext_key *key_in, - const uint32_t *child_num_in, - size_t child_num_len, - uint32_t flags, - const struct ext_key **output); diff --git a/external/libwally-core/include/wally_bip38.h b/external/libwally-core/include/wally_bip38.h deleted file mode 100644 index 33459e754..000000000 --- a/external/libwally-core/include/wally_bip38.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef LIBWALLY_CORE_BIP38_H -#define LIBWALLY_CORE_BIP38_H - -#include "wally_core.h" - -#include - -/** Flags for BIP38 conversion. The first 8 bits are reserved for the network */ -#define BIP38_KEY_MAINNET 0 /** Address is for main network */ -#define BIP38_KEY_TESTNET 7 /** Address is for test network */ -#define BIP38_KEY_COMPRESSED 256 /** Public key is compressed */ -#define BIP38_KEY_EC_MULT 512 /** EC-Multiplied key (FIXME: Not implemented) */ -#define BIP38_KEY_QUICK_CHECK 1024 /** Check structure only (no password required) */ -#define BIP38_KEY_RAW_MODE 2048 /** Treat bytes in as raw data */ -#define BIP38_KEY_SWAP_ORDER 4096 /** Hash comes after encrypted key */ - -#define BIP38_SERIALIZED_LEN 39 /** Length of a raw BIP38 key in bytes */ - - -/** - * Encode a private key in raw BIP 38 address format. - * - * @bytes_in Private key to use. - * @len_in Size of @bytes_in in bytes. Must be 32. - * @pass Password for the encoded private key. - * @pass_len Length of @pass in bytes. - * @flags BIP38_KEY_ flags indicating desired behaviour. - * @bytes_out Destination for the resulting raw BIP38 address. - * @len Size of @bytes_out in bytes. Must be @BIP38_SERIALIZED_LEN. - */ -WALLY_CORE_API int bip38_raw_from_private_key( - const unsigned char *bytes_in, - size_t len_in, - const unsigned char *pass, - size_t pass_len, - uint32_t flags, - unsigned char *bytes_out, - size_t len); - -/** - * Encode a private key in BIP 38 address format. - * - * @bytes_in Private key to use. - * @len_in Size of @bytes_in in bytes. Must be 32. - * @pass Password for the encoded private key. - * @pass_len Length of @pass in bytes. - * @flags BIP38_KEY_ flags indicating desired behaviour. - * @output Destination for the resulting BIP38 address. - */ -WALLY_CORE_API int bip38_from_private_key( - const unsigned char *bytes_in, - size_t len_in, - const unsigned char *pass, - size_t pass_len, - uint32_t flags, - char **output); - -/** - * Decode a raw BIP 38 address to a private key. - * - * @bytes_in Raw BIP 38 address to decode. - * @len_in Size of @bytes_in in bytes. Must be @BIP38_SERIALIZED_LEN. - * @pass Password for the encoded private key. - * @pass_len Length of @pass in bytes. - * @flags BIP38_KEY_ flags indicating desired behaviour. - * @bytes_out Destination for the resulting private key. - * @len Size of @bytes_out in bytes. Must be 32. - */ -WALLY_CORE_API int bip38_raw_to_private_key( - const unsigned char *bytes_in, - size_t len_in, - const unsigned char *pass, - size_t pass_len, - uint32_t flags, - unsigned char *bytes_out, - size_t len); - -/** - * Decode a BIP 38 address to a private key. - * - * @bip38 BIP 38 address to decode. - * @pass Password for the encoded private key. - * @pass_len Length of @pass in bytes. - * @flags BIP38_KEY_ flags indicating desired behaviour. - * @bytes_out Destination for the resulting private key. - * @len Size of @bytes_out in bytes. Must be 32. - */ -WALLY_CORE_API int bip38_to_private_key( - const char *bip38, - const unsigned char *pass, - size_t pass_len, - uint32_t flags, - unsigned char *bytes_out, - size_t len); - -#endif /* LIBWALLY_CORE_BIP38_H */ diff --git a/external/libwally-core/include/wally_bip39.h b/external/libwally-core/include/wally_bip39.h deleted file mode 100644 index d0ee6c021..000000000 --- a/external/libwally-core/include/wally_bip39.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef LIBWALLY_CORE_BIP39_H -#define LIBWALLY_CORE_BIP39_H - -#include "wally_core.h" - -#include - -struct words; - -/** Valid entropy lengths */ -#define BIP39_ENTROPY_LEN_128 16 -#define BIP39_ENTROPY_LEN_160 20 -#define BIP39_ENTROPY_LEN_192 24 -#define BIP39_ENTROPY_LEN_224 28 -#define BIP39_ENTROPY_LEN_256 32 -#define BIP39_ENTROPY_LEN_288 36 -#define BIP39_ENTROPY_LEN_320 40 - -/** The required size of the output buffer for @bip39_mnemonic_to_seed */ -#define BIP39_SEED_LEN_512 64 - -/** The number of words in a BIP39 compliant wordlist */ -#define BIP39_WORDLIST_LEN 2048 - -/** - * Get the list of default supported languages. - * - * The string returned should be freed using @wally_free_string. - */ -WALLY_CORE_API int bip39_get_languages( - char **output); - -/** - * Get the default word list for language @lang. - * - * If @lang is NULL or not found the default English list is returned. - * - * The returned structure should not be freed. - */ -WALLY_CORE_API int bip39_get_wordlist( - const char *lang, - const struct words **output); - -/** - * Get the 'index'th word from a word list. - * - * @w Word list to use. Pass NULL to use the default English list. - * @index The 0-based index of the word in @w. - * @output Destination for the resulting word. - * - * The string returned should be freed using @wally_free_string. - */ -WALLY_CORE_API int bip39_get_word( - const struct words *w, - size_t index, - char **output); - -/** - * Generate a mnemonic sentence from the entropy in @bytes_in. - * @w Word list to use. Pass NULL to use the default English list. - * @bytes_in: Entropy to convert. - * @len_in: The length of @bytes_in in bytes. - * @output Destination for the resulting mnemonic sentence. - * - * The string returned should be freed using @wally_free_string. - */ -WALLY_CORE_API int bip39_mnemonic_from_bytes( - const struct words *w, - const unsigned char *bytes_in, - size_t len_in, - char **output); - -/** - * Convert a mnemonic sentence into entropy at @bytes_out. - * @w Word list to use. Pass NULL to use the default English list. - * @mnemonic Mnemonic to convert. - * @bytes_out: Where to store the resulting entropy. - * @len: The length of @bytes_out in bytes. - * @written: Destination for the number of bytes written to @bytes_out. - */ -WALLY_CORE_API int bip39_mnemonic_to_bytes( - const struct words *w, - const char *mnemonic, - unsigned char *bytes_out, - size_t len, - size_t *written); - -/** - * Validate the checksum embedded in the mnemonic sentence @mnemonic. - * @w Word list to use. Pass NULL to use the default English list. - * @mnemonic Mnemonic to validate. - */ -WALLY_CORE_API int bip39_mnemonic_validate( - const struct words *w, - const char *mnemonic); - -/** - * Convert a mnemonic into a binary seed. - * @mnemonic Mnemonic to convert. - * @password Mnemonic password or NULL if no password is needed. - * @bytes_out The destination for the binary seed. - * @len The length of @bytes_out in bytes. Currently This must - * be @BIP39_SEED_LEN_512. - * @written: Destination for the number of bytes written to @bytes_out. - */ -WALLY_CORE_API int bip39_mnemonic_to_seed( - const char *mnemonic, - const char *password, - unsigned char *bytes_out, - size_t len, - size_t *written); - -#endif /* LIBWALLY_CORE_BIP39_H */ diff --git a/external/libwally-core/include/wally_core.h b/external/libwally-core/include/wally_core.h deleted file mode 100644 index 8af88a5ab..000000000 --- a/external/libwally-core/include/wally_core.h +++ /dev/null @@ -1,206 +0,0 @@ -#ifndef WALLY_CORE_H -#define WALLY_CORE_H - -#include -#include - -#ifndef WALLY_CORE_API -# if defined(_WIN32) -# ifdef WALLY_CORE_BUILD -# define WALLY_CORE_API __declspec(dllexport) -# else -# define WALLY_CORE_API -# endif -# elif defined(__GNUC__) && defined(WALLY_CORE_BUILD) -# define WALLY_CORE_API __attribute__ ((visibility ("default"))) -# else -# define WALLY_CORE_API -# endif -#endif - -/** Return codes */ -#define WALLY_OK 0 /** Success */ -#define WALLY_ERROR -1 /** General error */ -#define WALLY_EINVAL -2 /** Invalid argument */ -#define WALLY_ENOMEM -3 /** malloc() failed */ - -/** - * Securely wipe memory. - * - * @bytes_in Memory to wipe - * @len_in Size of @bytes_in in bytes. - */ -WALLY_CORE_API int wally_bzero( - void *bytes, - size_t len_in); - -/** - * Securely wipe and then free a string allocted by the library. - * - * @str String to free (must be NUL terminated UTF-8). - */ -WALLY_CORE_API int wally_free_string( - char *str); - -/** Length of entropy required for @wally_randomize_context */ -#define WALLY_SECP_RANDOMISE_LEN 32 - -/** - * Provide entropy to randomize the libraries internal secp256k1 context. - * - * @bytes_in Entropy to use. - * @len_in Size of @bytes_in in bytes. Must be @WALLY_SECP_RANDOMISE_LEN. - * - * Random data is used in libsecp256k1 to blind the data being processed, to - * make side channel attacks more difficult. libwallycore uses a single - * internal context for secp functions that is not randomized at run time. - * The caller should call this function before using any functions that rely on - * secp (anything using public/private keys). - */ -WALLY_CORE_API int wally_secp_randomize( - const unsigned char *bytes_in, - size_t len_in); - -/** - * Convert bytes to a (lower-case) hexadecimal string. - * - * @bytes_in Bytes to convert. - * @len_in Size of @bytes_in in bytes. - * @output Destination for the resulting hexadecimal string. - * - * The string returned should be freed using @wally_free_string. - */ -WALLY_CORE_API int wally_hex_from_bytes( - const unsigned char *bytes_in, - size_t len_in, - char **output); - -/** - * Convert a hexadecimal string to bytes. - * - * @hex String to convert. - * @bytes_out: Where to store the resulting bytes. - * @len: The length of @bytes_out in bytes. - * @written: Destination for the number of bytes written to @bytes_out. - */ -WALLY_CORE_API int wally_hex_to_bytes( - const char *hex, - unsigned char *bytes_out, - size_t len, - size_t *written); - -/** For @wally_base58_from_bytes, indicates that a checksum should - * be generated. For @wally_base58_to_bytes, indicates that the - * embedded checksum should be validated and stripped off the returned - * bytes. - **/ -#define BASE58_FLAG_CHECKSUM 0x1 - -/** The number of extra bytes required to hold a base58 checksum */ -#define BASE58_CHECKSUM_LEN 4 - -/** - * Create a base 58 encoded string representing binary data. - * - * @bytes_in: Binary data to convert. - * @len_in: The length of @bytes_in in bytes. - * @flags: Pass @BASE58_FLAG_CHECKSUM if @bytes_in should have a - * checksum calculated and appended before converting to base 58. - * @output Destination for the base 58 encoded string representing @bytes_in. - * The string returned should be freed using @wally_free_string. - */ -WALLY_CORE_API int wally_base58_from_bytes( - const unsigned char *bytes_in, - size_t len_in, - uint32_t flags, - char **output); - -/** - * Decode a base 58 encoded string back into into binary data. - * - * @str_in: Base 58 encoded string to decode. - * @flags: Pass @BASE58_FLAG_CHECKSUM if @bytes_out should have a - * checksum validated and removed before returning. In this case, @len - * must contain an extra @BASE58_CHECKSUM_LEN bytes to calculate the - * checksum into. The returned length will not include the checksum. - * @bytes_out: Destination for converted binary data. - * @len: The length of @bytes_out in bytes. - * @written: Destination for the length of the decoded bytes. - * - * If the function succeeds, you must check @written. If it is greater - * than @len then no data has been written and the function should be retried - * with a buffer of at least @written bytes in size. - */ -WALLY_CORE_API int wally_base58_to_bytes( - const char *str_in, - uint32_t flags, - unsigned char *bytes_out, - size_t len, - size_t *written); - -/** - * Return the length of a base58 encoded string once decoded into bytes. - * - * @str_in: Base 58 encoded string to find the length of. - * @written: Destination for the length of the decoded bytes. - * - * Returns the exact number of bytes that would be required to store @str_in - * as decoded binary, including any embedded checksum. If the string contains - * invalid characters then WALLY_EINVAL is returned. Note that no checksum - * validation takes place. - * - * In the worst case (an all zero buffer, represented by a string of '1' - * characters), this function will return strlen(@str_in). You can therefore - * safely use the length of @str_in as a buffer size to avoid calling this - * function in most cases. - */ -WALLY_CORE_API int wally_base58_get_length( - const char *str_in, - size_t *written); - - -#ifndef SWIG -/** The type of an overridable function to allocate memory */ -typedef void *(*wally_malloc_t)( - size_t size); - -/** The type of an overridable function to free memory */ -typedef void (*wally_free_t)( - void *ptr); - -/** The type of an overridable function to generate an EC nonce */ -typedef int (*wally_ec_nonce_t)( - unsigned char *nonce32, - const unsigned char *msg32, - const unsigned char *key32, - const unsigned char *algo16, - void *data, - unsigned int attempt - ); - -/** Structure holding function pointers for overridable wally operations */ -struct wally_operations { - wally_malloc_t malloc_fn; - wally_free_t free_fn; - wally_ec_nonce_t ec_nonce_fn; -}; - -/** - * Fetch the current overridable operations used by wally. - * - * @output: Destination for the overridable operations. - */ -WALLY_CORE_API int wally_get_operations( - struct wally_operations *output); - -/** - * Set the current overridable operations used by wally. - * - * @ops: The overridable operations to set. - */ -WALLY_CORE_API int wally_set_operations( - const struct wally_operations *ops); - -#endif /* SWIG */ - -#endif /* WALLY_CORE_H */ diff --git a/external/libwally-core/include/wally_crypto.h b/external/libwally-core/include/wally_crypto.h deleted file mode 100644 index ca152af43..000000000 --- a/external/libwally-core/include/wally_crypto.h +++ /dev/null @@ -1,442 +0,0 @@ -#ifndef LIBWALLY_CORE_CRYPTO_H -#define LIBWALLY_CORE_CRYPTO_H - -#include "wally_core.h" - -#include -#include - -/** - * Derive a pseudorandom key from inputs using an expensive application - * of HMAC SHA-256. - * - * @pass: Password to derive from. - * @pass_len: Length of @pass in bytes. - * @salt: Salt to derive from. - * @salt_len: Length of @salt in bytes. - * @cost: The cost of the function. The larger this number, the - * longer the key will take to derive. - * @block_size: The size of memory blocks required. - * @parallelism: Parallelism factor. - * @bytes_out: Destination for the derived pseudorandom key. - * @len: The length of @bytes_out in bytes. - */ -WALLY_CORE_API int wally_scrypt( - const unsigned char *pass, - size_t pass_len, - const unsigned char *salt, - size_t salt_len, - uint32_t cost, - uint32_t block_size, - uint32_t parallelism, - unsigned char *bytes_out, - size_t len); - - -#define AES_BLOCK_LEN 16 /** Length of AES encrypted blocks */ - -#define AES_KEY_LEN_128 16 /** AES-128 Key length */ -#define AES_KEY_LEN_192 24 /** AES-192 Key length */ -#define AES_KEY_LEN_256 32 /** AES-256 Key length */ - -#define AES_FLAG_ENCRYPT 1 /** Encrypt */ -#define AES_FLAG_DECRYPT 2 /** Decrypt */ - -/** - * Encrypt/decrypt data using AES (ECB mode, no padding). - * - * @key: Key material for initialisation. - * @key_len: Length of @key in bytes. Must be an AES_KEY_LEN_ constant. - * @bytes_in: Bytes to encrypt/decrypt. - * @len_in: Length of @bytes_in in bytes. Must be a multiple of @AES_BLOCK_LEN. - * @flags: AES_FLAG_ constants indicating the desired behaviour. - * @bytes_out: Destination for the encrypted/decrypted data. - * @len: The length of @bytes_out in bytes. Must be a multiple of @AES_BLOCK_LEN. - */ -WALLY_CORE_API int wally_aes( - const unsigned char *key, - size_t key_len, - const unsigned char *bytes_in, - size_t len_in, - uint32_t flags, - unsigned char *bytes_out, - size_t len); - -/** - * Encrypt/decrypt data using AES (CBC mode). - * - * @key: Key material for initialisation. - * @key_len: Length of @key in bytes. Must be an AES_KEY_LEN_ constant. - * @iv: Initialisation vector. - * @iv_len: Length of @iv in bytes. Must be @AES_BLOCK_LEN. - * @bytes_in: Bytes to encrypt/decrypt. - * @len_in: Length of @bytes_in in bytes. Must be a multiple of @AES_BLOCK_LEN. - * @flags: AES_FLAG_ constants indicating the desired behaviour. - * @bytes_out: Destination for the encrypted/decrypted data. - * @len: The length of @bytes_out in bytes. Must be a multiple of @AES_BLOCK_LEN. - * @written: Destination for the number of bytes written to @bytes_out. - * - * Defaults to PKCS#7 padding. - */ -WALLY_CORE_API int wally_aes_cbc( - const unsigned char *key, - size_t key_len, - const unsigned char *iv, - size_t iv_len, - const unsigned char *bytes_in, - size_t len_in, - uint32_t flags, - unsigned char *bytes_out, - size_t len, - size_t *written); - - -/** Output length for @wally_sha256 */ -#define SHA256_LEN 32 - -/** Output length for @wally_sha512 */ -#define SHA512_LEN 64 - -/** - * SHA-256(m) - * - * @bytes_in: The message to hash - * @len_in: The length of @bytes_in in bytes. - * @bytes_out: Destination for the resulting hash. - * @len: The length of @bytes_out in bytes. Must be @SHA256_LEN. - */ -WALLY_CORE_API int wally_sha256( - const unsigned char *bytes_in, - size_t len_in, - unsigned char *bytes_out, - size_t len); - -/** - * SHA-256(SHA-256(m)) (double SHA-256) - * - * @bytes_in: The message to hash - * @len_in: The length of @bytes_in in bytes. - * @bytes_out: Destination for the resulting hash. - * @len: The length of @bytes_out in bytes. Must be @SHA256_LEN. - */ -WALLY_CORE_API int wally_sha256d( - const unsigned char *bytes_in, - size_t len_in, - unsigned char *bytes_out, - size_t len); - -/** - * SHA-512(m) - * - * @bytes_in: The message to hash - * @len_in: The length of @bytes_in in bytes. - * @bytes_out: Destination for the resulting hash. - * @len: The length of @bytes_out in bytes. Must be @SHA512_LEN. - */ -WALLY_CORE_API int wally_sha512( - const unsigned char *bytes_in, - size_t len_in, - unsigned char *bytes_out, - size_t len); - -/** Output length for @wally_hash160 */ -#define HASH160_LEN 20 - -/** - * RIPEMD-160(SHA-256(m)) - * - * @bytes_in: The message to hash - * @len_in: The length of @bytes_in in bytes. - * @bytes_out: Destination for the resulting hash. - * @len: The length of @bytes_out in bytes. Must be @HASH160_LEN. - */ -WALLY_CORE_API int wally_hash160( - const unsigned char *bytes_in, - size_t len_in, - unsigned char *bytes_out, - size_t len); - - -/** Output length for @wally_hmac_sha256 */ -#define HMAC_SHA256_LEN 32 - -/** Output length for @wally_hmac_sha512 */ -#define HMAC_SHA512_LEN 64 - -/** - * Compute an HMAC using SHA-256 - * - * @key: The key for the hash - * @key_len: The length of @key in bytes. - * @bytes_in: The message to hash - * @len_in: The length of @bytes_in in bytes. - * @bytes_out: Destination for the resulting HMAC. - * @len: The length of @bytes_out in bytes. Must be @HMAC_SHA256_LEN. - */ -WALLY_CORE_API int wally_hmac_sha256( - const unsigned char *key, - size_t key_len, - const unsigned char *bytes_in, - size_t len_in, - unsigned char *bytes_out, - size_t len); - -/** - * Compute an HMAC using SHA-512 - * - * @key: The key for the hash - * @key_len: The length of @key in bytes. - * @bytes_in: The message to hash - * @len_in: The length of @bytes_in in bytes. - * @bytes_out: Destination for the resulting HMAC. - * @len: The length of @bytes_out in bytes. Must be @HMAC_SHA512_LEN. - */ -WALLY_CORE_API int wally_hmac_sha512( - const unsigned char *key, - size_t key_len, - const unsigned char *bytes_in, - size_t len_in, - unsigned char *bytes_out, - size_t len); - - -/** Extra bytes required at the end of 'salt_in_out' for pbkdf2 functions */ -#define PBKDF2_HMAC_EXTRA_LEN 4 - -/** Output length for @wally_pbkdf2_hmac_sha256 */ -#define PBKDF2_HMAC_SHA256_LEN 32 - -/** Output length for @wally_pbkdf2_hmac_sha512 */ -#define PBKDF2_HMAC_SHA512_LEN 64 - -/** For hmac functions, indicates that 'salt_in_out' contains - * @PBKDF2_HMAC_EXTRA_LEN extra bytes for the block number to be added into. - */ -#define PBKDF2_HMAC_FLAG_BLOCK_RESERVED 1 - - -/** - * Derive a pseudorandom key from inputs using HMAC SHA-256. - * - * @pass: Password to derive from. - * @pass_len: Length of @pass in bytes. - * @salt_in_out: Salt to derive from. If @flags contains the value - * @PBKDF2_HMAC_FLAG_BLOCK_RESERVED then this memory must - * have @PBKDF2_HMAC_EXTRA_LEN of spare room at the end of the salt itself. - * @salt_len: Length of @salt_in_out in bytes, including any extra spare bytes. - * @flags: PBKDF2_HMAC_FLAG_ flag values indicating desired behaviour. - * @cost: The cost of the function. The larger this number, the - * longer the key will take to derive. - * @bytes_out: Destination for the derived pseudorandom key. - * @len: The length of @bytes_out in bytes. This must be a multiple - * of @PBKDF2_HMAC_SHA256_LEN. - * - * Returns 0 on success or non-zero if any parameter is invalid. - */ -WALLY_CORE_API int wally_pbkdf2_hmac_sha256( - const unsigned char *pass, - size_t pass_len, - unsigned char *salt_in_out, - size_t salt_len, - uint32_t flags, - uint32_t cost, - unsigned char *bytes_out, - size_t len); - -/** - * Derive a pseudorandom key from inputs using HMAC SHA-512. - * - * @pass: Password to derive from. - * @pass_len: Length of @pass in bytes. - * @salt_in_out: Salt to derive from. If @flags contains the value - * @PBKDF2_HMAC_FLAG_BLOCK_RESERVED then this memory must - * have @PBKDF2_HMAC_EXTRA_LEN of spare room at the end of the salt itself. - * @salt_len: Length of @salt_in_out in bytes, including any extra spare bytes. - * @flags: PBKDF2_HMAC_FLAG_ flag values indicating desired behaviour. - * @cost: The cost of the function. The larger this number, the - * longer the key will take to derive. - * @bytes_out: Destination for the derived pseudorandom key. - * @len: The length of @bytes_out in bytes. This must be a multiple - * of @PBKDF2_HMAC_SHA512_LEN. - * - * Returns 0 on success or non-zero if any parameter is invalid. - */ -WALLY_CORE_API int wally_pbkdf2_hmac_sha512( - const unsigned char *pass, - size_t pass_len, - unsigned char *salt_in_out, - size_t salt_len, - uint32_t flags, - uint32_t cost, - unsigned char *bytes_out, - size_t len); - -/** The length of a private key used for EC signing */ -#define EC_PRIVATE_KEY_LEN 32 -/** The length of a public key used for EC signing */ -#define EC_PUBLIC_KEY_LEN 33 -/** The length of an uncompressed public key */ -#define EC_PUBLIC_KEY_UNCOMPRESSED_LEN 65 -/** The length of a message hash to EC sign */ -#define EC_MESSAGE_HASH_LEN 32 -/** The length of a compact signature produced by EC signing */ -#define EC_SIGNATURE_LEN 64 -/** The maximum encoded length of a DER encoded signature */ -#define EC_SIGNATURE_DER_MAX_LEN 72 - -/** Indicates that a signature using ECDSA/secp256k1 is required */ -#define EC_FLAG_ECDSA 0x1 -/** Indicates that a signature using EC-Schnorr-SHA256 is required */ -#define EC_FLAG_SCHNORR 0x2 - - -/** - * Verify that a private key is valid. - * - * @priv_key: The private key to validate. - * @priv_key_len: The length of @priv_key in bytes. Must be @EC_PRIVATE_KEY_LEN. - */ -WALLY_CORE_API int wally_ec_private_key_verify( - const unsigned char *priv_key, - size_t priv_key_len); - -/** - * Create a public key from a private key. - * - * @priv_key: The private key to create a public key from. - * @priv_key_len: The length of @priv_key in bytes. Must be @EC_PRIVATE_KEY_LEN. - * @bytes_out: Destination for the resulting public key. - * @len: The length of @bytes_out in bytes. Must be @EC_PUBLIC_KEY_LEN. - */ -WALLY_CORE_API int wally_ec_public_key_from_private_key( - const unsigned char *priv_key, - size_t priv_key_len, - unsigned char *bytes_out, - size_t len); - -/** - * Create an uncompressed public key from a compressed public key. - * - * @pub_key: The private key to create a public key from. - * @pub_key_len: The length of @pub_key in bytes. Must be @EC_PUBLIC_KEY_LEN. - * @bytes_out: Destination for the resulting public key. - * @len: The length of @bytes_out in bytes. Must be @EC_PUBLIC_KEY_UNCOMPRESSED_LEN. - */ -WALLY_CORE_API int wally_ec_public_key_decompress( - const unsigned char *pub_key, - size_t pub_key_len, - unsigned char *bytes_out, - size_t len); - -/** - * Sign a message hash with a private key, producing a compact signature. - * - * @priv_key: The private key to sign with. - * @priv_key_len: The length of @priv_key in bytes. Must be @EC_PRIVATE_KEY_LEN. - * @bytes_in: The message hash to sign. - * @len_in: The length of @bytes_in in bytes. Must be @EC_MESSAGE_HASH_LEN. - * @flags: EC_FLAG_ flag values indicating desired behaviour. - * @bytes_out: Destination for the resulting compact signature. - * @len: The length of @bytes_out in bytes. Must be @EC_SIGNATURE_LEN. - */ -WALLY_CORE_API int wally_ec_sig_from_bytes( - const unsigned char *priv_key, - size_t priv_key_len, - const unsigned char *bytes_in, - size_t len_in, - uint32_t flags, - unsigned char *bytes_out, - size_t len); - -/** - * Convert a signature to low-s form. - * - * @sig_in: The compact signature to convert. - * @sig_in_len: The length of @sig_in in bytes. Must be @EC_SIGNATURE_LEN. - * @bytes_out: Destination for the resulting low-s signature. - * @len: The length of @bytes_out in bytes. Must be @EC_SIGNATURE_LEN. - */ -WALLY_CORE_API int wally_ec_sig_normalize( - const unsigned char *sig_in, - size_t sig_in_len, - unsigned char *bytes_out, - size_t len); - -/** - * Convert a compact signature to DER encoding. - * - * @sig_in: The compact signature to convert. - * @sig_in_len: The length of @sig_in in bytes. Must be @EC_SIGNATURE_LEN. - * @bytes_out: Destination for the resulting DER encoded signature. - * @len: The length of @bytes_out in bytes. Must be @EC_SIGNATURE_DER_MAX_LEN. - * @written: Destination for the number of bytes written to @bytes_out. - */ -WALLY_CORE_API int wally_ec_sig_to_der( - const unsigned char *sig_in, - size_t sig_in_len, - unsigned char *bytes_out, - size_t len, - size_t *written); - -/** - * Convert a DER encoded signature to a compact signature. - * - * @bytes_in: The DER encoded signature to convert. - * @len_in: The length of @sig_in in bytes. - * @bytes_out: Destination for the resulting compact signature. - * @len: The length of @bytes_out in bytes. Must be @EC_SIGNATURE_LEN. - */ -WALLY_CORE_API int wally_ec_sig_from_der( - const unsigned char *bytes_in, - size_t len_in, - unsigned char *bytes_out, - size_t len); - -/** - * Verify a signed message hash. - * - * @pub_key: The public key to verify with. - * @pub_key_len: The length of @pub_key in bytes. Must be @EC_PUBLIC_KEY_LEN. - * @bytes_in: The message hash to verify. - * @len_in: The length of @bytes_in in bytes. Must be @EC_MESSAGE_HASH_LEN. - * @flags: EC_FLAG_ flag values indicating desired behaviour. - * @sig_in: The compact signature of the message in @bytes_in. - * @sig_in_len: The length of @sig_in in bytes. Must be @EC_SIGNATURE_LEN. - */ -WALLY_CORE_API int wally_ec_sig_verify( - const unsigned char *pub_key, - size_t pub_key_len, - const unsigned char *bytes_in, - size_t len_in, - uint32_t flags, - const unsigned char *sig_in, - size_t sig_in_len); - -/** The maximim size of input message that can be formatted */ -#define BITCOIN_MESSAGE_MAX_LEN (64 * 1024 - 64) - -/** Indicates that SHA256D(message) should be returned */ -#define BITCOIN_MESSAGE_FLAG_HASH 1 - -/** - * Format a message for use as a bitcoin signed message. - * - * @bytes_in: The message string to sign. - * @len_in: The length of @bytes_in in bytes. Must be less than - * or equal to BITCOIN_MESSAGE_MAX_LEN. - * @flags: BITCOIN_MESSAGE_FLAG_ flags indicating the desired output. - * if BITCOIN_MESSAGE_FLAG_HASH is passed, the double SHA256 hash - * of the message is placed in @bytes_out instead of the formatted - * message. In this case @len must be at least @SHA256_LEN. - * @bytes_out: Destination for the formatted message or message hash. - * @len: The length of @bytes_out in bytes. - * @written: Destination for the number of bytes written to @bytes_out. - */ -WALLY_CORE_API int wally_format_bitcoin_message(const unsigned char *bytes_in, - size_t len_in, - uint32_t flags, - unsigned char *bytes_out, - size_t len, - size_t *written); - -#endif /* LIBWALLY_CORE_CRYPTO_H */ diff --git a/external/libwally-core/setup.py b/external/libwally-core/setup.py deleted file mode 100644 index fb3cc3621..000000000 --- a/external/libwally-core/setup.py +++ /dev/null @@ -1,54 +0,0 @@ -"""setuptools config for wallycore """ -from setuptools import setup -from setuptools import Distribution -import os -import subprocess -from distutils.command.build_clib import build_clib as _build_clib - -class Distr(Distribution): - def has_c_libraries(self): - return True - -class build_clib(_build_clib): - def run(self): - abs_path = os.path.dirname(os.path.abspath(__file__)) + '/' - - for cmd in ('./tools/autogen.sh', - './configure --enable-swig-python', - 'make'): - subprocess.check_call(cmd.split(' '), cwd=abs_path) - -setup( - name='wallycore', - - version='0.2.0', - description='libwally Bitcoin library', - long_description='Python bindings for the libwally Bitcoin library', - url='https://github.com/jgriffiths/libwally-core', - author='Jon Griffiths', - author_email='jon_p_griffiths@yahoo.com', - license='MIT', - zip_safe=False, - libraries=[('wallycore',{'sources':['include/wally_core.h']})], - cmdclass={ - 'build_clib': build_clib, - }, - - classifiers=[ - 'Development Status :: 3 - Alpha', - - 'Intended Audience :: Developers', - 'Topic :: Software Development :: Libraries', - - 'License :: OSI Approved :: MIT License', - - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.5', - ], - - keywords='Bitcoin wallet BIP32 BIP38 BIP39 secp256k1', - - packages=['wallycore'], - package_dir={'':'src/swig_python'}, - data_files=[('', ['src/.libs/libwallycore.so'])] , -) diff --git a/external/libwally-core/src/Makefile.am b/external/libwally-core/src/Makefile.am deleted file mode 100644 index 7197f07cc..000000000 --- a/external/libwally-core/src/Makefile.am +++ /dev/null @@ -1,150 +0,0 @@ -LIBSECP256K1=secp256k1/libsecp256k1.la - -$(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) - $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) - -noinst_LTLIBRARIES = - -if USE_SWIG_PYTHON -noinst_LTLIBRARIES += libswig_python.la -libswig_python_la_SOURCES = swig_python/swig_python_wrap.c - -libswig_python_la_CFLAGS = -I$(top_srcdir) $(AM_CFLAGS) $(SWIG_PYTHON_CPPFLAGS) $(SWIG_WARN_CFLAGS) $(NOALIAS_CFLAGS) -libswig_python_la_LIBADD = $(PYTHON_LIBS) - -# We must sed the wrapper to workaround SWIGs odd library naming conventions -swig_python/swig_python_wrap.c : swig_python/swig.i swig_python/python_extra.py_in - $(AM_V_at)$(SWIG) $(SWIG_PYTHON_OPT) -outdir swig_python -o $@ $< && \ - $(GNU_SED) -i 's/_wallycore/libwallycore/g' swig_python/wallycore.py $@ && \ - cat swig_python/wallycore.py swig_python/python_extra.py_in > swig_python/wallycore/__init__.py && \ - rm swig_python/wallycore.py - -PYTHON_TEST = PYTHONDONTWRITEBYTECODE=1 $(PYTHON) -PYTHON_SWIGTEST = PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=.libs:swig_python $(PYTHON) - -.PHONY: clean-swig-python -clean-swig-python: - $(AM_V_at)rm -f swig_python/swig_python_wrap.c swig_python/wallycore/__init__.py -clean-local: clean-swig-python - -if IS_OSX -# Python requires the shared library have a .so extension for 'import' -.libs/libwallycore.so: - $(AM_V_at)ln -s libwallycore.dylib .libs/libwallycore.so -SWIG_PYTHON_TEST_DEPS = .libs/libwallycore.so -endif - -endif - -if USE_SWIG_JAVA -noinst_LTLIBRARIES += libswig_java.la -libswig_java_la_SOURCES = \ - swig_java/swig_java_wrap.c - -libswig_java_la_CFLAGS = -I$(top_srcdir) $(AM_CFLAGS) $(SWIG_JAVA_CPPFLAGS) $(SWIG_WARN_CFLAGS) - -SWIG_JOPT = $(SWIG_JAVA_OPT) -outdir swig_java -noproxy -package com.blockstream.libwally - -swig_java/swig_java_wrap.c: swig_java/swig.i swig_java/jni_extra.java_in - $(AM_V_at)$(SWIG) $(SWIG_JOPT) -o $@ $< && \ - $(GNU_SED) -i 's/wallycoreJNI/Wally/g' $@ && \ - $(GNU_SED) -i 's/ = (char \*) (\*jenv)->Get/ = (unsigned char \*) (\*jenv)->Get/g' $@ - -cblw=com/blockstream/libwally -cbt=com/blockstream/test -sjs=swig_java/src -$(sjs)/$(cblw)/Wally.java: swig_java/swig_java_wrap.c - $(AM_V_at)$(top_srcdir)/tools/swigjavapost.sh @GNU_SED@ - -$(sjs)/$(cblw)/Wally.class: $(sjs)/$(cblw)/Wally.java - $(AM_V_at)$(JAVAC) -implicit:none -source $(JAVAC_TARGET) -target $(JAVAC_TARGET) -sourcepath $(sjs)/$(cblw)/ $(sjs)/$(cblw)/Wally.java - -swig_java/wallycore.jar: $(sjs)/$(cblw)/Wally.class - $(AM_V_at)$(JAR) cf swig_java/wallycore.jar -C $(sjs) '$(cblw)/Wally$$Obj.class' -C $(sjs) '$(cblw)/Wally.class' - -$(sjs)/$(cbt)/%.class: $(sjs)/$(cbt)/%.java swig_java/wallycore.jar - $(AM_V_at)$(JAVAC) -implicit:none -source $(JAVAC_TARGET) -target $(JAVAC_TARGET) -sourcepath $(sjs) $(filter %.java,$^) - -if HAVE_JAVAC -all: swig_java/wallycore.jar - -SWIG_JAVA_TEST_DEPS = $(sjs)/$(cbt)/test_bip32.class $(sjs)/$(cbt)/test_mnemonic.class - -all: $(SWIG_JAVA_TEST_DEPS) - -JAVA_TEST = @LDPATH_VAR@=.libs $(JAVA) -Djava.library.path=.libs -classpath $(sjs) com.blockstream.test. - -endif # HAVE_JAVAC - -.PHONY: clean-swig-java -clean-swig-java: - $(AM_V_at)rm -rf swig_java/swig_java_wrap.c $(sjs)/$(cblw) $(sjs)/$(cbt)/*.class swig_java/*.java swig_java/*.jar -clean-local: clean-swig-java -endif # USE_SWIG_JAVA - -lib_LTLIBRARIES = libwallycore.la - -libwallycore_la_SOURCES = \ - aes.c \ - base58.c \ - bip32.c \ - bip38.c \ - bip39.c \ - hex.c \ - hmac.c \ - internal.c \ - mnemonic.c \ - pbkdf2.c \ - scrypt.c \ - sign.c \ - wordlist.c \ - ccan/ccan/crypto/ripemd160/ripemd160.c \ - ccan/ccan/crypto/sha256/sha256.c \ - ccan/ccan/crypto/sha512/sha512.c \ - ccan/ccan/str/hex/hex.c - -libwallycore_la_INCLUDES = \ - include/wally_bip32.h \ - include/wally_bip38.h \ - include/wally_bip39.h \ - include/wally_core.h \ - include/wally-crypto.h - -libwallycore_la_CFLAGS = -I$(top_srcdir) -Iccan -DWALLY_CORE_BUILD=1 $(AM_CFLAGS) -libwallycore_la_LIBADD = $(LIBADD_SECP256K1) $(noinst_LTLIBRARIES) - -SUBDIRS = secp256k1 - -TESTS = -if USE_PTHREAD -TESTS += test_clear -noinst_PROGRAMS = test_clear -test_clear_SOURCES = ctest/test_clear.c -test_clear_CFLAGS = -I$(top_srcdir)/include $(PTHREAD_CFLAGS) $(AM_CFLAGS) -test_clear_LIBS = $(PTHREAD_LIBS) -test_clear_LDADD = $(lib_LTLIBRARIES) $(libwallycore_la_LIBADD) -endif - -check-local: $(SWIG_PYTHON_TEST_DEPS) $(SWIG_JAVA_TEST_DEPS) -if RUN_PYTHON_TESTS - $(AM_V_at)$(PYTHON_TEST) test/test_aes.py - $(AM_V_at)$(PYTHON_TEST) test/test_base58.py - $(AM_V_at)$(PYTHON_TEST) test/test_bip32.py - $(AM_V_at)$(PYTHON_TEST) test/test_bip38.py - $(AM_V_at)$(PYTHON_TEST) test/test_bip39.py - $(AM_V_at)$(PYTHON_TEST) test/test_hash.py - $(AM_V_at)$(PYTHON_TEST) test/test_hex.py - $(AM_V_at)$(PYTHON_TEST) test/test_hmac.py - $(AM_V_at)$(PYTHON_TEST) test/test_mnemonic.py - $(AM_V_at)$(PYTHON_TEST) test/test_pbkdf2.py - $(AM_V_at)$(PYTHON_TEST) test/test_scrypt.py - $(AM_V_at)$(PYTHON_TEST) test/test_sign.py - $(AM_V_at)$(PYTHON_TEST) test/test_wordlist.py -if USE_SWIG_PYTHON - $(AM_V_at)$(PYTHON_SWIGTEST) swig_python/contrib/mnemonic.py -endif -endif # RUN_PYTHON_TESTS -if RUN_JAVA_TESTS - $(AM_V_at)$(JAVA_TEST)test_bip32 - $(AM_V_at)$(JAVA_TEST)test_mnemonic -endif diff --git a/external/libwally-core/src/aes.c b/external/libwally-core/src/aes.c deleted file mode 100644 index ebc8ee1af..000000000 --- a/external/libwally-core/src/aes.c +++ /dev/null @@ -1,179 +0,0 @@ -#include "internal.h" -#include -#include - -#include "ctaes/ctaes.h" -#include "ctaes/ctaes.c" - -#define ALL_OPS (AES_FLAG_ENCRYPT | AES_FLAG_DECRYPT) - -static bool is_valid_key_len(size_t key_len) -{ - return key_len == AES_KEY_LEN_128 || key_len == AES_KEY_LEN_192 || - key_len == AES_KEY_LEN_256; -} - -static bool are_valid_args(const unsigned char *key, size_t key_len, - const unsigned char *bytes_in, uint32_t flags) -{ - return key && is_valid_key_len(key_len) && bytes_in && - (flags & ALL_OPS) != ALL_OPS; -} - -static void aes_enc(AES256_ctx *ctx, - const unsigned char *key, size_t key_len, - const unsigned char *bytes_in, size_t len_in, - unsigned char *bytes_out) -{ - len_in /= AES_BLOCK_LEN; - - switch (key_len) { - case AES_KEY_LEN_128: - AES128_init((AES128_ctx *)ctx, key); - AES128_encrypt((AES128_ctx *)ctx, len_in, bytes_out, bytes_in); - break; - - case AES_KEY_LEN_192: - AES192_init((AES192_ctx *)ctx, key); - AES192_encrypt((AES192_ctx *)ctx, len_in, bytes_out, bytes_in); - break; - - case AES_KEY_LEN_256: - AES256_init(ctx, key); - AES256_encrypt(ctx, len_in, bytes_out, bytes_in); - break; - } -} - -static void aes_dec(AES256_ctx *ctx, - const unsigned char *key, size_t key_len, - const unsigned char *bytes_in, size_t len_in, - unsigned char *bytes_out) -{ - len_in /= AES_BLOCK_LEN; - - switch (key_len) { - case AES_KEY_LEN_128: - AES128_init((AES128_ctx *)ctx, key); - AES128_decrypt((AES128_ctx *)ctx, len_in, bytes_out, bytes_in); - break; - - case AES_KEY_LEN_192: - AES192_init((AES192_ctx *)ctx, key); - AES192_decrypt((AES192_ctx *)ctx, len_in, bytes_out, bytes_in); - break; - - case AES_KEY_LEN_256: - AES256_init(ctx, key); - AES256_decrypt(ctx, len_in, bytes_out, bytes_in); - break; - } -} - -int wally_aes(const unsigned char *key, size_t key_len, - const unsigned char *bytes_in, size_t len_in, - uint32_t flags, - unsigned char *bytes_out, size_t len) -{ - AES256_ctx ctx; - - if (!are_valid_args(key, key_len, bytes_in, flags) || - len % AES_BLOCK_LEN || !len_in || len_in % AES_BLOCK_LEN || - flags & ~ALL_OPS || !bytes_out || !len) - return WALLY_EINVAL; - - if (flags & AES_FLAG_ENCRYPT) - aes_enc(&ctx, key, key_len, bytes_in, len_in, bytes_out); - else - aes_dec(&ctx, key, key_len, bytes_in, len_in, bytes_out); - - clear(&ctx, sizeof(ctx)); - return WALLY_OK; -} - -int wally_aes_cbc(const unsigned char *key, size_t key_len, - const unsigned char *iv, size_t iv_len, - const unsigned char *bytes_in, size_t len_in, - uint32_t flags, - unsigned char *bytes_out, size_t len, - size_t *written) -{ - unsigned char buf[AES_BLOCK_LEN]; - AES256_ctx ctx; - size_t i, n, blocks; - unsigned char remainder; - - if (written) - *written = 0; - - if (!are_valid_args(key, key_len, bytes_in, flags) || - ((flags & AES_FLAG_ENCRYPT) && (len % AES_BLOCK_LEN)) || - ((flags & AES_FLAG_DECRYPT) && (len_in % AES_BLOCK_LEN)) || - !iv || iv_len != AES_BLOCK_LEN || flags & ~ALL_OPS || !written) - return WALLY_EINVAL; - - blocks = len_in / AES_BLOCK_LEN; - - if (flags & AES_FLAG_ENCRYPT) { - /* Determine output length from input length */ - remainder = len_in % AES_BLOCK_LEN; - *written = (blocks + 1) * AES_BLOCK_LEN; - } else { - /* Determine output length from decrypted final block */ - const unsigned char *last = bytes_in + len_in - AES_BLOCK_LEN; - const unsigned char *prev = last - AES_BLOCK_LEN; - - if (!--blocks) - prev = iv; - aes_dec(&ctx, key, key_len, last, AES_BLOCK_LEN, buf); - for (n = 0; n < AES_BLOCK_LEN; ++n) - buf[n] = prev[n] ^ buf[n]; - - /* Modulo the resulting padding amount to the block size - we do - * not attempt to verify the decryption by checking the padding in - * the decrypted block. */ - remainder = AES_BLOCK_LEN - (buf[AES_BLOCK_LEN - 1] % AES_BLOCK_LEN); - if (remainder == AES_BLOCK_LEN) - remainder = 0; - *written = blocks * AES_BLOCK_LEN + remainder; - } - if (len < *written || !*written) - goto finish; /* Inform caller how much space is needed */ - - if (!bytes_out) { - clear_n(2, buf, sizeof(buf), &ctx, sizeof(ctx)); - return WALLY_EINVAL; - } - - if (flags & AES_FLAG_DECRYPT) - memcpy(bytes_out + blocks * AES_BLOCK_LEN, buf, remainder); - - for (i = 0; i < blocks; ++i) { - if (flags & AES_FLAG_ENCRYPT) { - for (n = 0; n < AES_BLOCK_LEN; ++n) - buf[n] = bytes_in[n] ^ iv[n]; - aes_enc(&ctx, key, key_len, buf, AES_BLOCK_LEN, bytes_out); - iv = bytes_out; - } else { - aes_dec(&ctx, key, key_len, bytes_in, AES_BLOCK_LEN, bytes_out); - for (n = 0; n < AES_BLOCK_LEN; ++n) - bytes_out[n] = bytes_out[n] ^ iv[n]; - iv = bytes_in; - } - bytes_in += AES_BLOCK_LEN; - bytes_out += AES_BLOCK_LEN; - } - - if (flags & AES_FLAG_ENCRYPT) { - for (n = 0; n < remainder; ++n) - buf[n] = bytes_in[n] ^ iv[n]; - remainder = 16 - remainder; - for (; n < AES_BLOCK_LEN; ++n) - buf[n] = remainder ^ iv[n]; - aes_enc(&ctx, key, key_len, buf, AES_BLOCK_LEN, bytes_out); - } - -finish: - clear_n(2, buf, sizeof(buf), &ctx, sizeof(ctx)); - return WALLY_OK; -} diff --git a/external/libwally-core/src/base58.c b/external/libwally-core/src/base58.c deleted file mode 100644 index 78510d410..000000000 --- a/external/libwally-core/src/base58.c +++ /dev/null @@ -1,290 +0,0 @@ -#include "internal.h" -#include "base58.h" -#include "ccan/ccan/crypto/sha256/sha256.h" -#include "ccan/ccan/endian/endian.h" -#include - -/* Temporary stack buffer sizes */ -#define BIGNUM_WORDS 128u -#define BIGNUM_BYTES (BIGNUM_WORDS * sizeof(uint32_t)) -#define BASE58_ALL_DEFINED_FLAGS (BASE58_FLAG_CHECKSUM) - -static const unsigned char base58_to_byte[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* .1234567 */ - 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 89...... */ - - 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, /* .ABCDEFG */ - 0x11, 0x00, 0x12, 0x13, 0x14, 0x15, 0x16, 0x00, /* H.JKLMN. */ - 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, /* PQRSTUVW */ - 0x1F, 0x20, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, /* XYZ..... */ - - 0x00, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, /* .abcdefg */ - 0x29, 0x2A, 0x2B, 0x2C, 0x00, 0x2D, 0x2E, 0x2F, /* hijk.mno */ - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* pqrstuvx */ - 0x38, 0x39, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, /* xyz..... */ - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */ -}; - -static const char byte_to_base58[58] = { - '1', '2', '3', '4', '5', '6', '7', '8', - '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', - 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', - 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'm', 'n', 'o', 'p', - 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', - 'y','z' -}; - -/* Returns non-zero on error. If 0 is returned then: - * *len <= input value - OK, bytes_out contains data. - * *len > input value - Failed and bytes_out untouched. - */ -static int base58_decode(const char *base58, size_t base58_len, - unsigned char *bytes_out, size_t *len) -{ - uint32_t bn_buf[BIGNUM_WORDS]; - uint32_t *bn = bn_buf, *top_word, *bn_p; - size_t bn_words = 0, ones, cp_len, i; - unsigned char *cp; - int ret = WALLY_EINVAL; - - if (!base58 || !base58_len) - return WALLY_EINVAL; /* Empty string can't be decoded or represented */ - - /* Process leading '1's */ - for (ones = 0; ones < base58_len && base58[ones] == '1'; ++ones) - ; /* no-op*/ - - if (!(base58_len -= ones)) { - if (bytes_out && ones <= *len) - memset(bytes_out, 0, ones); - *len = ones; - return WALLY_OK; /* String of all '1's */ - } - base58 += ones; /* Skip over leading '1's */ - - /* Take 6 bits to store each 58 bit number, rounded up to the next byte, - * then round that up to a uint32_t word boundary. */ - bn_words = ((base58_len * 6 + 7) / 8 + 3) / 4; - - /* Allocate our bignum buffer if it won't fit on the stack */ - if (bn_words > BIGNUM_WORDS) - if (!(bn = wally_malloc(bn_words * sizeof(*bn)))) { - ret = WALLY_ENOMEM; - goto cleanup; - } - - /* Iterate through the characters adding them to our bignum. We keep - * track of the current top word to avoid iterating over words that - * we know are zero. */ - top_word = bn + bn_words - 1; - *top_word = 0; - - for (i = 0; i < base58_len; ++i) { - unsigned char byte = base58_to_byte[((unsigned char *)base58)[i]]; - if (!byte--) - goto cleanup; /* Invalid char */ - - for (bn_p = bn + bn_words - 1; bn_p >= top_word; --bn_p) { - uint64_t mult = *bn_p * 58ull + byte; - *bn_p = mult & 0xffffffff; - byte = (mult >> 32) & 0xff; - if (byte && bn_p == top_word) { - *--top_word = byte; /* Increase bignum size */ - break; - } - } - } - - /* We have our bignum stored from top_word to bn + bn_words - 1. Convert - * its words to big-endian so we can simply memcpy it to bytes_out. */ - for (bn_p = top_word; bn_p < bn + bn_words; ++bn_p) - *bn_p = cpu_to_be32(*bn_p); /* No-op on big-endian machines */ - - for (cp = (unsigned char *)top_word; !*cp; ++cp) - ; /* Skip leading zero bytes in our bignum */ - - /* Copy the result if it fits, cleanup and return */ - cp_len = (unsigned char *)(bn + bn_words) - cp; - - if (bytes_out && ones + cp_len <= *len) { - memset(bytes_out, 0, ones); - memcpy(bytes_out + ones, cp, cp_len); - } - - *len = ones + cp_len; - ret = WALLY_OK; - -cleanup: - clear(bn, bn_words * sizeof(*bn)); - if (bn != bn_buf) - wally_free(bn); - return ret; -} - -uint32_t base58_get_checksum(const unsigned char *bytes_in, size_t len_in) -{ - struct sha256 sha; - uint32_t checksum; - - wally_sha256d(bytes_in, len_in, (unsigned char *)&sha, sizeof(sha)); - checksum = sha.u.u32[0]; - clear(&sha, sizeof(sha)); - return checksum; -} - - -int wally_base58_from_bytes(const unsigned char *bytes_in, size_t len_in, - uint32_t flags, char **output) -{ - uint32_t checksum, *cs_p = NULL; - unsigned char bn_buf[BIGNUM_BYTES]; - unsigned char *bn = bn_buf, *top_byte, *bn_p; - size_t bn_bytes = 0, zeros, i, orig_len = len_in; - int ret = WALLY_EINVAL; - - if (*output) - *output = NULL; - - if (!bytes_in || !len_in || (flags & ~BASE58_ALL_DEFINED_FLAGS) || !output) - goto cleanup; /* Invalid argument */ - - if (flags & BASE58_FLAG_CHECKSUM) { - checksum = base58_get_checksum(bytes_in, len_in); - cs_p = &checksum; - len_in += 4; - } - -#define b(n) (n < orig_len ? bytes_in[n] : ((unsigned char *)cs_p)[n - orig_len]) - - /* Process leading zeros */ - for (zeros = 0; zeros < len_in && !b(zeros); ++zeros) - ; /* no-op*/ - - if (zeros == len_in) { - if (!(*output = wally_malloc(zeros + 1))) { - ret = WALLY_ENOMEM; - goto cleanup; - } - - memset(*output, '1', zeros); - (*output)[zeros] = '\0'; - return WALLY_OK; /* All 0's */ - } - - bn_bytes = (len_in - zeros) * 138 / 100 + 1; /* log(256)/log(58) rounded up */ - - /* Allocate our bignum buffer if it won't fit on the stack */ - if (bn_bytes > BIGNUM_BYTES) - if (!(bn = wally_malloc(bn_bytes))) { - ret = WALLY_ENOMEM; - goto cleanup; - } - - top_byte = bn + bn_bytes - 1; - *top_byte = 0; - - for (i = zeros; i < len_in; ++i) { - uint32_t carry = b(i); - for (bn_p = bn + bn_bytes - 1; bn_p >= top_byte; --bn_p) { - carry = *bn_p * 256 + carry; - *bn_p = carry % 58; - carry = carry / 58; - if (carry && bn_p == top_byte) - *--top_byte = 0; /* Increase bignum size */ - } - } - - while (!*top_byte && top_byte < bn + bn_bytes - 1) - ++top_byte; /* Skip leading zero bytes in our bignum */ - - /* Copy the result */ - bn_bytes = bn + bn_bytes - top_byte; - - if (!(*output = wally_malloc(zeros + bn_bytes + 1))) { - ret = WALLY_ENOMEM; - goto cleanup; - } - - memset(*output, '1', zeros); - for (i = 0; i < bn_bytes; ++i) - (*output)[zeros + i] = byte_to_base58[top_byte[i]]; - (*output)[zeros + bn_bytes] = '\0'; - - ret = WALLY_OK; - -cleanup: - clear(bn, bn_bytes); - if (bn != bn_buf) - wally_free(bn); - return ret; -} - - -int wally_base58_get_length(const char *str_in, size_t *written) -{ - return base58_decode(str_in, strlen(str_in), NULL, written); -} - -int wally_base58_to_bytes(const char *str_in, uint32_t flags, - unsigned char *bytes_out, size_t len, - size_t *written) -{ - int ret; - - if (written) - *written = 0; - - if (!str_in || flags & ~BASE58_ALL_DEFINED_FLAGS || - !bytes_out || !len || !written) - return WALLY_EINVAL; - - if (flags & BASE58_FLAG_CHECKSUM && len <= BASE58_CHECKSUM_LEN) - return WALLY_EINVAL; /* No room for checksum */ - - *written = len; - ret = base58_decode(str_in, strlen(str_in), bytes_out, written); - if (!ret && *written > len) - return WALLY_OK; /* not enough space, return required amount */ - - if (!ret && (flags & BASE58_FLAG_CHECKSUM)) { - size_t offset = *written - BASE58_CHECKSUM_LEN; - uint32_t checksum = base58_get_checksum(bytes_out, offset); - - if (memcmp(bytes_out + offset, &checksum, sizeof(checksum))) { - clear(bytes_out, len); - return WALLY_EINVAL; /* Checksum mismatch */ - } - - clear(bytes_out + offset, BASE58_CHECKSUM_LEN); - *written -= BASE58_CHECKSUM_LEN; - } - return ret; -} diff --git a/external/libwally-core/src/base58.h b/external/libwally-core/src/base58.h deleted file mode 100644 index ecde22632..000000000 --- a/external/libwally-core/src/base58.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef LIBWALLY_BASE58_H -#define LIBWALLY_BASE58_H - -/** - * Calculate the base58 checksum of a block of binary data. - * - * @bytes_in: Binary data to calculate the checksum for. - * @len: The length of @bytes_in in bytes. - */ -uint32_t base58_get_checksum( - const unsigned char *bytes_in, - size_t len); - -#endif /* LIBWALLY_BASE58_H */ diff --git a/external/libwally-core/src/bip32.c b/external/libwally-core/src/bip32.c deleted file mode 100644 index 440e4084f..000000000 --- a/external/libwally-core/src/bip32.c +++ /dev/null @@ -1,678 +0,0 @@ -#include "internal.h" -#include "hmac.h" -#include "ccan/ccan/crypto/ripemd160/ripemd160.h" -#include "ccan/ccan/crypto/sha256/sha256.h" -#include "ccan/ccan/crypto/sha512/sha512.h" -#include "ccan/ccan/endian/endian.h" -#include "ccan/ccan/build_assert/build_assert.h" -#include -#include -#include "bip32_int.h" -#include - -#define BIP32_ALL_DEFINED_FLAGS (BIP32_FLAG_KEY_PRIVATE | BIP32_FLAG_KEY_PUBLIC | BIP32_FLAG_SKIP_HASH) - -static const unsigned char SEED[] = { - 'B', 'i', 't', 'c', 'o', 'i', 'n', ' ', 's', 'e', 'e', 'd' -}; - -/* LCOV_EXCL_START */ -/* Check assumptions we expect to hold true */ -static void assert_assumptions(void) -{ -#define key_off(member) offsetof(struct ext_key, member) -#define key_size(member) sizeof(((struct ext_key *)0)->member) - - /* Our ripend buffers must be uint32_t aligned and the correct size */ - BUILD_ASSERT(key_off(parent160) % sizeof(uint32_t) == 0); - BUILD_ASSERT(key_off(hash160) % sizeof(uint32_t) == 0); - BUILD_ASSERT(key_size(parent160) == sizeof(struct ripemd160)); - BUILD_ASSERT(key_size(hash160) == sizeof(struct ripemd160)); - BUILD_ASSERT(key_size(priv_key) == EC_PRIVATE_KEY_LEN + 1); - - /* Our keys following the parity byte must be uint64_t aligned */ - BUILD_ASSERT((key_off(priv_key) + 1) % sizeof(uint64_t) == 0); - BUILD_ASSERT((key_off(pub_key) + 1) % sizeof(uint64_t) == 0); - - /* child_num must be contigous after priv_key */ - BUILD_ASSERT((key_off(priv_key) + key_size(priv_key)) == key_off(child_num)); - - /* We use priv_key[0] to determine if this extended key is public or - * private, If priv_key[0] is BIP32_FLAG_KEY_PRIVATE then this key is private - * with a computed public key present. If set to BIP32_FLAG_KEY_PUBLIC then - * this is a public key with no private key (A BIP32 'neutered' key). - * - * For this to work BIP32_FLAG_KEY_PRIVATE must be zero so the whole 33 byte - * private key is valid when serialized, and BIP32_FLAG_KEY_PUBLIC cannot be - * 2 or 3 as they are valid parity bytes for public keys. - */ - BUILD_ASSERT(BIP32_FLAG_KEY_PRIVATE == 0); - BUILD_ASSERT(BIP32_FLAG_KEY_PUBLIC != BIP32_FLAG_KEY_PRIVATE && - BIP32_FLAG_KEY_PUBLIC != 2u && - BIP32_FLAG_KEY_PUBLIC != 3u); -} -/* LCOV_EXCL_STOP */ - -static bool mem_is_zero(const void *mem, size_t len) -{ - size_t i; - for (i = 0; i < len; ++i) - if (((const unsigned char *)mem)[i]) - return false; - return true; -} - -static bool child_is_hardened(uint32_t child_num) -{ - return child_num >= BIP32_INITIAL_HARDENED_CHILD; -} - -static bool version_is_valid(uint32_t ver, uint32_t flags) -{ - if (ver == BIP32_VER_MAIN_PRIVATE || ver == BIP32_VER_TEST_PRIVATE) - return true; - - return flags == BIP32_FLAG_KEY_PUBLIC && - (ver == BIP32_VER_MAIN_PUBLIC || ver == BIP32_VER_TEST_PUBLIC); -} - -static bool version_is_mainnet(uint32_t ver) -{ - return ver == BIP32_VER_MAIN_PRIVATE || ver == BIP32_VER_MAIN_PUBLIC; -} - -static bool key_is_private(const struct ext_key *key_in) -{ - return key_in->priv_key[0] == BIP32_FLAG_KEY_PRIVATE; -} - -static void key_strip_private_key(struct ext_key *key_out) -{ - key_out->priv_key[0] = BIP32_FLAG_KEY_PUBLIC; - clear(key_out->priv_key + 1, sizeof(key_out->priv_key) - 1); -} - -/* Compute a public key from a private key */ -static int key_compute_pub_key(struct ext_key *key_out) -{ - return wally_ec_public_key_from_private_key(key_out->priv_key + 1, - EC_PRIVATE_KEY_LEN, - key_out->pub_key, - sizeof(key_out->pub_key)); -} - -static void key_compute_hash160(struct ext_key *key_out) -{ - wally_hash160(key_out->pub_key, sizeof(key_out->pub_key), - key_out->hash160, sizeof(key_out->hash160)); -} - -int bip32_key_free(const struct ext_key *key_in) -{ - if (!key_in) - return WALLY_EINVAL; - wally_free((void *)key_in); - return WALLY_OK; -} - -static bool is_valid_seed_len(size_t len) { - return len == BIP32_ENTROPY_LEN_512 || len == BIP32_ENTROPY_LEN_256 || - len == BIP32_ENTROPY_LEN_128; -} - -int bip32_key_from_seed(const unsigned char *bytes_in, size_t len_in, - uint32_t version, uint32_t flags, - struct ext_key *key_out) -{ - const secp256k1_context *ctx; - struct sha512 sha; - - if (!bytes_in || !is_valid_seed_len(len_in) || - !version_is_valid(version, BIP32_FLAG_KEY_PRIVATE) || - (flags & ~BIP32_FLAG_SKIP_HASH) || !key_out) - return WALLY_EINVAL; - - clear(key_out, sizeof(*key_out)); - key_out->version = version; - - if (!(ctx = secp_ctx())) - return WALLY_ENOMEM; - - /* Generate private key and chain code */ - hmac_sha512(&sha, SEED, sizeof(SEED), bytes_in, len_in); - - /* Check that the generated private key is valid */ - if (!secp256k1_ec_seckey_verify(ctx, sha.u.u8)) { - clear(&sha, sizeof(sha)); - return WALLY_ERROR; /* Invalid private key */ - } - - /* Copy the private key and set its prefix */ - key_out->priv_key[0] = BIP32_FLAG_KEY_PRIVATE; - memcpy(key_out->priv_key + 1, sha.u.u8, sizeof(sha) / 2); - if (key_compute_pub_key(key_out) != WALLY_OK) { - clear_n(2, &sha, sizeof(sha), key_out, sizeof(*key_out)); - return WALLY_EINVAL; - } - - /* Copy the chain code */ - memcpy(key_out->chain_code, sha.u.u8 + sizeof(sha) / 2, sizeof(sha) / 2); - - key_out->depth = 0; /* Master key, depth 0 */ - key_out->child_num = 0; - if (!(flags & BIP32_FLAG_SKIP_HASH)) - key_compute_hash160(key_out); - clear(&sha, sizeof(sha)); - return WALLY_OK; -} - -#define ALLOC_KEY() \ - if (!output) \ - return WALLY_EINVAL; \ - *output = wally_malloc(sizeof(struct ext_key)); \ - if (!*output) \ - return WALLY_ENOMEM; \ - clear((void *)*output, sizeof(struct ext_key)) - -int bip32_key_from_seed_alloc(const unsigned char *bytes_in, size_t len_in, - uint32_t version, uint32_t flags, - const struct ext_key **output) -{ - int ret; - - ALLOC_KEY(); - ret = bip32_key_from_seed(bytes_in, len_in, version, flags, - (struct ext_key *)*output); - if (ret != WALLY_OK) { - wally_free((void *)*output); - *output = NULL; - } - return ret; -} - -static unsigned char *copy_out(unsigned char *dest, - const void *src, size_t len) -{ - memcpy(dest, src, len); - return dest + len; -} - -static bool key_is_valid(const struct ext_key *key_in) -{ - bool is_private = key_is_private(key_in); - bool is_master = !key_in->depth; - uint8_t ver_flags = is_private ? BIP32_FLAG_KEY_PRIVATE : BIP32_FLAG_KEY_PUBLIC; - - if (!version_is_valid(key_in->version, ver_flags)) - return false; - - if (mem_is_zero(key_in->chain_code, sizeof(key_in->chain_code)) || - (key_in->pub_key[0] != 0x2 && key_in->pub_key[0] != 0x3) || - mem_is_zero(key_in->pub_key + 1, sizeof(key_in->pub_key) - 1)) - return false; - - if (key_in->priv_key[0] != BIP32_FLAG_KEY_PUBLIC && - key_in->priv_key[0] != BIP32_FLAG_KEY_PRIVATE) - return false; - - if (is_private && - mem_is_zero(key_in->priv_key + 1, sizeof(key_in->priv_key) - 1)) - return false; - - if (is_master && !is_private) - return false; - - if (is_master && - !mem_is_zero(key_in->parent160, sizeof(key_in->parent160))) - return false; - - return true; -} - -int bip32_key_serialize(const struct ext_key *key_in, uint32_t flags, - unsigned char *bytes_out, size_t len) -{ - const bool serialize_private = !(flags & BIP32_FLAG_KEY_PUBLIC); - unsigned char *out = bytes_out; - uint32_t tmp32; - beint32_t tmp32_be; - - if (flags & ~BIP32_FLAG_KEY_PUBLIC) - return WALLY_EINVAL; /* Only this flag makes sense here */ - - /* Validate our arguments and then the input key */ - if (!key_in || - (serialize_private && !key_is_private(key_in)) || - !key_is_valid(key_in) || - !bytes_out || len != BIP32_SERIALIZED_LEN) - return WALLY_EINVAL; - - tmp32 = key_in->version; - if (!serialize_private) { - /* Change version if serialising the public part of a private key */ - if (tmp32 == BIP32_VER_MAIN_PRIVATE) - tmp32 = BIP32_VER_MAIN_PUBLIC; - else if (tmp32 == BIP32_VER_TEST_PRIVATE) - tmp32 = BIP32_VER_TEST_PUBLIC; - } - tmp32_be = cpu_to_be32(tmp32); - out = copy_out(out, &tmp32_be, sizeof(tmp32_be)); - - *out++ = key_in->depth; - - /* Save the first 32 bits of the parent key (aka fingerprint) only */ - out = copy_out(out, key_in->parent160, sizeof(uint32_t)); - - tmp32_be = cpu_to_be32(key_in->child_num); - out = copy_out(out, &tmp32_be, sizeof(tmp32_be)); - - out = copy_out(out, key_in->chain_code, sizeof(key_in->chain_code)); - - if (serialize_private) - copy_out(out, key_in->priv_key, sizeof(key_in->priv_key)); - else - copy_out(out, key_in->pub_key, sizeof(key_in->pub_key)); - - return WALLY_OK; -} - -static const unsigned char *copy_in(void *dest, - const unsigned char *src, size_t len) -{ - memcpy(dest, src, len); - return src + len; -} - -/* Wipe a key and return failure for the caller to propigate */ -static int wipe_key_fail(struct ext_key *key_out) -{ - clear(key_out, sizeof(*key_out)); - return WALLY_EINVAL; -} - -int bip32_key_unserialize(const unsigned char *bytes_in, size_t len_in, - struct ext_key *key_out) -{ - if (!bytes_in || len_in != BIP32_SERIALIZED_LEN || !key_out) - return WALLY_EINVAL; - - clear(key_out, sizeof(*key_out)); - - bytes_in = copy_in(&key_out->version, bytes_in, sizeof(key_out->version)); - key_out->version = be32_to_cpu(key_out->version); - if (!version_is_valid(key_out->version, BIP32_FLAG_KEY_PUBLIC)) - return wipe_key_fail(key_out); - - bytes_in = copy_in(&key_out->depth, bytes_in, sizeof(key_out->depth)); - - /* We only have a partial fingerprint available. Copy it, but the - * user will need to call bip32_key_set_parent() (FIXME: Implement) - * later if they want it to be fully populated. - */ - bytes_in = copy_in(key_out->parent160, bytes_in, sizeof(uint32_t)); - bytes_in = copy_in(&key_out->child_num, bytes_in, sizeof(key_out->child_num)); - key_out->child_num = be32_to_cpu(key_out->child_num); - bytes_in = copy_in(key_out->chain_code, bytes_in, sizeof(key_out->chain_code)); - - if (bytes_in[0] == BIP32_FLAG_KEY_PRIVATE) { - if (key_out->version == BIP32_VER_MAIN_PUBLIC || - key_out->version == BIP32_VER_TEST_PUBLIC) - return wipe_key_fail(key_out); /* Private key data in public key */ - - copy_in(key_out->priv_key, bytes_in, sizeof(key_out->priv_key)); - if (key_compute_pub_key(key_out) != WALLY_OK) - return wipe_key_fail(key_out); - } else { - if (key_out->version == BIP32_VER_MAIN_PRIVATE || - key_out->version == BIP32_VER_TEST_PRIVATE) - return wipe_key_fail(key_out); /* Public key data in private key */ - - copy_in(key_out->pub_key, bytes_in, sizeof(key_out->pub_key)); - key_strip_private_key(key_out); - } - - key_compute_hash160(key_out); - return WALLY_OK; -} - -int bip32_key_unserialize_alloc(const unsigned char *bytes_in, size_t len_in, - const struct ext_key **output) -{ - int ret; - - ALLOC_KEY(); - ret = bip32_key_unserialize(bytes_in, len_in, (struct ext_key *)*output); - if (ret) { - wally_free((void *)*output); - *output = 0; - } - return ret; -} - -/* BIP32: Child Key Derivations - * - * The spec doesn't have a simple table of derivations, its: - * - * Parent Child Hardened Status Path In Spec - * private private no OK m/n Y - * private private yes OK m/nH Y - * private public no OK - N - * private public yes OK - N - * public private no FAIL (N/A) (N/A) - * public private yes FAIL (N/A) (N/A) - * public public no OK M/n N - * public public yes FAIL M/nH (N/A) - * - * The spec path nomenclature only expresses derivations where the parent - * and desired child type match. For private->public the derivation is - * described in terms of private-private and public->public, but there are - * no test vectors or paths describing these values to validate against. - * Further, there are no public-public vectors in the BIP32 spec either. - */ -int bip32_key_from_parent(const struct ext_key *key_in, uint32_t child_num, - uint32_t flags, struct ext_key *key_out) -{ - struct sha512 sha; - const secp256k1_context *ctx; - const bool we_are_private = key_in && key_is_private(key_in); - const bool derive_private = !(flags & BIP32_FLAG_KEY_PUBLIC); - const bool hardened = child_is_hardened(child_num); - - if (flags & ~BIP32_ALL_DEFINED_FLAGS) - return WALLY_EINVAL; /* These flags are not defined yet */ - - if (!key_in || !key_out) - return WALLY_EINVAL; - - if (!(ctx = secp_ctx())) - return WALLY_ENOMEM; - - if (!we_are_private && (derive_private || hardened)) - return wipe_key_fail(key_out); /* Unsupported derivation */ - - if (key_in->depth == 0xff) - return wipe_key_fail(key_out); /* Maximum depth reached */ - - /* - * Private parent -> private child: - * CKDpriv((kpar, cpar), i) -> (ki, ci) - * - * Private parent -> public child: - * N(CKDpriv((kpar, cpar), i) -> (ki, ci)) - * As we always calculate the public key, we can derive a public - * child by deriving a private one and stripping its private key. - * - * Public parent -> non hardened public child - * CKDpub((Kpar, cpar), i) -> (Ki, ci) - */ - - /* NB: We use the key_outs' priv_key+child_num to hold 'Data' here */ - if (hardened) { - /* Hardened: Data = 0x00 || ser256(kpar) || ser32(i)) */ - memcpy(key_out->priv_key, key_in->priv_key, sizeof(key_in->priv_key)); - } else { - /* Non Hardened Private: Data = serP(point(kpar)) || ser32(i) - * Non Hardened Public : Data = serP(kpar) || ser32(i) - * point(kpar) when par is private is the public key. - */ - memcpy(key_out->priv_key, key_in->pub_key, sizeof(key_in->pub_key)); - } - - /* This is the '|| ser32(i)' part of the above */ - key_out->child_num = cpu_to_be32(child_num); - - /* I = HMAC-SHA512(Key = cpar, Data) */ - hmac_sha512(&sha, key_in->chain_code, sizeof(key_in->chain_code), - key_out->priv_key, - sizeof(key_out->priv_key) + sizeof(key_out->child_num)); - - /* Split I into two 32-byte sequences, IL and IR - * The returned chain code ci is IR (i.e. the 2nd half of our hmac sha512) - */ - memcpy(key_out->chain_code, sha.u.u8 + sizeof(sha) / 2, - sizeof(key_out->chain_code)); - - if (we_are_private) { - /* The returned child key ki is parse256(IL) + kpar (mod n) - * In case parse256(IL) ≥ n or ki = 0, the resulting key is invalid - * (NOTE: privkey_tweak_add checks both conditions) - */ - memcpy(key_out->priv_key, key_in->priv_key, sizeof(key_in->priv_key)); - if (!privkey_tweak_add(ctx, key_out->priv_key + 1, sha.u.u8)) { - clear(&sha, sizeof(sha)); - return wipe_key_fail(key_out); /* Out of bounds FIXME: Iterate to the next? */ - } - - if (key_compute_pub_key(key_out) != WALLY_OK) { - clear(&sha, sizeof(sha)); - return wipe_key_fail(key_out); - } - } else { - /* The returned child key ki is point(parse256(IL) + kpar) - * In case parse256(IL) ≥ n or Ki is the point at infinity, the - * resulting key is invalid (NOTE: pubkey_tweak_add checks both - * conditions) - */ - secp256k1_pubkey pub_key; - size_t len = sizeof(key_out->pub_key); - - /* FIXME: Out of bounds on pubkey_tweak_add */ - if (!pubkey_parse(ctx, &pub_key, key_in->pub_key, - sizeof(key_in->pub_key)) || - !pubkey_tweak_add(ctx, &pub_key, sha.u.u8) || - !pubkey_serialize(ctx, key_out->pub_key, &len, &pub_key, - PUBKEY_COMPRESSED) || - len != sizeof(key_out->pub_key)) { - clear(&sha, sizeof(sha)); - return wipe_key_fail(key_out); - } - } - - if (derive_private) { - if (version_is_mainnet(key_in->version)) - key_out->version = BIP32_VER_MAIN_PRIVATE; - else - key_out->version = BIP32_VER_TEST_PRIVATE; - - } else { - if (version_is_mainnet(key_in->version)) - key_out->version = BIP32_VER_MAIN_PUBLIC; - else - key_out->version = BIP32_VER_TEST_PUBLIC; - - key_strip_private_key(key_out); - } - - key_out->depth = key_in->depth + 1; - key_out->child_num = child_num; - if (flags & BIP32_FLAG_SKIP_HASH) - clear_n(2, &key_out->parent160, sizeof(key_out->parent160), - &key_out->hash160, sizeof(key_out->hash160)); - else { - memcpy(key_out->parent160, key_in->hash160, sizeof(key_in->hash160)); - key_compute_hash160(key_out); - } - clear(&sha, sizeof(sha)); - return WALLY_OK; -} - -int bip32_key_from_parent_alloc(const struct ext_key *key_in, - uint32_t child_num, uint32_t flags, - const struct ext_key **output) -{ - int ret; - - ALLOC_KEY(); - ret = bip32_key_from_parent(key_in, child_num, flags, (struct ext_key *)*output); - if (ret) { - wally_free((void *)*output); - *output = 0; - } - return ret; -} - -int bip32_key_from_parent_path(const struct ext_key *key_in, - const uint32_t *child_num_in, size_t child_num_len, - uint32_t flags, struct ext_key *key_out) -{ - /* Optimization: We can skip hash calculations for internal nodes */ - uint32_t derivation_flags = flags | BIP32_FLAG_SKIP_HASH; - struct ext_key tmp[2]; - size_t i, tmp_idx = 0; - int ret; - - if (flags & ~BIP32_ALL_DEFINED_FLAGS) - return WALLY_EINVAL; /* These flags are not defined yet */ - - if (!key_in || !child_num_in || !child_num_len || !key_out) - return WALLY_EINVAL; - - for (i = 0; i < child_num_len; ++i) { - struct ext_key *derived = &tmp[tmp_idx]; - if (i + 2 >= child_num_len) - derivation_flags = flags; /* Use callers flags for the final derivations */ - ret = bip32_key_from_parent(key_in, child_num_in[i], derivation_flags, derived); - if (ret != WALLY_OK) - break; - key_in = derived; /* Derived becomes next parent */ - tmp_idx = !tmp_idx; /* Use free slot in tmp for next derived */ - } - - if (ret == WALLY_OK) - memcpy(key_out, key_in, sizeof(*key_out)); - - clear(tmp, sizeof(tmp)); - return ret; -} - -int bip32_key_from_parent_path_alloc(const struct ext_key *key_in, - const uint32_t *child_num_in, size_t child_num_len, - uint32_t flags, - const struct ext_key **output) -{ - int ret; - - ALLOC_KEY(); - ret = bip32_key_from_parent_path(key_in, child_num_in, child_num_len, - flags, (struct ext_key *)*output); - if (ret) { - wally_free((void *)*output); - *output = 0; - } - return ret; -} - -int bip32_key_init_alloc(uint32_t version, uint32_t depth, uint32_t child_num, - const unsigned char *chain_code, size_t chain_code_len, - const unsigned char *pub_key, size_t pub_key_len, - const unsigned char *priv_key, size_t priv_key_len, - const unsigned char *hash160, size_t hash160_len, - const unsigned char *parent160, size_t parent160_len, - const struct ext_key **output) -{ - struct ext_key *key_out; - - if (!output) - return WALLY_EINVAL; - *output = NULL; - - switch (version) { - case BIP32_VER_MAIN_PRIVATE: - case BIP32_VER_TEST_PRIVATE: - if (!priv_key || priv_key_len != key_size(priv_key) - 1) - return WALLY_EINVAL; - break; - case BIP32_VER_MAIN_PUBLIC: - case BIP32_VER_TEST_PUBLIC: - if (!pub_key || pub_key_len != key_size(pub_key)) - return WALLY_EINVAL; - break; - } - - if (!chain_code || chain_code_len != key_size(chain_code)) - return WALLY_EINVAL; - - if ((priv_key && priv_key_len != key_size(priv_key) - 1) || (!priv_key && priv_key_len) || - (pub_key && pub_key_len != key_size(pub_key)) || (!pub_key && pub_key_len) || - (hash160 && hash160_len != key_size(hash160)) || (!hash160 && hash160_len) || - (parent160 && parent160_len != key_size(parent160))) - return WALLY_EINVAL; - - ALLOC_KEY(); - - key_out = (struct ext_key *)*output; - key_out->version = version; - key_out->depth = depth; - key_out->child_num = child_num; - - if (chain_code) - memcpy(key_out->chain_code, chain_code, key_size(chain_code)); - if (priv_key && version != BIP32_VER_MAIN_PUBLIC && version != BIP32_VER_TEST_PUBLIC) - memcpy(key_out->priv_key + 1, priv_key, key_size(priv_key) - 1); - else - key_out->priv_key[0] = BIP32_FLAG_KEY_PUBLIC; - if (pub_key) - memcpy(key_out->pub_key, pub_key, key_size(pub_key)); - else if (version == BIP32_VER_MAIN_PRIVATE || version == BIP32_VER_TEST_PRIVATE) { - /* Compute the public key if not given */ - int ret = key_compute_pub_key(key_out); - if (ret != WALLY_OK) { - clear(key_out, sizeof(*key_out)); - wally_free(key_out); - *output = 0; - return ret; - } - } - if (hash160) - memcpy(key_out->hash160, hash160, key_size(hash160)); - else - key_compute_hash160(key_out); - if (parent160) - memcpy(key_out->parent160, parent160, key_size(parent160)); - - return WALLY_OK; -} - - -#if defined (SWIG_JAVA_BUILD) || defined (SWIG_PYTHON_BUILD) - -/* Getters for ext_key values */ - -static int getb_impl(const struct ext_key *key_in, - const unsigned char *src, size_t src_len, - unsigned char *bytes_out, size_t len) -{ - if (!key_in || !bytes_out || len != src_len) - return WALLY_EINVAL; - memcpy(bytes_out, src, len); - return WALLY_OK; -} - -#define GET_B(name) \ - int bip32_key_get_ ## name(const struct ext_key *key_in, unsigned char *bytes_out, size_t len) { \ - return getb_impl(key_in, key_in->name, sizeof(key_in->name), bytes_out, len); \ - } - -GET_B(chain_code) -GET_B(parent160) -GET_B(hash160) -GET_B(pub_key) - -int bip32_key_get_priv_key(const struct ext_key *key_in, unsigned char *bytes_out, size_t len) { - return getb_impl(key_in, key_in->priv_key + 1, sizeof(key_in->priv_key) - 1, bytes_out, len); -} - - -#define GET_I(name) \ - int bip32_key_get_ ## name(const struct ext_key *key_in, size_t *output) { \ - if (output) *output = 0; \ - if (!key_in || !output) return WALLY_EINVAL; \ - *output = key_in->name; \ - return WALLY_OK; \ - } - -GET_I(depth) -GET_I(child_num) -GET_I(version) - -#endif /* SWIG_JAVA_BUILD/SWIG_PYTHON_BUILD */ diff --git a/external/libwally-core/src/bip32_int.h b/external/libwally-core/src/bip32_int.h deleted file mode 100644 index 0e008d120..000000000 --- a/external/libwally-core/src/bip32_int.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef LIBWALLY_CORE_BIP32_INT_H -#define LIBWALLY_CORE_BIP32_INT_H 1 - -#if defined(SWIG) || defined (SWIG_JAVA_BUILD) || defined (SWIG_PYTHON_BUILD) - -WALLY_CORE_API int bip32_key_get_chain_code(const struct ext_key *key_in, unsigned char *bytes_out, size_t len); -WALLY_CORE_API int bip32_key_get_parent160(const struct ext_key *key_in, unsigned char *bytes_out, size_t len); -WALLY_CORE_API int bip32_key_get_priv_key(const struct ext_key *key_in, unsigned char *bytes_out, size_t len); -WALLY_CORE_API int bip32_key_get_hash160(const struct ext_key *key_in, unsigned char *bytes_out, size_t len); -WALLY_CORE_API int bip32_key_get_pub_key(const struct ext_key *key_in, unsigned char *bytes_out, size_t len); - -WALLY_CORE_API int bip32_key_get_depth(const struct ext_key *key_in, size_t *output); -WALLY_CORE_API int bip32_key_get_child_num(const struct ext_key *key_in, size_t *output); -WALLY_CORE_API int bip32_key_get_version(const struct ext_key *key_in, size_t *output); - -#endif /* SWIG_JAVA_BUILD/SWIG_JAVA_BUILD/SWIG_PYTHON_BUILD */ - -#endif /* LIBWALLY_CORE_BIP32_INT_H */ diff --git a/external/libwally-core/src/bip38.c b/external/libwally-core/src/bip38.c deleted file mode 100644 index ac8e3e1c2..000000000 --- a/external/libwally-core/src/bip38.c +++ /dev/null @@ -1,317 +0,0 @@ -#include "internal.h" -#include "base58.h" -#include "ccan/ccan/crypto/sha256/sha256.h" -#include "ccan/ccan/crypto/ripemd160/ripemd160.h" -#include "ccan/ccan/endian/endian.h" -#include "ccan/ccan/build_assert/build_assert.h" -#include -#include -#include - -#define BIP38_FLAG_DEFAULT (0x40 | 0x80) -#define BIP38_FLAG_COMPRESSED 0x20 -#define BIP38_FLAG_RESERVED1 0x10 -#define BIP38_FLAG_RESERVED2 0x08 -#define BIP38_FLAG_HAVE_LOT 0x04 -#define BIP38_FLAG_RESERVED3 0x02 -#define BIP38_FLAG_RESERVED4 0x01 -#define BIP38_FLAGS_RESERVED (BIP38_FLAG_RESERVED1 | BIP38_FLAG_RESERVED2 | \ - BIP38_FLAG_RESERVED3 | BIP38_FLAG_RESERVED4) - -#define BIP38_ALL_DEFINED_FLAGS (BIP38_KEY_MAINNET | \ - BIP38_KEY_TESTNET | \ - BIP38_KEY_COMPRESSED | \ - BIP38_KEY_EC_MULT | \ - BIP38_KEY_QUICK_CHECK | \ - BIP38_KEY_RAW_MODE | \ - BIP38_KEY_SWAP_ORDER | \ - BIP38_FLAG_DEFAULT | \ - BIP38_FLAG_COMPRESSED | \ - BIP38_FLAG_HAVE_LOT) - -#define BIP38_DERVIED_KEY_LEN 64u - -#define BIP38_PREFIX 0x01 -#define BIP38_ECMUL 0x43 -#define BIP38_NO_ECMUL 0x42 - -struct derived_t { - unsigned char half1_lo[BIP38_DERVIED_KEY_LEN / 4]; - unsigned char half1_hi[BIP38_DERVIED_KEY_LEN / 4]; - unsigned char half2[BIP38_DERVIED_KEY_LEN / 2]; -}; - -struct bip38_layout_t { - unsigned char pad1; - unsigned char prefix; - unsigned char ec_type; - unsigned char flags; - uint32_t hash; - unsigned char half1[AES_BLOCK_LEN]; - unsigned char half2[AES_BLOCK_LEN]; - unsigned char decode_hash[BASE58_CHECKSUM_LEN]; -}; - -/* LCOV_EXCL_START */ -/* Check assumptions we expect to hold true */ -static void assert_assumptions(void) -{ - /* derived_t/bip38_layout_t must be contiguous */ - BUILD_ASSERT(sizeof(struct derived_t) == BIP38_DERVIED_KEY_LEN); - /* 44 -> pad1 + 39 + BASE58_CHECKSUM_LEN */ - BUILD_ASSERT(sizeof(struct bip38_layout_t) == 44u); - BUILD_ASSERT((sizeof(struct bip38_layout_t) - BASE58_CHECKSUM_LEN - 1) == - BIP38_SERIALIZED_LEN); -} -/* LCOV_EXCL_STOP */ - -/* FIXME: Export this with other address functions */ -static int address_from_private_key(const unsigned char *bytes_in, - size_t len_in, - unsigned char network, - bool compressed, - char **output) -{ - struct sha256 sha; - unsigned char pub_key_short[EC_PUBLIC_KEY_LEN]; - unsigned char pub_key_long[EC_PUBLIC_KEY_UNCOMPRESSED_LEN]; - unsigned char *pub_key = pub_key_short; - size_t pub_key_len = compressed ? EC_PUBLIC_KEY_LEN : EC_PUBLIC_KEY_UNCOMPRESSED_LEN; - struct { - union { - uint32_t network; - unsigned char bytes[4]; - } network_bytes; /* Used for alignment */ - struct ripemd160 hash160; - } buf; - int ret; - - /* Network and hash160 must be contiguous */ - BUILD_ASSERT(sizeof(buf) == sizeof(struct ripemd160) + sizeof(uint32_t)); - - ret = wally_ec_public_key_from_private_key(bytes_in, len_in, - pub_key_short, sizeof(pub_key_short)); - if (ret == WALLY_OK && !compressed) { - ret = wally_ec_public_key_decompress(pub_key_short, sizeof(pub_key_short), - pub_key_long, sizeof(pub_key_long)); - pub_key = pub_key_long; - } - if (ret == WALLY_OK) { - sha256(&sha, pub_key, pub_key_len); - ripemd160(&buf.hash160, &sha, sizeof(sha)); - buf.network_bytes.bytes[3] = network; - ret = wally_base58_from_bytes(&buf.network_bytes.bytes[3], - sizeof(unsigned char) + sizeof(buf.hash160), - BASE58_FLAG_CHECKSUM, output); - } - clear_n(4, &sha, sizeof(sha), pub_key_short, sizeof(pub_key_short), - pub_key_long, sizeof(pub_key_long), &buf, sizeof(buf)); - return ret; -} - -static void aes_enc(const unsigned char *src, const unsigned char *xor, - const unsigned char *key, unsigned char *bytes_out) -{ - unsigned char plaintext[AES_BLOCK_LEN]; - size_t i; - - for (i = 0; i < sizeof(plaintext); ++i) - plaintext[i] = src[i] ^ xor[i]; - - wally_aes(key, AES_KEY_LEN_256, plaintext, AES_BLOCK_LEN, - AES_FLAG_ENCRYPT, bytes_out, AES_BLOCK_LEN); - - clear(plaintext, sizeof(plaintext)); -} - -int bip38_raw_from_private_key(const unsigned char *bytes_in, size_t len_in, - const unsigned char *pass, size_t pass_len, - uint32_t flags, - unsigned char *bytes_out, size_t len) -{ - const bool compressed = flags & BIP38_KEY_COMPRESSED; - struct derived_t derived; - struct bip38_layout_t buf; - int ret = WALLY_EINVAL; - - if (!bytes_in || len_in != EC_PRIVATE_KEY_LEN || - !bytes_out || len != BIP38_SERIALIZED_LEN || - flags & ~BIP38_ALL_DEFINED_FLAGS) - goto finish; - - if (flags & BIP38_KEY_RAW_MODE) - buf.hash = base58_get_checksum(bytes_in, len_in); - else { - const unsigned char network = flags & 0xff; - char *addr58 = NULL; - if ((ret = address_from_private_key(bytes_in, len_in, - network, compressed, &addr58))) - goto finish; - - buf.hash = base58_get_checksum((unsigned char *)addr58, strlen(addr58)); - wally_free_string(addr58); - } - - ret = wally_scrypt(pass, pass_len, - (unsigned char *)&buf.hash, sizeof(buf.hash), 16384, 8, 8, - (unsigned char *)&derived, sizeof(derived)); - if (ret) - goto finish; - - buf.prefix = BIP38_PREFIX; - buf.ec_type = BIP38_NO_ECMUL; /* FIXME: EC-Multiply support */ - buf.flags = BIP38_FLAG_DEFAULT | (compressed ? BIP38_FLAG_COMPRESSED : 0); - aes_enc(bytes_in + 0, derived.half1_lo, derived.half2, buf.half1); - aes_enc(bytes_in + 16, derived.half1_hi, derived.half2, buf.half2); - - if (flags & BIP38_KEY_SWAP_ORDER) { - /* Shuffle hash from the beginning to the end */ - uint32_t tmp = buf.hash; - memmove(&buf.hash, buf.half1, AES_BLOCK_LEN * 2); - memcpy(buf.decode_hash - sizeof(uint32_t), &tmp, sizeof(uint32_t)); - } - - memcpy(bytes_out, &buf.prefix, BIP38_SERIALIZED_LEN); - -finish: - clear_n(2, &derived, sizeof(derived), &buf, sizeof(buf)); - return ret; -} - -int bip38_from_private_key(const unsigned char *bytes_in, size_t len_in, - const unsigned char *pass, size_t pass_len, - uint32_t flags, char **output) -{ - struct bip38_layout_t buf; - int ret; - - if (!output) - return WALLY_EINVAL; - - *output = NULL; - - ret = bip38_raw_from_private_key(bytes_in, len_in, pass, pass_len, - flags, &buf.prefix, BIP38_SERIALIZED_LEN); - if (!ret) - ret = wally_base58_from_bytes(&buf.prefix, BIP38_SERIALIZED_LEN, - BASE58_FLAG_CHECKSUM, output); - - clear(&buf, sizeof(buf)); - return ret; -} - - -static void aes_dec(const unsigned char *cyphertext, const unsigned char *xor, - const unsigned char *key, unsigned char *bytes_out) -{ - size_t i; - - wally_aes(key, AES_KEY_LEN_256, - (unsigned char *)cyphertext, AES_BLOCK_LEN, - AES_FLAG_DECRYPT, - bytes_out, AES_BLOCK_LEN); - - for (i = 0; i < AES_BLOCK_LEN; ++i) - bytes_out[i] ^= xor[i]; -} - -static int to_private_key(const char *bip38, - const unsigned char *bytes_in, size_t len_in, - const unsigned char *pass, size_t pass_len, - uint32_t flags, - unsigned char *bytes_out, size_t len) -{ - struct derived_t derived; - struct bip38_layout_t buf; - int ret = WALLY_EINVAL; - - if (flags & ~BIP38_ALL_DEFINED_FLAGS) - goto finish; - - if (!(flags & BIP38_KEY_QUICK_CHECK) && - (!bytes_out || len != EC_PRIVATE_KEY_LEN)) - goto finish; - - if (bytes_in) { - if (len_in != BIP38_SERIALIZED_LEN) - goto finish; - memcpy(&buf.prefix, bytes_in, BIP38_SERIALIZED_LEN); - } else { - size_t written; - if ((ret = wally_base58_to_bytes(bip38, BASE58_FLAG_CHECKSUM, &buf.prefix, - BIP38_SERIALIZED_LEN + BASE58_CHECKSUM_LEN, - &written))) - goto finish; - - if (written != BIP38_SERIALIZED_LEN) { - ret = WALLY_EINVAL; - goto finish; - } - } - - if (flags & BIP38_KEY_SWAP_ORDER) { - /* Shuffle hash from the end to the beginning */ - uint32_t tmp; - memcpy(&tmp, buf.decode_hash - sizeof(uint32_t), sizeof(uint32_t)); - memmove(buf.half1, &buf.hash, AES_BLOCK_LEN * 2); - buf.hash = tmp; - } - - if (buf.prefix != BIP38_PREFIX || - buf.flags & BIP38_FLAGS_RESERVED || - (buf.flags & BIP38_FLAG_DEFAULT) != BIP38_FLAG_DEFAULT || - buf.ec_type != BIP38_NO_ECMUL /* FIXME: EC Mul support */ || - buf.flags & BIP38_FLAG_HAVE_LOT) { - ret = WALLY_EINVAL; - goto finish; - } - - if (flags & BIP38_KEY_QUICK_CHECK) { - ret = WALLY_OK; - goto finish; - } - - if((ret = wally_scrypt(pass, pass_len, - (unsigned char *)&buf.hash, sizeof(buf.hash), 16384, 8, 8, - (unsigned char *)&derived, sizeof(derived)))) - goto finish; - - aes_dec(buf.half1, derived.half1_lo, derived.half2, bytes_out + 0); - aes_dec(buf.half2, derived.half1_hi, derived.half2, bytes_out + 16); - - if (flags & BIP38_KEY_RAW_MODE) { - if (buf.hash != base58_get_checksum(bytes_out, len)) - ret = WALLY_EINVAL; - } else { - const unsigned char network = flags & 0xff; - char *addr58 = NULL; - ret = address_from_private_key(bytes_out, len, network, - buf.flags & BIP38_FLAG_COMPRESSED, &addr58); - if (!ret && - buf.hash != base58_get_checksum((unsigned char *)addr58, strlen(addr58))) - ret = WALLY_EINVAL; - wally_free_string(addr58); - } - -finish: - clear_n(2, &derived, sizeof(derived), &buf, sizeof(buf)); - return ret; -} - -int bip38_raw_to_private_key(const unsigned char *bytes_in, size_t len_in, - const unsigned char *pass, size_t pass_len, - uint32_t flags, - unsigned char *bytes_out, size_t len) -{ - return to_private_key(NULL, bytes_in, len_in, pass, pass_len, - flags, bytes_out, len); -} - -int bip38_to_private_key(const char *bip38, - const unsigned char *pass, size_t pass_len, - uint32_t flags, - unsigned char *bytes_out, size_t len) -{ - return to_private_key(bip38, NULL, 0, pass, pass_len, flags, - bytes_out, len); -} diff --git a/external/libwally-core/src/bip39.c b/external/libwally-core/src/bip39.c deleted file mode 100644 index ff9ba0df6..000000000 --- a/external/libwally-core/src/bip39.c +++ /dev/null @@ -1,240 +0,0 @@ -#include "internal.h" -#include "mnemonic.h" -#include "wordlist.h" -#include "hmac.h" -#include "ccan/ccan/crypto/sha256/sha256.h" -#include "ccan/ccan/crypto/sha512/sha512.h" -#include -#include - -#include "data/wordlists/chinese_simplified.c" -#include "data/wordlists/chinese_traditional.c" -#include "data/wordlists/english.c" -#include "data/wordlists/french.c" -#include "data/wordlists/italian.c" -#include "data/wordlists/spanish.c" -#include "data/wordlists/japanese.c" - -/* Maximum length including up to 2 bytes for checksum */ -#define BIP39_ENTROPY_LEN_MAX (BIP39_ENTROPY_LEN_320 + sizeof(unsigned char) * 2) - -static const struct { - const char name[4]; - const struct words *words; -} lookup[] = { - { "en", &en_words}, { "es", &es_words}, { "fr", &fr_words}, - { "it", &it_words}, { "jp", &jp_words}, { "zhs", &zhs_words}, - { "zht", &zht_words}, - /* FIXME: Should 'zh' map to traditional or simplified? */ -}; - -int bip39_get_languages(char **output) -{ - if (!output) - return WALLY_EINVAL; - *output = wally_strdup("en es fr it jp zhs zht"); - return *output ? WALLY_OK : WALLY_ENOMEM; -} - -int bip39_get_wordlist(const char *lang, const struct words **output) -{ - size_t i; - - if (!output) - return WALLY_EINVAL; - - *output = &en_words; /* Fallback to English if not found */ - - if (lang) - for (i = 0; i < sizeof(lookup) / sizeof(lookup[0]); ++i) - if (!strcmp(lang, lookup[i].name)) { - *output = lookup[i].words; - break; - } - return WALLY_OK; -} - -int bip39_get_word(const struct words *w, size_t idx, - char **output) -{ - const char *word; - - if (output) - *output = NULL; - - w = w ? w : &en_words; - - if (!output || !(word = wordlist_lookup_index(w, idx))) - return WALLY_EINVAL; - - *output = word ? wally_strdup(word) : NULL; - return *output ? WALLY_OK : WALLY_ENOMEM; -} - -/* Convert an input entropy length to a mask for checksum bits. As it - * returns 0 for bad lengths, it serves as a validation function too. - */ -static size_t len_to_mask(size_t len) -{ - switch (len) { - case BIP39_ENTROPY_LEN_128: return 0xf0; - case BIP39_ENTROPY_LEN_160: return 0xf8; - case BIP39_ENTROPY_LEN_192: return 0xfc; - case BIP39_ENTROPY_LEN_224: return 0xfe; - case BIP39_ENTROPY_LEN_256: return 0xff; - case BIP39_ENTROPY_LEN_288: return 0x80ff; - case BIP39_ENTROPY_LEN_320: return 0xC0ff; - } - return 0; -} - -static size_t bip39_checksum(const unsigned char *bytes_in, size_t len_in, size_t mask) -{ - struct sha256 sha; - size_t ret; - sha256(&sha, bytes_in, len_in); - ret = sha.u.u8[0] | (sha.u.u8[1] << 8); - clear(&sha, sizeof(sha)); - return ret & mask; -} - -int bip39_mnemonic_from_bytes(const struct words *w, - const unsigned char *bytes_in, size_t len_in, - char **output) -{ - unsigned char tmp_bytes[BIP39_ENTROPY_LEN_MAX]; - size_t checksum, mask; - - if (output) - *output = NULL; - - if (!bytes_in || !len_in || !output) - return WALLY_EINVAL; - - w = w ? w : &en_words; - - if (w->bits != 11u || !(mask = len_to_mask(len_in))) - return WALLY_EINVAL; - - memcpy(tmp_bytes, bytes_in, len_in); - checksum = bip39_checksum(bytes_in, len_in, mask); - tmp_bytes[len_in] = checksum & 0xff; - if (mask > 0xff) - tmp_bytes[++len_in] = (checksum >> 8) & 0xff; - *output = mnemonic_from_bytes(w, tmp_bytes, len_in + 1); - clear(tmp_bytes, sizeof(tmp_bytes)); - return *output ? WALLY_OK : WALLY_ENOMEM; -} - -static bool checksum_ok(const unsigned char *bytes, size_t idx, size_t mask) -{ - /* The checksum is stored after the data to sum */ - size_t calculated = bip39_checksum(bytes, idx, mask); - size_t stored = bytes[idx]; - if (mask > 0xff) - stored |= (bytes[idx + 1] << 8); - return (stored & mask) == calculated; -} - -int bip39_mnemonic_to_bytes(const struct words *w, const char *mnemonic, - unsigned char *bytes_out, size_t len, - size_t *written) -{ - unsigned char tmp_bytes[BIP39_ENTROPY_LEN_MAX]; - size_t mask, tmp_len; - int ret; - - /* Ideally we would infer the wordlist here. Unfortunately this cannot - * work reliably because the default word lists overlap. In combination - * with being sorted lexographically, this means the default lists - * were poorly chosen. But we are stuck with them now. - * - * If the caller doesn't know which word list to use, they should iterate - * over the available ones and try any resulting list that the mnemonic - * validates against. - */ - w = w ? w : &en_words; - - if (written) - *written = 0; - - if (w->bits != 11u || !mnemonic || !bytes_out) - return WALLY_EINVAL; - - ret = mnemonic_to_bytes(w, mnemonic, tmp_bytes, sizeof(tmp_bytes), &tmp_len); - - if (!ret) { - /* Remove checksum bytes from the output length */ - --tmp_len; - if (tmp_len > BIP39_ENTROPY_LEN_256) - --tmp_len; /* Second byte required */ - - if (tmp_len > sizeof(tmp_bytes)) - ret = WALLY_EINVAL; /* Too big for biggest supported entropy */ - else { - if (tmp_len <= len) { - if (!(mask = len_to_mask(tmp_len)) || - !checksum_ok(tmp_bytes, tmp_len, mask)) { - tmp_len = 0; - ret = WALLY_EINVAL; /* Bad checksum */ - } - else - memcpy(bytes_out, tmp_bytes, tmp_len); - } - } - } - - clear(tmp_bytes, sizeof(tmp_bytes)); - if (!ret && written) - *written = tmp_len; - return ret; -} - -int bip39_mnemonic_validate(const struct words *w, const char *mnemonic) -{ - unsigned char buf[BIP39_ENTROPY_LEN_MAX]; - size_t len; - int ret = bip39_mnemonic_to_bytes(w, mnemonic, buf, sizeof(buf), &len); - clear(buf, sizeof(buf)); - return ret; -} - -int bip39_mnemonic_to_seed(const char *mnemonic, const char *password, - unsigned char *bytes_out, size_t len, - size_t *written) -{ - const size_t bip9_cost = 2048u; - const char *prefix = "mnemonic"; - const size_t prefix_len = strlen(prefix); - const size_t password_len = password ? strlen(password) : 0; - const size_t salt_len = prefix_len + password_len + PBKDF2_HMAC_EXTRA_LEN; - unsigned char *salt; - int ret; - - if (written) - *written = 0; - - if (!mnemonic || !bytes_out || len != BIP39_SEED_LEN_512) - return WALLY_EINVAL; - - salt = wally_malloc(salt_len); - if (!salt) - return WALLY_ENOMEM; - - memcpy(salt, prefix, prefix_len); - if (password_len) - memcpy(salt + prefix_len, password, password_len); - - ret = wally_pbkdf2_hmac_sha512((unsigned char *)mnemonic, strlen(mnemonic), - salt, salt_len, - PBKDF2_HMAC_FLAG_BLOCK_RESERVED, - bip9_cost, bytes_out, len); - - if (!ret && written) - *written = BIP39_SEED_LEN_512; /* Succeeded */ - - clear(salt, salt_len); - wally_free(salt); - - return ret; -} diff --git a/external/libwally-core/src/ccan/README b/external/libwally-core/src/ccan/README deleted file mode 100644 index 4c5c0cee0..000000000 --- a/external/libwally-core/src/ccan/README +++ /dev/null @@ -1,8 +0,0 @@ -The C Code Archive Network: http://ccodearchive.net - -You can find a set of helper utilities under tools/ and the modules -under ccan/. The recommended way to add ccan modules to your project -is to create a ccan/ directory and add one module per subdirectory -(see tools/create-ccan-tree). - -Enjoy! diff --git a/external/libwally-core/src/ccan/ccan/build_assert/LICENSE b/external/libwally-core/src/ccan/ccan/build_assert/LICENSE deleted file mode 120000 index b7951dabd..000000000 --- a/external/libwally-core/src/ccan/ccan/build_assert/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../licenses/CC0 \ No newline at end of file diff --git a/external/libwally-core/src/ccan/ccan/build_assert/_info b/external/libwally-core/src/ccan/ccan/build_assert/_info deleted file mode 100644 index 97ebe6c96..000000000 --- a/external/libwally-core/src/ccan/ccan/build_assert/_info +++ /dev/null @@ -1,49 +0,0 @@ -#include "config.h" -#include -#include - -/** - * build_assert - routines for build-time assertions - * - * This code provides routines which will cause compilation to fail should some - * assertion be untrue: such failures are preferable to run-time assertions, - * but much more limited since they can only depends on compile-time constants. - * - * These assertions are most useful when two parts of the code must be kept in - * sync: it is better to avoid such cases if possible, but seconds best is to - * detect invalid changes at build time. - * - * For example, a tricky piece of code might rely on a certain element being at - * the start of the structure. To ensure that future changes don't break it, - * you would catch such changes in your code like so: - * - * Example: - * #include - * #include - * - * struct foo { - * char string[5]; - * int x; - * }; - * - * static char *foo_string(struct foo *foo) - * { - * // This trick requires that the string be first in the structure - * BUILD_ASSERT(offsetof(struct foo, string) == 0); - * return (char *)foo; - * } - * - * License: CC0 (Public domain) - * Author: Rusty Russell - */ -int main(int argc, char *argv[]) -{ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) - /* Nothing. */ - return 0; - - return 1; -} diff --git a/external/libwally-core/src/ccan/ccan/build_assert/build_assert.h b/external/libwally-core/src/ccan/ccan/build_assert/build_assert.h deleted file mode 100644 index b9ecd8402..000000000 --- a/external/libwally-core/src/ccan/ccan/build_assert/build_assert.h +++ /dev/null @@ -1,40 +0,0 @@ -/* CC0 (Public domain) - see LICENSE file for details */ -#ifndef CCAN_BUILD_ASSERT_H -#define CCAN_BUILD_ASSERT_H - -/** - * BUILD_ASSERT - assert a build-time dependency. - * @cond: the compile-time condition which must be true. - * - * Your compile will fail if the condition isn't true, or can't be evaluated - * by the compiler. This can only be used within a function. - * - * Example: - * #include - * ... - * static char *foo_to_char(struct foo *foo) - * { - * // This code needs string to be at start of foo. - * BUILD_ASSERT(offsetof(struct foo, string) == 0); - * return (char *)foo; - * } - */ -#define BUILD_ASSERT(cond) \ - do { (void) sizeof(char [1 - 2*!(cond)]); } while(0) - -/** - * BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression. - * @cond: the compile-time condition which must be true. - * - * Your compile will fail if the condition isn't true, or can't be evaluated - * by the compiler. This can be used in an expression: its value is "0". - * - * Example: - * #define foo_to_char(foo) \ - * ((char *)(foo) \ - * + BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0)) - */ -#define BUILD_ASSERT_OR_ZERO(cond) \ - (sizeof(char [1 - 2*!(cond)]) - 1) - -#endif /* CCAN_BUILD_ASSERT_H */ diff --git a/external/libwally-core/src/ccan/ccan/build_assert/test/compile_fail-expr.c b/external/libwally-core/src/ccan/ccan/build_assert/test/compile_fail-expr.c deleted file mode 100644 index 109215b8a..000000000 --- a/external/libwally-core/src/ccan/ccan/build_assert/test/compile_fail-expr.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -int main(int argc, char *argv[]) -{ -#ifdef FAIL - return BUILD_ASSERT_OR_ZERO(1 == 0); -#else - return 0; -#endif -} diff --git a/external/libwally-core/src/ccan/ccan/build_assert/test/compile_fail.c b/external/libwally-core/src/ccan/ccan/build_assert/test/compile_fail.c deleted file mode 100644 index 37d95eddc..000000000 --- a/external/libwally-core/src/ccan/ccan/build_assert/test/compile_fail.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -int main(int argc, char *argv[]) -{ -#ifdef FAIL - BUILD_ASSERT(1 == 0); -#endif - return 0; -} diff --git a/external/libwally-core/src/ccan/ccan/build_assert/test/compile_ok.c b/external/libwally-core/src/ccan/ccan/build_assert/test/compile_ok.c deleted file mode 100644 index 4105484d1..000000000 --- a/external/libwally-core/src/ccan/ccan/build_assert/test/compile_ok.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int main(int argc, char *argv[]) -{ - BUILD_ASSERT(1 == 1); - return 0; -} diff --git a/external/libwally-core/src/ccan/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c b/external/libwally-core/src/ccan/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c deleted file mode 100644 index 418582133..000000000 --- a/external/libwally-core/src/ccan/ccan/build_assert/test/run-BUILD_ASSERT_OR_ZERO.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -int main(int argc, char *argv[]) -{ - plan_tests(1); - ok1(BUILD_ASSERT_OR_ZERO(1 == 1) == 0); - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/compiler/LICENSE b/external/libwally-core/src/ccan/ccan/compiler/LICENSE deleted file mode 120000 index b7951dabd..000000000 --- a/external/libwally-core/src/ccan/ccan/compiler/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../licenses/CC0 \ No newline at end of file diff --git a/external/libwally-core/src/ccan/ccan/compiler/_info b/external/libwally-core/src/ccan/ccan/compiler/_info deleted file mode 100644 index d60dff4d1..000000000 --- a/external/libwally-core/src/ccan/ccan/compiler/_info +++ /dev/null @@ -1,64 +0,0 @@ -#include "config.h" -#include -#include - -/** - * compiler - macros for common compiler extensions - * - * Abstracts away some compiler hints. Currently these include: - * - COLD - * For functions not called in fast paths (aka. cold functions) - * - PRINTF_FMT - * For functions which take printf-style parameters. - * - CONST_FUNCTION - * For functions which return the same value for same parameters. - * - NEEDED - * For functions and variables which must be emitted even if unused. - * - UNNEEDED - * For functions and variables which need not be emitted if unused. - * - UNUSED - * For parameters which are not used. - * - IS_COMPILE_CONSTANT() - * For using different tradeoffs for compiletime vs runtime evaluation. - * - * License: CC0 (Public domain) - * Author: Rusty Russell - * - * Example: - * #include - * #include - * #include - * - * // Example of a (slow-path) logging function. - * static int log_threshold = 2; - * static void COLD PRINTF_FMT(2,3) - * logger(int level, const char *fmt, ...) - * { - * va_list ap; - * va_start(ap, fmt); - * if (level >= log_threshold) - * vfprintf(stderr, fmt, ap); - * va_end(ap); - * } - * - * int main(int argc, char *argv[]) - * { - * if (argc != 1) { - * logger(3, "Don't want %i arguments!\n", argc-1); - * return 1; - * } - * return 0; - * } - */ -int main(int argc, char *argv[]) -{ - /* Expect exactly one argument */ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) { - return 0; - } - - return 1; -} diff --git a/external/libwally-core/src/ccan/ccan/compiler/compiler.h b/external/libwally-core/src/ccan/ccan/compiler/compiler.h deleted file mode 100644 index bce4f25a1..000000000 --- a/external/libwally-core/src/ccan/ccan/compiler/compiler.h +++ /dev/null @@ -1,231 +0,0 @@ -/* CC0 (Public domain) - see LICENSE file for details */ -#ifndef CCAN_COMPILER_H -#define CCAN_COMPILER_H -#include "config.h" - -#ifndef COLD -#if HAVE_ATTRIBUTE_COLD -/** - * COLD - a function is unlikely to be called. - * - * Used to mark an unlikely code path and optimize appropriately. - * It is usually used on logging or error routines. - * - * Example: - * static void COLD moan(const char *reason) - * { - * fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno)); - * } - */ -#define COLD __attribute__((__cold__)) -#else -#define COLD -#endif -#endif - -#ifndef NORETURN -#if HAVE_ATTRIBUTE_NORETURN -/** - * NORETURN - a function does not return - * - * Used to mark a function which exits; useful for suppressing warnings. - * - * Example: - * static void NORETURN fail(const char *reason) - * { - * fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno)); - * exit(1); - * } - */ -#define NORETURN __attribute__((__noreturn__)) -#else -#define NORETURN -#endif -#endif - -#ifndef PRINTF_FMT -#if HAVE_ATTRIBUTE_PRINTF -/** - * PRINTF_FMT - a function takes printf-style arguments - * @nfmt: the 1-based number of the function's format argument. - * @narg: the 1-based number of the function's first variable argument. - * - * This allows the compiler to check your parameters as it does for printf(). - * - * Example: - * void PRINTF_FMT(2,3) my_printf(const char *prefix, const char *fmt, ...); - */ -#define PRINTF_FMT(nfmt, narg) \ - __attribute__((format(__printf__, nfmt, narg))) -#else -#define PRINTF_FMT(nfmt, narg) -#endif -#endif - -#ifndef CONST_FUNCTION -#if HAVE_ATTRIBUTE_CONST -/** - * CONST_FUNCTION - a function's return depends only on its argument - * - * This allows the compiler to assume that the function will return the exact - * same value for the exact same arguments. This implies that the function - * must not use global variables, or dereference pointer arguments. - */ -#define CONST_FUNCTION __attribute__((__const__)) -#else -#define CONST_FUNCTION -#endif - -#ifndef PURE_FUNCTION -#if HAVE_ATTRIBUTE_PURE -/** - * PURE_FUNCTION - a function is pure - * - * A pure function is one that has no side effects other than it's return value - * and uses no inputs other than it's arguments and global variables. - */ -#define PURE_FUNCTION __attribute__((__pure__)) -#else -#define PURE_FUNCTION -#endif -#endif -#endif - -#if HAVE_ATTRIBUTE_UNUSED -#ifndef UNNEEDED -/** - * UNNEEDED - a variable/function may not be needed - * - * This suppresses warnings about unused variables or functions, but tells - * the compiler that if it is unused it need not emit it into the source code. - * - * Example: - * // With some preprocessor options, this is unnecessary. - * static UNNEEDED int counter; - * - * // With some preprocessor options, this is unnecessary. - * static UNNEEDED void add_to_counter(int add) - * { - * counter += add; - * } - */ -#define UNNEEDED __attribute__((__unused__)) -#endif - -#ifndef NEEDED -#if HAVE_ATTRIBUTE_USED -/** - * NEEDED - a variable/function is needed - * - * This suppresses warnings about unused variables or functions, but tells - * the compiler that it must exist even if it (seems) unused. - * - * Example: - * // Even if this is unused, these are vital for debugging. - * static NEEDED int counter; - * static NEEDED void dump_counter(void) - * { - * printf("Counter is %i\n", counter); - * } - */ -#define NEEDED __attribute__((__used__)) -#else -/* Before used, unused functions and vars were always emitted. */ -#define NEEDED __attribute__((__unused__)) -#endif -#endif - -#ifndef UNUSED -/** - * UNUSED - a parameter is unused - * - * Some compilers (eg. gcc with -W or -Wunused) warn about unused - * function parameters. This suppresses such warnings and indicates - * to the reader that it's deliberate. - * - * Example: - * // This is used as a callback, so needs to have this prototype. - * static int some_callback(void *unused UNUSED) - * { - * return 0; - * } - */ -#define UNUSED __attribute__((__unused__)) -#endif -#else -#ifndef UNNEEDED -#define UNNEEDED -#endif -#ifndef NEEDED -#define NEEDED -#endif -#ifndef UNUSED -#define UNUSED -#endif -#endif - -#ifndef IS_COMPILE_CONSTANT -#if HAVE_BUILTIN_CONSTANT_P -/** - * IS_COMPILE_CONSTANT - does the compiler know the value of this expression? - * @expr: the expression to evaluate - * - * When an expression manipulation is complicated, it is usually better to - * implement it in a function. However, if the expression being manipulated is - * known at compile time, it is better to have the compiler see the entire - * expression so it can simply substitute the result. - * - * This can be done using the IS_COMPILE_CONSTANT() macro. - * - * Example: - * enum greek { ALPHA, BETA, GAMMA, DELTA, EPSILON }; - * - * // Out-of-line version. - * const char *greek_name(enum greek greek); - * - * // Inline version. - * static inline const char *_greek_name(enum greek greek) - * { - * switch (greek) { - * case ALPHA: return "alpha"; - * case BETA: return "beta"; - * case GAMMA: return "gamma"; - * case DELTA: return "delta"; - * case EPSILON: return "epsilon"; - * default: return "**INVALID**"; - * } - * } - * - * // Use inline if compiler knows answer. Otherwise call function - * // to avoid copies of the same code everywhere. - * #define greek_name(g) \ - * (IS_COMPILE_CONSTANT(greek) ? _greek_name(g) : greek_name(g)) - */ -#define IS_COMPILE_CONSTANT(expr) __builtin_constant_p(expr) -#else -/* If we don't know, assume it's not. */ -#define IS_COMPILE_CONSTANT(expr) 0 -#endif -#endif - -#ifndef WARN_UNUSED_RESULT -#if HAVE_WARN_UNUSED_RESULT -/** - * WARN_UNUSED_RESULT - warn if a function return value is unused. - * - * Used to mark a function where it is extremely unlikely that the caller - * can ignore the result, eg realloc(). - * - * Example: - * // buf param may be freed by this; need return value! - * static char *WARN_UNUSED_RESULT enlarge(char *buf, unsigned *size) - * { - * return realloc(buf, (*size) *= 2); - * } - */ -#define WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) -#else -#define WARN_UNUSED_RESULT -#endif -#endif -#endif /* CCAN_COMPILER_H */ diff --git a/external/libwally-core/src/ccan/ccan/compiler/test/compile_fail-printf.c b/external/libwally-core/src/ccan/ccan/compiler/test/compile_fail-printf.c deleted file mode 100644 index 8f34ae5a1..000000000 --- a/external/libwally-core/src/ccan/ccan/compiler/test/compile_fail-printf.c +++ /dev/null @@ -1,22 +0,0 @@ -#include - -static void PRINTF_FMT(2,3) my_printf(int x, const char *fmt, ...) -{ -} - -int main(int argc, char *argv[]) -{ - unsigned int i = 0; - - my_printf(1, "Not a pointer " -#ifdef FAIL - "%p", -#if !HAVE_ATTRIBUTE_PRINTF -#error "Unfortunately we don't fail if !HAVE_ATTRIBUTE_PRINTF." -#endif -#else - "%i", -#endif - i); - return 0; -} diff --git a/external/libwally-core/src/ccan/ccan/compiler/test/run-is_compile_constant.c b/external/libwally-core/src/ccan/ccan/compiler/test/run-is_compile_constant.c deleted file mode 100644 index a66f2e13e..000000000 --- a/external/libwally-core/src/ccan/ccan/compiler/test/run-is_compile_constant.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -int main(int argc, char *argv[]) -{ - plan_tests(2); - - ok1(!IS_COMPILE_CONSTANT(argc)); -#if HAVE_BUILTIN_CONSTANT_P - ok1(IS_COMPILE_CONSTANT(7)); -#else - pass("If !HAVE_BUILTIN_CONSTANT_P, IS_COMPILE_CONSTANT always false"); -#endif - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/LICENSE b/external/libwally-core/src/ccan/ccan/crypto/ripemd160/LICENSE deleted file mode 120000 index 2b1feca54..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../../licenses/BSD-MIT \ No newline at end of file diff --git a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/_info b/external/libwally-core/src/ccan/ccan/crypto/ripemd160/_info deleted file mode 100644 index 4df7d4d28..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/_info +++ /dev/null @@ -1,55 +0,0 @@ -#include "config.h" -#include -#include - -/** - * crypto/ripemd160 - implementation of RIPEMD 160 bit digest algorithm. - * - * This code is either a wrapper for openssl (if CCAN_CRYPTO_RIPEMD160_USE_OPENSSL - * is defined) or an open-coded implementation based on Bitcoin's. - * - * License: BSD-MIT - * Maintainer: Rusty Russell - * - * Example: - * #include - * #include - * #include - * #include - * - * // Simple demonstration: idential strings will have the same hash, but - * // two different strings will not. - * int main(int argc, char *argv[]) - * { - * struct ripemd160 hash1, hash2; - * - * if (argc != 3) - * errx(1, "Usage: %s ", argv[0]); - * - * ripemd160(&hash1, argv[1], strlen(argv[1])); - * ripemd160(&hash2, argv[2], strlen(argv[2])); - * printf("Hash is %s\n", memcmp(&hash1, &hash2, sizeof(hash1)) - * ? "different" : "same"); - * return 0; - * } - */ -int main(int argc, char *argv[]) -{ - /* Expect exactly one argument */ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) { - printf("ccan/endian\n"); - return 0; - } - - if (strcmp(argv[1], "libs") == 0) { -#ifdef CCAN_CRYPTO_RIPEMD160_USE_OPENSSL - printf("crypto\n"); -#endif - return 0; - } - - return 1; -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/ripemd160.c b/external/libwally-core/src/ccan/ccan/crypto/ripemd160/ripemd160.c deleted file mode 100644 index d720b4393..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/ripemd160.c +++ /dev/null @@ -1,402 +0,0 @@ -/* MIT (BSD) license - see LICENSE file for details */ -/* RIPEMD core code translated from the Bitcoin project's C++: - * - * src/crypto/ripemd160.cpp commit f914f1a746d7f91951c1da262a4a749dd3ebfa71 - * Copyright (c) 2014 The Bitcoin Core developers - * Distributed under the MIT software license, see the accompanying - * file COPYING or http://www.opensource.org/licenses/mit-license.php. - */ -#include -#include -#include -#include -#include -#include - -static void invalidate_ripemd160(struct ripemd160_ctx *ctx) -{ -#ifdef CCAN_CRYPTO_RIPEMD160_USE_OPENSSL - ctx->c.num = -1U; -#else - ctx->bytes = -1ULL; -#endif -} - -static void check_ripemd160(struct ripemd160_ctx *ctx UNUSED) -{ -#ifdef CCAN_CRYPTO_RIPEMD160_USE_OPENSSL - assert(ctx->c.num != -1U); -#else - assert(ctx->bytes != -1ULL); -#endif -} - -#ifdef CCAN_CRYPTO_RIPEMD160_USE_OPENSSL -void ripemd160_init(struct ripemd160_ctx *ctx) -{ - RIPEMD160_Init(&ctx->c); -} - -void ripemd160_update(struct ripemd160_ctx *ctx, const void *p, size_t size) -{ - check_ripemd160(ctx); - RIPEMD160_Update(&ctx->c, p, size); -} - -void ripemd160_done(struct ripemd160_ctx *ctx, struct ripemd160 *res) -{ - RIPEMD160_Final(res->u.u8, &ctx->c); - invalidate_ripemd160(ctx); -} -#else -inline static uint32_t f1(uint32_t x, uint32_t y, uint32_t z) { return x ^ y ^ z; } -inline static uint32_t f2(uint32_t x, uint32_t y, uint32_t z) { return (x & y) | (~x & z); } -inline static uint32_t f3(uint32_t x, uint32_t y, uint32_t z) { return (x | ~y) ^ z; } -inline static uint32_t f4(uint32_t x, uint32_t y, uint32_t z) { return (x & z) | (y & ~z); } -inline static uint32_t f5(uint32_t x, uint32_t y, uint32_t z) { return x ^ (y | ~z); } - -/** Initialize RIPEMD-160 state. */ -inline static void Initialize(uint32_t* s) -{ - s[0] = 0x67452301ul; - s[1] = 0xEFCDAB89ul; - s[2] = 0x98BADCFEul; - s[3] = 0x10325476ul; - s[4] = 0xC3D2E1F0ul; -} - -inline static uint32_t rol(uint32_t x, int i) { return (x << i) | (x >> (32 - i)); } - -inline static void Round(uint32_t *a, uint32_t b UNUSED, uint32_t *c, uint32_t d UNUSED, uint32_t e, uint32_t f, uint32_t x, uint32_t k, int r) -{ - *a = rol(*a + f + x + k, r) + e; - *c = rol(*c, 10); -} - -inline static void R11(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f1(b, *c, d), x, 0, r); } -inline static void R21(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f2(b, *c, d), x, 0x5A827999ul, r); } -inline static void R31(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f3(b, *c, d), x, 0x6ED9EBA1ul, r); } -inline static void R41(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f4(b, *c, d), x, 0x8F1BBCDCul, r); } -inline static void R51(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f5(b, *c, d), x, 0xA953FD4Eul, r); } - -inline static void R12(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f5(b, *c, d), x, 0x50A28BE6ul, r); } -inline static void R22(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f4(b, *c, d), x, 0x5C4DD124ul, r); } -inline static void R32(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f3(b, *c, d), x, 0x6D703EF3ul, r); } -inline static void R42(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f2(b, *c, d), x, 0x7A6D76E9ul, r); } -inline static void R52(uint32_t *a, uint32_t b, uint32_t *c, uint32_t d, uint32_t e, uint32_t x, int r) { Round(a, b, c, d, e, f1(b, *c, d), x, 0, r); } - -/** Perform a RIPEMD-160 transformation, processing a 64-byte chunk. */ -static void Transform(uint32_t *s, const uint32_t *chunk) -{ - uint32_t a1 = s[0], b1 = s[1], c1 = s[2], d1 = s[3], e1 = s[4]; - uint32_t a2 = a1, b2 = b1, c2 = c1, d2 = d1, e2 = e1; - uint32_t w0 = le32_to_cpu(chunk[0]), w1 = le32_to_cpu(chunk[1]), w2 = le32_to_cpu(chunk[2]), w3 = le32_to_cpu(chunk[3]); - uint32_t w4 = le32_to_cpu(chunk[4]), w5 = le32_to_cpu(chunk[5]), w6 = le32_to_cpu(chunk[6]), w7 = le32_to_cpu(chunk[7]); - uint32_t w8 = le32_to_cpu(chunk[8]), w9 = le32_to_cpu(chunk[9]), w10 = le32_to_cpu(chunk[10]), w11 = le32_to_cpu(chunk[11]); - uint32_t w12 = le32_to_cpu(chunk[12]), w13 = le32_to_cpu(chunk[13]), w14 = le32_to_cpu(chunk[14]), w15 = le32_to_cpu(chunk[15]); - uint32_t t; - - R11(&a1, b1, &c1, d1, e1, w0, 11); - R12(&a2, b2, &c2, d2, e2, w5, 8); - R11(&e1, a1, &b1, c1, d1, w1, 14); - R12(&e2, a2, &b2, c2, d2, w14, 9); - R11(&d1, e1, &a1, b1, c1, w2, 15); - R12(&d2, e2, &a2, b2, c2, w7, 9); - R11(&c1, d1, &e1, a1, b1, w3, 12); - R12(&c2, d2, &e2, a2, b2, w0, 11); - R11(&b1, c1, &d1, e1, a1, w4, 5); - R12(&b2, c2, &d2, e2, a2, w9, 13); - R11(&a1, b1, &c1, d1, e1, w5, 8); - R12(&a2, b2, &c2, d2, e2, w2, 15); - R11(&e1, a1, &b1, c1, d1, w6, 7); - R12(&e2, a2, &b2, c2, d2, w11, 15); - R11(&d1, e1, &a1, b1, c1, w7, 9); - R12(&d2, e2, &a2, b2, c2, w4, 5); - R11(&c1, d1, &e1, a1, b1, w8, 11); - R12(&c2, d2, &e2, a2, b2, w13, 7); - R11(&b1, c1, &d1, e1, a1, w9, 13); - R12(&b2, c2, &d2, e2, a2, w6, 7); - R11(&a1, b1, &c1, d1, e1, w10, 14); - R12(&a2, b2, &c2, d2, e2, w15, 8); - R11(&e1, a1, &b1, c1, d1, w11, 15); - R12(&e2, a2, &b2, c2, d2, w8, 11); - R11(&d1, e1, &a1, b1, c1, w12, 6); - R12(&d2, e2, &a2, b2, c2, w1, 14); - R11(&c1, d1, &e1, a1, b1, w13, 7); - R12(&c2, d2, &e2, a2, b2, w10, 14); - R11(&b1, c1, &d1, e1, a1, w14, 9); - R12(&b2, c2, &d2, e2, a2, w3, 12); - R11(&a1, b1, &c1, d1, e1, w15, 8); - R12(&a2, b2, &c2, d2, e2, w12, 6); - - R21(&e1, a1, &b1, c1, d1, w7, 7); - R22(&e2, a2, &b2, c2, d2, w6, 9); - R21(&d1, e1, &a1, b1, c1, w4, 6); - R22(&d2, e2, &a2, b2, c2, w11, 13); - R21(&c1, d1, &e1, a1, b1, w13, 8); - R22(&c2, d2, &e2, a2, b2, w3, 15); - R21(&b1, c1, &d1, e1, a1, w1, 13); - R22(&b2, c2, &d2, e2, a2, w7, 7); - R21(&a1, b1, &c1, d1, e1, w10, 11); - R22(&a2, b2, &c2, d2, e2, w0, 12); - R21(&e1, a1, &b1, c1, d1, w6, 9); - R22(&e2, a2, &b2, c2, d2, w13, 8); - R21(&d1, e1, &a1, b1, c1, w15, 7); - R22(&d2, e2, &a2, b2, c2, w5, 9); - R21(&c1, d1, &e1, a1, b1, w3, 15); - R22(&c2, d2, &e2, a2, b2, w10, 11); - R21(&b1, c1, &d1, e1, a1, w12, 7); - R22(&b2, c2, &d2, e2, a2, w14, 7); - R21(&a1, b1, &c1, d1, e1, w0, 12); - R22(&a2, b2, &c2, d2, e2, w15, 7); - R21(&e1, a1, &b1, c1, d1, w9, 15); - R22(&e2, a2, &b2, c2, d2, w8, 12); - R21(&d1, e1, &a1, b1, c1, w5, 9); - R22(&d2, e2, &a2, b2, c2, w12, 7); - R21(&c1, d1, &e1, a1, b1, w2, 11); - R22(&c2, d2, &e2, a2, b2, w4, 6); - R21(&b1, c1, &d1, e1, a1, w14, 7); - R22(&b2, c2, &d2, e2, a2, w9, 15); - R21(&a1, b1, &c1, d1, e1, w11, 13); - R22(&a2, b2, &c2, d2, e2, w1, 13); - R21(&e1, a1, &b1, c1, d1, w8, 12); - R22(&e2, a2, &b2, c2, d2, w2, 11); - - R31(&d1, e1, &a1, b1, c1, w3, 11); - R32(&d2, e2, &a2, b2, c2, w15, 9); - R31(&c1, d1, &e1, a1, b1, w10, 13); - R32(&c2, d2, &e2, a2, b2, w5, 7); - R31(&b1, c1, &d1, e1, a1, w14, 6); - R32(&b2, c2, &d2, e2, a2, w1, 15); - R31(&a1, b1, &c1, d1, e1, w4, 7); - R32(&a2, b2, &c2, d2, e2, w3, 11); - R31(&e1, a1, &b1, c1, d1, w9, 14); - R32(&e2, a2, &b2, c2, d2, w7, 8); - R31(&d1, e1, &a1, b1, c1, w15, 9); - R32(&d2, e2, &a2, b2, c2, w14, 6); - R31(&c1, d1, &e1, a1, b1, w8, 13); - R32(&c2, d2, &e2, a2, b2, w6, 6); - R31(&b1, c1, &d1, e1, a1, w1, 15); - R32(&b2, c2, &d2, e2, a2, w9, 14); - R31(&a1, b1, &c1, d1, e1, w2, 14); - R32(&a2, b2, &c2, d2, e2, w11, 12); - R31(&e1, a1, &b1, c1, d1, w7, 8); - R32(&e2, a2, &b2, c2, d2, w8, 13); - R31(&d1, e1, &a1, b1, c1, w0, 13); - R32(&d2, e2, &a2, b2, c2, w12, 5); - R31(&c1, d1, &e1, a1, b1, w6, 6); - R32(&c2, d2, &e2, a2, b2, w2, 14); - R31(&b1, c1, &d1, e1, a1, w13, 5); - R32(&b2, c2, &d2, e2, a2, w10, 13); - R31(&a1, b1, &c1, d1, e1, w11, 12); - R32(&a2, b2, &c2, d2, e2, w0, 13); - R31(&e1, a1, &b1, c1, d1, w5, 7); - R32(&e2, a2, &b2, c2, d2, w4, 7); - R31(&d1, e1, &a1, b1, c1, w12, 5); - R32(&d2, e2, &a2, b2, c2, w13, 5); - - R41(&c1, d1, &e1, a1, b1, w1, 11); - R42(&c2, d2, &e2, a2, b2, w8, 15); - R41(&b1, c1, &d1, e1, a1, w9, 12); - R42(&b2, c2, &d2, e2, a2, w6, 5); - R41(&a1, b1, &c1, d1, e1, w11, 14); - R42(&a2, b2, &c2, d2, e2, w4, 8); - R41(&e1, a1, &b1, c1, d1, w10, 15); - R42(&e2, a2, &b2, c2, d2, w1, 11); - R41(&d1, e1, &a1, b1, c1, w0, 14); - R42(&d2, e2, &a2, b2, c2, w3, 14); - R41(&c1, d1, &e1, a1, b1, w8, 15); - R42(&c2, d2, &e2, a2, b2, w11, 14); - R41(&b1, c1, &d1, e1, a1, w12, 9); - R42(&b2, c2, &d2, e2, a2, w15, 6); - R41(&a1, b1, &c1, d1, e1, w4, 8); - R42(&a2, b2, &c2, d2, e2, w0, 14); - R41(&e1, a1, &b1, c1, d1, w13, 9); - R42(&e2, a2, &b2, c2, d2, w5, 6); - R41(&d1, e1, &a1, b1, c1, w3, 14); - R42(&d2, e2, &a2, b2, c2, w12, 9); - R41(&c1, d1, &e1, a1, b1, w7, 5); - R42(&c2, d2, &e2, a2, b2, w2, 12); - R41(&b1, c1, &d1, e1, a1, w15, 6); - R42(&b2, c2, &d2, e2, a2, w13, 9); - R41(&a1, b1, &c1, d1, e1, w14, 8); - R42(&a2, b2, &c2, d2, e2, w9, 12); - R41(&e1, a1, &b1, c1, d1, w5, 6); - R42(&e2, a2, &b2, c2, d2, w7, 5); - R41(&d1, e1, &a1, b1, c1, w6, 5); - R42(&d2, e2, &a2, b2, c2, w10, 15); - R41(&c1, d1, &e1, a1, b1, w2, 12); - R42(&c2, d2, &e2, a2, b2, w14, 8); - - R51(&b1, c1, &d1, e1, a1, w4, 9); - R52(&b2, c2, &d2, e2, a2, w12, 8); - R51(&a1, b1, &c1, d1, e1, w0, 15); - R52(&a2, b2, &c2, d2, e2, w15, 5); - R51(&e1, a1, &b1, c1, d1, w5, 5); - R52(&e2, a2, &b2, c2, d2, w10, 12); - R51(&d1, e1, &a1, b1, c1, w9, 11); - R52(&d2, e2, &a2, b2, c2, w4, 9); - R51(&c1, d1, &e1, a1, b1, w7, 6); - R52(&c2, d2, &e2, a2, b2, w1, 12); - R51(&b1, c1, &d1, e1, a1, w12, 8); - R52(&b2, c2, &d2, e2, a2, w5, 5); - R51(&a1, b1, &c1, d1, e1, w2, 13); - R52(&a2, b2, &c2, d2, e2, w8, 14); - R51(&e1, a1, &b1, c1, d1, w10, 12); - R52(&e2, a2, &b2, c2, d2, w7, 6); - R51(&d1, e1, &a1, b1, c1, w14, 5); - R52(&d2, e2, &a2, b2, c2, w6, 8); - R51(&c1, d1, &e1, a1, b1, w1, 12); - R52(&c2, d2, &e2, a2, b2, w2, 13); - R51(&b1, c1, &d1, e1, a1, w3, 13); - R52(&b2, c2, &d2, e2, a2, w13, 6); - R51(&a1, b1, &c1, d1, e1, w8, 14); - R52(&a2, b2, &c2, d2, e2, w14, 5); - R51(&e1, a1, &b1, c1, d1, w11, 11); - R52(&e2, a2, &b2, c2, d2, w0, 15); - R51(&d1, e1, &a1, b1, c1, w6, 8); - R52(&d2, e2, &a2, b2, c2, w3, 13); - R51(&c1, d1, &e1, a1, b1, w15, 5); - R52(&c2, d2, &e2, a2, b2, w9, 11); - R51(&b1, c1, &d1, e1, a1, w13, 6); - R52(&b2, c2, &d2, e2, a2, w11, 11); - - t = s[0]; - s[0] = s[1] + c1 + d2; - s[1] = s[2] + d1 + e2; - s[2] = s[3] + e1 + a2; - s[3] = s[4] + a1 + b2; - s[4] = t + b1 + c2; -} - -static void add(struct ripemd160_ctx *ctx, const void *p, size_t len) -{ - const unsigned char *data = p; - size_t bufsize = ctx->bytes % 64; - - if (bufsize + len >= 64) { - /* Fill the buffer, and process it. */ - memcpy(ctx->buf.u8 + bufsize, data, 64 - bufsize); - ctx->bytes += 64 - bufsize; - data += 64 - bufsize; - len -= 64 - bufsize; - Transform(ctx->s, ctx->buf.u32); - bufsize = 0; - } - - while (len >= 64) { - /* Process full chunks directly from the source. */ - if (alignment_ok(data, sizeof(uint32_t))) - Transform(ctx->s, (const uint32_t *)data); - else { - memcpy(ctx->buf.u8, data, sizeof(ctx->buf)); - Transform(ctx->s, ctx->buf.u32); - } - ctx->bytes += 64; - data += 64; - len -= 64; - } - - if (len) { - /* Fill the buffer with what remains. */ - memcpy(ctx->buf.u8 + bufsize, data, len); - ctx->bytes += len; - } -} - -void ripemd160_init(struct ripemd160_ctx *ctx) -{ - struct ripemd160_ctx init = RIPEMD160_INIT; - *ctx = init; -} - -void ripemd160_update(struct ripemd160_ctx *ctx, const void *p, size_t size) -{ - check_ripemd160(ctx); - add(ctx, p, size); -} - -void ripemd160_done(struct ripemd160_ctx *ctx, struct ripemd160 *res) -{ - static const unsigned char pad[64] = {0x80}; - uint64_t sizedesc; - size_t i; - - sizedesc = cpu_to_le64(ctx->bytes << 3); - /* Add '1' bit to terminate, then all 0 bits, up to next block - 8. */ - add(ctx, pad, 1 + ((119 - (ctx->bytes % 64)) % 64)); - /* Add number of bits of data (big endian) */ - add(ctx, &sizedesc, 8); - for (i = 0; i < sizeof(ctx->s) / sizeof(ctx->s[0]); i++) - res->u.u32[i] = cpu_to_le32(ctx->s[i]); - invalidate_ripemd160(ctx); -} -#endif - -void ripemd160(struct ripemd160 *ripemd, const void *p, size_t size) -{ - struct ripemd160_ctx ctx; - - ripemd160_init(&ctx); - ripemd160_update(&ctx, p, size); - ripemd160_done(&ctx, ripemd); - CCAN_CLEAR_MEMORY(&ctx, sizeof(ctx)); -} - -void ripemd160_u8(struct ripemd160_ctx *ctx, uint8_t v) -{ - ripemd160_update(ctx, &v, sizeof(v)); -} - -void ripemd160_u16(struct ripemd160_ctx *ctx, uint16_t v) -{ - ripemd160_update(ctx, &v, sizeof(v)); -} - -void ripemd160_u32(struct ripemd160_ctx *ctx, uint32_t v) -{ - ripemd160_update(ctx, &v, sizeof(v)); -} - -void ripemd160_u64(struct ripemd160_ctx *ctx, uint64_t v) -{ - ripemd160_update(ctx, &v, sizeof(v)); -} - -/* Add as little-endian */ -void ripemd160_le16(struct ripemd160_ctx *ctx, uint16_t v) -{ - leint16_t lev = cpu_to_le16(v); - ripemd160_update(ctx, &lev, sizeof(lev)); -} - -void ripemd160_le32(struct ripemd160_ctx *ctx, uint32_t v) -{ - leint32_t lev = cpu_to_le32(v); - ripemd160_update(ctx, &lev, sizeof(lev)); -} - -void ripemd160_le64(struct ripemd160_ctx *ctx, uint64_t v) -{ - leint64_t lev = cpu_to_le64(v); - ripemd160_update(ctx, &lev, sizeof(lev)); -} - -/* Add as big-endian */ -void ripemd160_be16(struct ripemd160_ctx *ctx, uint16_t v) -{ - beint16_t bev = cpu_to_be16(v); - ripemd160_update(ctx, &bev, sizeof(bev)); -} - -void ripemd160_be32(struct ripemd160_ctx *ctx, uint32_t v) -{ - beint32_t bev = cpu_to_be32(v); - ripemd160_update(ctx, &bev, sizeof(bev)); -} - -void ripemd160_be64(struct ripemd160_ctx *ctx, uint64_t v) -{ - beint64_t bev = cpu_to_be64(v); - ripemd160_update(ctx, &bev, sizeof(bev)); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/ripemd160.h b/external/libwally-core/src/ccan/ccan/crypto/ripemd160/ripemd160.h deleted file mode 100644 index e56a1c299..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/ripemd160.h +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef CCAN_CRYPTO_RIPEMD160_H -#define CCAN_CRYPTO_RIPEMD160_H -/* BSD-MIT - see LICENSE file for details */ -#include "config.h" -#include -#include - -/* Uncomment this to use openssl's RIPEMD160 routines (and link with -lcrypto) */ -/*#define CCAN_CRYPTO_RIPEMD160_USE_OPENSSL 1*/ - -#ifdef CCAN_CRYPTO_RIPEMD160_USE_OPENSSL -#include -#endif - -/** - * struct ripemd160 - structure representing a completed RIPEMD160. - * @u.u8: an unsigned char array. - * @u.u32: a 32-bit integer array. - * - * Other fields may be added to the union in future. - */ -struct ripemd160 { - union { - /* Array of chars */ - unsigned char u8[20]; - /* Array of uint32_t */ - uint32_t u32[5]; - } u; -}; - -/** - * ripemd160 - return ripemd160 of an object. - * @ripemd160: the ripemd160 to fill in - * @p: pointer to memory, - * @size: the number of bytes pointed to by @p - * - * The bytes pointed to by @p is RIPEMD160 hashed into @ripemd160. This is - * equivalent to ripemd160_init(), ripemd160_update() then ripemd160_done(). - */ -void ripemd160(struct ripemd160 *ripemd, const void *p, size_t size); - -/** - * struct ripemd160_ctx - structure to store running context for ripemd160 - */ -struct ripemd160_ctx { -#ifdef CCAN_CRYPTO_RIPEMD160_USE_OPENSSL - RIPEMD160_CTX c; -#else - uint32_t s[5]; - uint64_t bytes; - union { - uint32_t u32[8]; - unsigned char u8[64]; - } buf; -#endif -}; - -/** - * ripemd160_init - initialize an RIPEMD160 context. - * @ctx: the ripemd160_ctx to initialize - * - * This must be called before ripemd160_update or ripemd160_done, or - * alternately you can assign RIPEMD160_INIT. - * - * If it was already initialized, this forgets anything which was - * hashed before. - * - * Example: - * static void hash_all(const char **arr, struct ripemd160 *hash) - * { - * size_t i; - * struct ripemd160_ctx ctx; - * - * ripemd160_init(&ctx); - * for (i = 0; arr[i]; i++) - * ripemd160_update(&ctx, arr[i], strlen(arr[i])); - * ripemd160_done(&ctx, hash); - * } - */ -void ripemd160_init(struct ripemd160_ctx *ctx); - -/** - * RIPEMD160_INIT - initializer for an RIPEMD160 context. - * - * This can be used to staticly initialize an RIPEMD160 context (instead - * of ripemd160_init()). - * - * Example: - * static void hash_all(const char **arr, struct ripemd160 *hash) - * { - * size_t i; - * struct ripemd160_ctx ctx = RIPEMD160_INIT; - * - * for (i = 0; arr[i]; i++) - * ripemd160_update(&ctx, arr[i], strlen(arr[i])); - * ripemd160_done(&ctx, hash); - * } - */ -#ifdef CCAN_CRYPTO_RIPEMD160_USE_OPENSSL -#define RIPEMD160_INIT \ - { { 0x67452301ul, 0xEFCDAB89ul, 0x98BADCFEul, 0x10325476ul, \ - 0xC3D2E1F0ul, \ - 0x0, 0x0, \ - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, \ - 0 } } -#else -#define RIPEMD160_INIT \ - { { 0x67452301ul, 0xEFCDAB89ul, 0x98BADCFEul, 0x10325476ul, \ - 0xC3D2E1F0ul }, 0, {{ 0 }} } -#endif - -/** - * ripemd160_update - include some memory in the hash. - * @ctx: the ripemd160_ctx to use - * @p: pointer to memory, - * @size: the number of bytes pointed to by @p - * - * You can call this multiple times to hash more data, before calling - * ripemd160_done(). - */ -void ripemd160_update(struct ripemd160_ctx *ctx, const void *p, size_t size); - -/** - * ripemd160_done - finish RIPEMD160 and return the hash - * @ctx: the ripemd160_ctx to complete - * @res: the hash to return. - * - * Note that @ctx is *destroyed* by this, and must be reinitialized. - * To avoid that, pass a copy instead. - */ -void ripemd160_done(struct ripemd160_ctx *ripemd160, struct ripemd160 *res); - -/* Add various types to an RIPEMD160 hash */ -void ripemd160_u8(struct ripemd160_ctx *ctx, uint8_t v); -void ripemd160_u16(struct ripemd160_ctx *ctx, uint16_t v); -void ripemd160_u32(struct ripemd160_ctx *ctx, uint32_t v); -void ripemd160_u64(struct ripemd160_ctx *ctx, uint64_t v); - -/* Add as little-endian */ -void ripemd160_le16(struct ripemd160_ctx *ctx, uint16_t v); -void ripemd160_le32(struct ripemd160_ctx *ctx, uint32_t v); -void ripemd160_le64(struct ripemd160_ctx *ctx, uint64_t v); - -/* Add as big-endian */ -void ripemd160_be16(struct ripemd160_ctx *ctx, uint16_t v); -void ripemd160_be32(struct ripemd160_ctx *ctx, uint32_t v); -void ripemd160_be64(struct ripemd160_ctx *ctx, uint64_t v); -#endif /* CCAN_CRYPTO_RIPEMD160_H */ diff --git a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-lotsa-data.c b/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-lotsa-data.c deleted file mode 100644 index b35a96f05..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-lotsa-data.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -/* Include the C files directly. */ -#include -#include - -int main(void) -{ - struct ripemd160 h, expected; - static const char zeroes[1000]; - size_t i; - - plan_tests(63); - - /* Test different alignments. */ - ripemd160(&expected, zeroes, sizeof(zeroes) - 64); - for (i = 1; i < 64; i++) { - ripemd160(&h, zeroes + i, sizeof(zeroes) - 64); - ok1(memcmp(&h, &expected, sizeof(h)) == 0); - } - - /* This exits depending on whether all tests passed */ - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-test-vectors.c b/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-test-vectors.c deleted file mode 100644 index 70581c771..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-test-vectors.c +++ /dev/null @@ -1,84 +0,0 @@ -#include -/* Include the C files directly. */ -#include -#include - -/* Test vectors. */ -struct test { - const char *test; - size_t repetitions; - beint32_t result[5]; -}; - -/* Test vectors from: http://homes.esat.kuleuven.be/~bosselae/ripemd160.html */ -static struct test tests[] = { - { "", 1, - { CPU_TO_BE32(0x9c1185a5), CPU_TO_BE32(0xc5e9fc54), - CPU_TO_BE32(0x61280897), CPU_TO_BE32(0x7ee8f548), - CPU_TO_BE32(0xb2258d31) } }, - { "abc", 1, - { CPU_TO_BE32(0x8eb208f7), CPU_TO_BE32(0xe05d987a), - CPU_TO_BE32(0x9b044a8e), CPU_TO_BE32(0x98c6b087), - CPU_TO_BE32(0xf15a0bfc) } }, - { "message digest", 1, - { CPU_TO_BE32(0x5d0689ef), CPU_TO_BE32(0x49d2fae5), - CPU_TO_BE32(0x72b881b1), CPU_TO_BE32(0x23a85ffa), - CPU_TO_BE32(0x21595f36) } }, - { "abcdefghijklmnopqrstuvwxyz", 1, - { CPU_TO_BE32(0xf71c2710), CPU_TO_BE32(0x9c692c1b), - CPU_TO_BE32(0x56bbdceb), CPU_TO_BE32(0x5b9d2865), - CPU_TO_BE32(0xb3708dbc) } }, - { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 1, - { CPU_TO_BE32(0x12a05338), CPU_TO_BE32(0x4a9c0c88), - CPU_TO_BE32(0xe405a06c), CPU_TO_BE32(0x27dcf49a), - CPU_TO_BE32(0xda62eb2b) } }, - { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 1, - { CPU_TO_BE32(0xb0e20b6e), CPU_TO_BE32(0x31166402), - CPU_TO_BE32(0x86ed3a87), CPU_TO_BE32(0xa5713079), - CPU_TO_BE32(0xb21f5189) } }, - { "1234567890", 8, - { CPU_TO_BE32(0x9b752e45), CPU_TO_BE32(0x573d4b39), - CPU_TO_BE32(0xf4dbd332), CPU_TO_BE32(0x3cab82bf), - CPU_TO_BE32(0x63326bfb) } }, - { "a", 1000000, - { CPU_TO_BE32(0x52783243), CPU_TO_BE32(0xc1697bdb), - CPU_TO_BE32(0xe16d37f9), CPU_TO_BE32(0x7f68f083), - CPU_TO_BE32(0x25dc1528) } } -}; - -static bool do_test(const struct test *t, bool single) -{ - struct ripemd160 h; - - if (single) { - if (t->repetitions != 1) - return true; - ripemd160(&h, t->test, strlen(t->test)); - } else { - struct ripemd160_ctx ctx = RIPEMD160_INIT; - size_t i; - - for (i = 0; i < t->repetitions; i++) - ripemd160_update(&ctx, t->test, strlen(t->test)); - ripemd160_done(&ctx, &h); - } - - return memcmp(&h.u, t->result, sizeof(t->result)) == 0; -} - -int main(void) -{ - size_t i; - - /* This is how many tests you plan to run */ - plan_tests(sizeof(tests) / sizeof(struct test) * 2); - - for (i = 0; i < sizeof(tests) / sizeof(struct test); i++) - ok1(do_test(&tests[i], false)); - - for (i = 0; i < sizeof(tests) / sizeof(struct test); i++) - ok1(do_test(&tests[i], true)); - - /* This exits depending on whether all tests passed */ - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-types.c b/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-types.c deleted file mode 100644 index 50e1fcc38..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/ripemd160/test/run-types.c +++ /dev/null @@ -1,63 +0,0 @@ -#include -/* Include the C files directly. */ -#include -#include - -static unsigned char arr[] = { - 0x12, -#if HAVE_BIG_ENDIAN - /* u16 */ - 0x12, 0x34, - /* u32 */ - 0x12, 0x34, 0x56, 0x78, - /* u64 */ - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, -#else - /* u16 */ - 0x34, 0x12, - /* u32 */ - 0x78, 0x56, 0x34, 0x12, - /* u64 */ - 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, -#endif - /* le16 */ - 0x34, 0x12, - /* le32 */ - 0x78, 0x56, 0x34, 0x12, - /* le64 */ - 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, - /* be16 */ - 0x12, 0x34, - /* be32 */ - 0x12, 0x34, 0x56, 0x78, - /* be64 */ - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 -}; - -int main(void) -{ - struct ripemd160 h, expected; - struct ripemd160_ctx ctx; - - /* This is how many tests you plan to run */ - plan_tests(1); - - ripemd160_init(&ctx); - ripemd160_u8(&ctx, 0x12); - ripemd160_u16(&ctx, 0x1234); - ripemd160_u32(&ctx, 0x12345678); - ripemd160_u64(&ctx, 0x123456789abcdef0ULL); - ripemd160_le16(&ctx, 0x1234); - ripemd160_le32(&ctx, 0x12345678); - ripemd160_le64(&ctx, 0x123456789abcdef0ULL); - ripemd160_be16(&ctx, 0x1234); - ripemd160_be32(&ctx, 0x12345678); - ripemd160_be64(&ctx, 0x123456789abcdef0ULL); - ripemd160_done(&ctx, &h); - - ripemd160(&expected, arr, sizeof(arr)); - ok1(memcmp(&h, &expected, sizeof(h)) == 0); - - /* This exits depending on whether all tests passed */ - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha256/LICENSE b/external/libwally-core/src/ccan/ccan/crypto/sha256/LICENSE deleted file mode 120000 index 2b1feca54..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha256/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../../licenses/BSD-MIT \ No newline at end of file diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha256/_info b/external/libwally-core/src/ccan/ccan/crypto/sha256/_info deleted file mode 100644 index fe1f5b8c8..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha256/_info +++ /dev/null @@ -1,55 +0,0 @@ -#include "config.h" -#include -#include - -/** - * crypto/sha256 - implementation of SHA-2 with 256 bit digest. - * - * This code is either a wrapper for openssl (if CCAN_CRYPTO_SHA256_USE_OPENSSL - * is defined) or an open-coded implementation based on Bitcoin's. - * - * License: BSD-MIT - * Maintainer: Rusty Russell - * - * Example: - * #include - * #include - * #include - * #include - * - * // Simple demonstration: idential strings will have the same hash, but - * // two different strings will not. - * int main(int argc, char *argv[]) - * { - * struct sha256 hash1, hash2; - * - * if (argc != 3) - * errx(1, "Usage: %s ", argv[0]); - * - * sha256(&hash1, argv[1], strlen(argv[1])); - * sha256(&hash2, argv[2], strlen(argv[2])); - * printf("Hash is %s\n", memcmp(&hash1, &hash2, sizeof(hash1)) - * ? "different" : "same"); - * return 0; - * } - */ -int main(int argc, char *argv[]) -{ - /* Expect exactly one argument */ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) { - printf("ccan/endian\n"); - return 0; - } - - if (strcmp(argv[1], "libs") == 0) { -#ifdef CCAN_CRYPTO_SHA256_USE_OPENSSL - printf("crypto\n"); -#endif - return 0; - } - - return 1; -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha256/sha256.c b/external/libwally-core/src/ccan/ccan/crypto/sha256/sha256.c deleted file mode 100644 index af9313705..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha256/sha256.c +++ /dev/null @@ -1,300 +0,0 @@ -/* MIT (BSD) license - see LICENSE file for details */ -/* SHA256 core code translated from the Bitcoin project's C++: - * - * src/crypto/sha256.cpp commit 417532c8acb93c36c2b6fd052b7c11b6a2906aa2 - * Copyright (c) 2014 The Bitcoin Core developers - * Distributed under the MIT software license, see the accompanying - * file COPYING or http://www.opensource.org/licenses/mit-license.php. - */ -#include -#include -#include -#include -#include -#include - -static void invalidate_sha256(struct sha256_ctx *ctx) -{ -#ifdef CCAN_CRYPTO_SHA256_USE_OPENSSL - ctx->c.md_len = 0; -#else - ctx->bytes = (size_t)-1; -#endif -} - -static void check_sha256(struct sha256_ctx *ctx UNUSED) -{ -#ifdef CCAN_CRYPTO_SHA256_USE_OPENSSL - assert(ctx->c.md_len != 0); -#else - assert(ctx->bytes != (size_t)-1); -#endif -} - -#ifdef CCAN_CRYPTO_SHA256_USE_OPENSSL -void sha256_init(struct sha256_ctx *ctx) -{ - SHA256_Init(&ctx->c); -} - -void sha256_update(struct sha256_ctx *ctx, const void *p, size_t size) -{ - check_sha256(ctx); - SHA256_Update(&ctx->c, p, size); -} - -void sha256_done(struct sha256_ctx *ctx, struct sha256 *res) -{ - SHA256_Final(res->u.u8, &ctx->c); - invalidate_sha256(ctx); -} -#else -static uint32_t Ch(uint32_t x, uint32_t y, uint32_t z) -{ - return z ^ (x & (y ^ z)); -} -static uint32_t Maj(uint32_t x, uint32_t y, uint32_t z) -{ - return (x & y) | (z & (x | y)); -} -static uint32_t Sigma0(uint32_t x) -{ - return (x >> 2 | x << 30) ^ (x >> 13 | x << 19) ^ (x >> 22 | x << 10); -} -static uint32_t Sigma1(uint32_t x) -{ - return (x >> 6 | x << 26) ^ (x >> 11 | x << 21) ^ (x >> 25 | x << 7); -} -static uint32_t sigma0(uint32_t x) -{ - return (x >> 7 | x << 25) ^ (x >> 18 | x << 14) ^ (x >> 3); -} -static uint32_t sigma1(uint32_t x) -{ - return (x >> 17 | x << 15) ^ (x >> 19 | x << 13) ^ (x >> 10); -} - -/** One round of SHA-256. */ -static void Round(uint32_t a, uint32_t b, uint32_t c, uint32_t *d, uint32_t e, uint32_t f, uint32_t g, uint32_t *h, uint32_t k, uint32_t w) -{ - uint32_t t1 = *h + Sigma1(e) + Ch(e, f, g) + k + w; - uint32_t t2 = Sigma0(a) + Maj(a, b, c); - *d += t1; - *h = t1 + t2; -} - -/** Perform one SHA-256 transformation, processing a 64-byte chunk. */ -static void Transform(uint32_t *s, const uint32_t *chunk) -{ - uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7]; - uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15; - - Round(a, b, c, &d, e, f, g, &h, 0x428a2f98, w0 = be32_to_cpu(chunk[0])); - Round(h, a, b, &c, d, e, f, &g, 0x71374491, w1 = be32_to_cpu(chunk[1])); - Round(g, h, a, &b, c, d, e, &f, 0xb5c0fbcf, w2 = be32_to_cpu(chunk[2])); - Round(f, g, h, &a, b, c, d, &e, 0xe9b5dba5, w3 = be32_to_cpu(chunk[3])); - Round(e, f, g, &h, a, b, c, &d, 0x3956c25b, w4 = be32_to_cpu(chunk[4])); - Round(d, e, f, &g, h, a, b, &c, 0x59f111f1, w5 = be32_to_cpu(chunk[5])); - Round(c, d, e, &f, g, h, a, &b, 0x923f82a4, w6 = be32_to_cpu(chunk[6])); - Round(b, c, d, &e, f, g, h, &a, 0xab1c5ed5, w7 = be32_to_cpu(chunk[7])); - Round(a, b, c, &d, e, f, g, &h, 0xd807aa98, w8 = be32_to_cpu(chunk[8])); - Round(h, a, b, &c, d, e, f, &g, 0x12835b01, w9 = be32_to_cpu(chunk[9])); - Round(g, h, a, &b, c, d, e, &f, 0x243185be, w10 = be32_to_cpu(chunk[10])); - Round(f, g, h, &a, b, c, d, &e, 0x550c7dc3, w11 = be32_to_cpu(chunk[11])); - Round(e, f, g, &h, a, b, c, &d, 0x72be5d74, w12 = be32_to_cpu(chunk[12])); - Round(d, e, f, &g, h, a, b, &c, 0x80deb1fe, w13 = be32_to_cpu(chunk[13])); - Round(c, d, e, &f, g, h, a, &b, 0x9bdc06a7, w14 = be32_to_cpu(chunk[14])); - Round(b, c, d, &e, f, g, h, &a, 0xc19bf174, w15 = be32_to_cpu(chunk[15])); - - Round(a, b, c, &d, e, f, g, &h, 0xe49b69c1, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, &c, d, e, f, &g, 0xefbe4786, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, &b, c, d, e, &f, 0x0fc19dc6, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, &a, b, c, d, &e, 0x240ca1cc, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, &h, a, b, c, &d, 0x2de92c6f, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, &g, h, a, b, &c, 0x4a7484aa, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, &f, g, h, a, &b, 0x5cb0a9dc, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, &e, f, g, h, &a, 0x76f988da, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, &d, e, f, g, &h, 0x983e5152, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, &c, d, e, f, &g, 0xa831c66d, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, &b, c, d, e, &f, 0xb00327c8, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, &a, b, c, d, &e, 0xbf597fc7, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, &h, a, b, c, &d, 0xc6e00bf3, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, &g, h, a, b, &c, 0xd5a79147, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, &f, g, h, a, &b, 0x06ca6351, w14 += sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, &e, f, g, h, &a, 0x14292967, w15 += sigma1(w13) + w8 + sigma0(w0)); - - Round(a, b, c, &d, e, f, g, &h, 0x27b70a85, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, &c, d, e, f, &g, 0x2e1b2138, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, &b, c, d, e, &f, 0x4d2c6dfc, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, &a, b, c, d, &e, 0x53380d13, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, &h, a, b, c, &d, 0x650a7354, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, &g, h, a, b, &c, 0x766a0abb, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, &f, g, h, a, &b, 0x81c2c92e, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, &e, f, g, h, &a, 0x92722c85, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, &d, e, f, g, &h, 0xa2bfe8a1, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, &c, d, e, f, &g, 0xa81a664b, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, &b, c, d, e, &f, 0xc24b8b70, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, &a, b, c, d, &e, 0xc76c51a3, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, &h, a, b, c, &d, 0xd192e819, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, &g, h, a, b, &c, 0xd6990624, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, &f, g, h, a, &b, 0xf40e3585, w14 += sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, &e, f, g, h, &a, 0x106aa070, w15 += sigma1(w13) + w8 + sigma0(w0)); - - Round(a, b, c, &d, e, f, g, &h, 0x19a4c116, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, &c, d, e, f, &g, 0x1e376c08, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, &b, c, d, e, &f, 0x2748774c, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, &a, b, c, d, &e, 0x34b0bcb5, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, &h, a, b, c, &d, 0x391c0cb3, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, &g, h, a, b, &c, 0x4ed8aa4a, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, &f, g, h, a, &b, 0x5b9cca4f, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, &e, f, g, h, &a, 0x682e6ff3, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, &d, e, f, g, &h, 0x748f82ee, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, &c, d, e, f, &g, 0x78a5636f, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, &b, c, d, e, &f, 0x84c87814, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, &a, b, c, d, &e, 0x8cc70208, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, &h, a, b, c, &d, 0x90befffa, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, &g, h, a, b, &c, 0xa4506ceb, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, &f, g, h, a, &b, 0xbef9a3f7, w14 + sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, &e, f, g, h, &a, 0xc67178f2, w15 + sigma1(w13) + w8 + sigma0(w0)); - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - s[5] += f; - s[6] += g; - s[7] += h; -} - -static void add(struct sha256_ctx *ctx, const void *p, size_t len) -{ - const unsigned char *data = p; - size_t bufsize = ctx->bytes % 64; - - if (bufsize + len >= 64) { - /* Fill the buffer, and process it. */ - memcpy(ctx->buf.u8 + bufsize, data, 64 - bufsize); - ctx->bytes += 64 - bufsize; - data += 64 - bufsize; - len -= 64 - bufsize; - Transform(ctx->s, ctx->buf.u32); - bufsize = 0; - } - - while (len >= 64) { - /* Process full chunks directly from the source. */ - if (alignment_ok(data, sizeof(uint32_t))) - Transform(ctx->s, (const uint32_t *)data); - else { - memcpy(ctx->buf.u8, data, sizeof(ctx->buf)); - Transform(ctx->s, ctx->buf.u32); - } - ctx->bytes += 64; - data += 64; - len -= 64; - } - - if (len) { - /* Fill the buffer with what remains. */ - memcpy(ctx->buf.u8 + bufsize, data, len); - ctx->bytes += len; - } -} - -void sha256_init(struct sha256_ctx *ctx) -{ - struct sha256_ctx init = SHA256_INIT; - *ctx = init; -} - -void sha256_update(struct sha256_ctx *ctx, const void *p, size_t size) -{ - check_sha256(ctx); - add(ctx, p, size); -} - -void sha256_done(struct sha256_ctx *ctx, struct sha256 *res) -{ - static const unsigned char pad[64] = {0x80}; - uint64_t sizedesc; - size_t i; - - sizedesc = cpu_to_be64((uint64_t)ctx->bytes << 3); - /* Add '1' bit to terminate, then all 0 bits, up to next block - 8. */ - add(ctx, pad, 1 + ((128 - 8 - (ctx->bytes % 64) - 1) % 64)); - /* Add number of bits of data (big endian) */ - add(ctx, &sizedesc, 8); - for (i = 0; i < sizeof(ctx->s) / sizeof(ctx->s[0]); i++) - res->u.u32[i] = cpu_to_be32(ctx->s[i]); - invalidate_sha256(ctx); -} -#endif - -void sha256(struct sha256 *sha, const void *p, size_t size) -{ - struct sha256_ctx ctx; - - sha256_init(&ctx); - sha256_update(&ctx, p, size); - sha256_done(&ctx, sha); - CCAN_CLEAR_MEMORY(&ctx, sizeof(ctx)); -} - -void sha256_u8(struct sha256_ctx *ctx, uint8_t v) -{ - sha256_update(ctx, &v, sizeof(v)); -} - -void sha256_u16(struct sha256_ctx *ctx, uint16_t v) -{ - sha256_update(ctx, &v, sizeof(v)); -} - -void sha256_u32(struct sha256_ctx *ctx, uint32_t v) -{ - sha256_update(ctx, &v, sizeof(v)); -} - -void sha256_u64(struct sha256_ctx *ctx, uint64_t v) -{ - sha256_update(ctx, &v, sizeof(v)); -} - -/* Add as little-endian */ -void sha256_le16(struct sha256_ctx *ctx, uint16_t v) -{ - leint16_t lev = cpu_to_le16(v); - sha256_update(ctx, &lev, sizeof(lev)); -} - -void sha256_le32(struct sha256_ctx *ctx, uint32_t v) -{ - leint32_t lev = cpu_to_le32(v); - sha256_update(ctx, &lev, sizeof(lev)); -} - -void sha256_le64(struct sha256_ctx *ctx, uint64_t v) -{ - leint64_t lev = cpu_to_le64(v); - sha256_update(ctx, &lev, sizeof(lev)); -} - -/* Add as big-endian */ -void sha256_be16(struct sha256_ctx *ctx, uint16_t v) -{ - beint16_t bev = cpu_to_be16(v); - sha256_update(ctx, &bev, sizeof(bev)); -} - -void sha256_be32(struct sha256_ctx *ctx, uint32_t v) -{ - beint32_t bev = cpu_to_be32(v); - sha256_update(ctx, &bev, sizeof(bev)); -} - -void sha256_be64(struct sha256_ctx *ctx, uint64_t v) -{ - beint64_t bev = cpu_to_be64(v); - sha256_update(ctx, &bev, sizeof(bev)); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha256/sha256.h b/external/libwally-core/src/ccan/ccan/crypto/sha256/sha256.h deleted file mode 100644 index fe44aa645..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha256/sha256.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef CCAN_CRYPTO_SHA256_H -#define CCAN_CRYPTO_SHA256_H -/* BSD-MIT - see LICENSE file for details */ -#include "config.h" -#include -#include - -/* Uncomment this to use openssl's SHA256 routines (and link with -lcrypto) */ -/*#define CCAN_CRYPTO_SHA256_USE_OPENSSL 1*/ - -#ifdef CCAN_CRYPTO_SHA256_USE_OPENSSL -#include -#endif - -/** - * struct sha256 - structure representing a completed SHA256. - * @u.u8: an unsigned char array. - * @u.u32: a 32-bit integer array. - * - * Other fields may be added to the union in future. - */ -struct sha256 { - union { - uint32_t u32[8]; - unsigned char u8[32]; - } u; -}; - -/** - * sha256 - return sha256 of an object. - * @sha256: the sha256 to fill in - * @p: pointer to memory, - * @size: the number of bytes pointed to by @p - * - * The bytes pointed to by @p is SHA256 hashed into @sha256. This is - * equivalent to sha256_init(), sha256_update() then sha256_done(). - */ -void sha256(struct sha256 *sha, const void *p, size_t size); - -/** - * struct sha256_ctx - structure to store running context for sha256 - */ -struct sha256_ctx { -#ifdef CCAN_CRYPTO_SHA256_USE_OPENSSL - SHA256_CTX c; -#else - uint32_t s[8]; - union { - uint32_t u32[16]; - unsigned char u8[64]; - } buf; - size_t bytes; -#endif -}; - -/** - * sha256_init - initialize an SHA256 context. - * @ctx: the sha256_ctx to initialize - * - * This must be called before sha256_update or sha256_done, or - * alternately you can assign SHA256_INIT. - * - * If it was already initialized, this forgets anything which was - * hashed before. - * - * Example: - * static void hash_all(const char **arr, struct sha256 *hash) - * { - * size_t i; - * struct sha256_ctx ctx; - * - * sha256_init(&ctx); - * for (i = 0; arr[i]; i++) - * sha256_update(&ctx, arr[i], strlen(arr[i])); - * sha256_done(&ctx, hash); - * } - */ -void sha256_init(struct sha256_ctx *ctx); - -/** - * SHA256_INIT - initializer for an SHA256 context. - * - * This can be used to staticly initialize an SHA256 context (instead - * of sha256_init()). - * - * Example: - * static void hash_all(const char **arr, struct sha256 *hash) - * { - * size_t i; - * struct sha256_ctx ctx = SHA256_INIT; - * - * for (i = 0; arr[i]; i++) - * sha256_update(&ctx, arr[i], strlen(arr[i])); - * sha256_done(&ctx, hash); - * } - */ -#ifdef CCAN_CRYPTO_SHA256_USE_OPENSSL -#define SHA256_INIT \ - { { { 0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, \ - 0x510e527ful, 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul }, \ - 0x0, 0x0, \ - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, \ - 0x0, 0x20 } } -#else -#define SHA256_INIT \ - { { 0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, \ - 0x510e527ful, 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul }, \ - { { 0 } }, 0 } -#endif - -/** - * sha256_update - include some memory in the hash. - * @ctx: the sha256_ctx to use - * @p: pointer to memory, - * @size: the number of bytes pointed to by @p - * - * You can call this multiple times to hash more data, before calling - * sha256_done(). - */ -void sha256_update(struct sha256_ctx *ctx, const void *p, size_t size); - -/** - * sha256_done - finish SHA256 and return the hash - * @ctx: the sha256_ctx to complete - * @res: the hash to return. - * - * Note that @ctx is *destroyed* by this, and must be reinitialized. - * To avoid that, pass a copy instead. - */ -void sha256_done(struct sha256_ctx *sha256, struct sha256 *res); - -/* Add various types to an SHA256 hash */ -void sha256_u8(struct sha256_ctx *ctx, uint8_t v); -void sha256_u16(struct sha256_ctx *ctx, uint16_t v); -void sha256_u32(struct sha256_ctx *ctx, uint32_t v); -void sha256_u64(struct sha256_ctx *ctx, uint64_t v); - -/* Add as little-endian */ -void sha256_le16(struct sha256_ctx *ctx, uint16_t v); -void sha256_le32(struct sha256_ctx *ctx, uint32_t v); -void sha256_le64(struct sha256_ctx *ctx, uint64_t v); - -/* Add as big-endian */ -void sha256_be16(struct sha256_ctx *ctx, uint16_t v); -void sha256_be32(struct sha256_ctx *ctx, uint32_t v); -void sha256_be64(struct sha256_ctx *ctx, uint64_t v); -#endif /* CCAN_CRYPTO_SHA256_H */ diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-33-bit-test.c b/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-33-bit-test.c deleted file mode 100644 index bde91e1c8..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-33-bit-test.c +++ /dev/null @@ -1,54 +0,0 @@ -#include -/* Include the C files directly. */ -#include -#include -#include - -/* This is the test introduced for SHA-3, which checks for 33-bit overflow: - "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno" - 16777216 times. -*/ -static uint32_t expected[] = { - CPU_TO_BE32(0x50e72a0e), CPU_TO_BE32(0x26442fe2), - CPU_TO_BE32(0x552dc393), CPU_TO_BE32(0x8ac58658), - CPU_TO_BE32(0x228c0cbf), CPU_TO_BE32(0xb1d2ca87), - CPU_TO_BE32(0x2ae43526), CPU_TO_BE32(0x6fcd055e) -}; - -/* Produced by actually running the code on x86. */ -static const struct sha256_ctx after_16M_by_64 = { -#ifdef CCAN_CRYPTO_SHA256_USE_OPENSSL - { { LE32_TO_CPU(0x515e3215), LE32_TO_CPU(0x592f4ae0), - LE32_TO_CPU(0xd407a8fc), LE32_TO_CPU(0x1fad409b), - LE32_TO_CPU(0x51fa46cc), LE32_TO_CPU(0xea528ae5), - LE32_TO_CPU(0x5fa58ebb), LE32_TO_CPU(0x8be97931) }, - 0x0, 0x2, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - 0x0, 0x20 } -#else - { LE32_TO_CPU(0x515e3215), LE32_TO_CPU(0x592f4ae0), - LE32_TO_CPU(0xd407a8fc), LE32_TO_CPU(0x1fad409b), - LE32_TO_CPU(0x51fa46cc), LE32_TO_CPU(0xea528ae5), - LE32_TO_CPU(0x5fa58ebb), LE32_TO_CPU(0x8be97931) }, - 1073741824, - { .u32 = { 0x64636261, 0x68676665, 0x65646362, 0x69686766, - 0x66656463, 0x6a696867, 0x67666564, 0x6b6a6968 } } -#endif -}; - -int main(void) -{ - struct sha256 h; - struct sha256_ctx ctx; - - /* This is how many tests you plan to run */ - plan_tests(1); - - ctx = after_16M_by_64; - sha256_done(&ctx, &h); - - ok1(memcmp(&h.u, expected, sizeof(expected)) == 0); - - /* This exits depending on whether all tests passed */ - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-lotsa-data.c b/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-lotsa-data.c deleted file mode 100644 index 83c88f705..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-lotsa-data.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -/* Include the C files directly. */ -#include -#include - -int main(void) -{ - struct sha256 h, expected; - static const char zeroes[1000]; - size_t i; - - plan_tests(63); - - /* Test different alignments. */ - sha256(&expected, zeroes, sizeof(zeroes) - 64); - for (i = 1; i < 64; i++) { - sha256(&h, zeroes + i, sizeof(zeroes) - 64); - ok1(memcmp(&h, &expected, sizeof(h)) == 0); - } - - /* This exits depending on whether all tests passed */ - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-test-vectors.c b/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-test-vectors.c deleted file mode 100644 index a64c35e46..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-test-vectors.c +++ /dev/null @@ -1,83 +0,0 @@ -#include -/* Include the C files directly. */ -#include -#include - -/* Test vectors. */ -struct test { - const char *test; - size_t repetitions; - beint32_t result[8]; -}; - -static struct test tests[] = { - { "", 1, - { CPU_TO_BE32(0xe3b0c442), CPU_TO_BE32(0x98fc1c14), - CPU_TO_BE32(0x9afbf4c8), CPU_TO_BE32(0x996fb924), - CPU_TO_BE32(0x27ae41e4), CPU_TO_BE32(0x649b934c), - CPU_TO_BE32(0xa495991b), CPU_TO_BE32(0x7852b855) } }, - { "abc", 1, - { CPU_TO_BE32(0xba7816bf), CPU_TO_BE32(0x8f01cfea), - CPU_TO_BE32(0x414140de), CPU_TO_BE32(0x5dae2223), - CPU_TO_BE32(0xb00361a3), CPU_TO_BE32(0x96177a9c), - CPU_TO_BE32(0xb410ff61), CPU_TO_BE32(0xf20015ad) } }, - { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 1, - { CPU_TO_BE32(0x248d6a61), CPU_TO_BE32(0xd20638b8), - CPU_TO_BE32(0xe5c02693), CPU_TO_BE32(0x0c3e6039), - CPU_TO_BE32(0xa33ce459), CPU_TO_BE32(0x64ff2167), - CPU_TO_BE32(0xf6ecedd4), CPU_TO_BE32(0x19db06c1) } }, - { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 1, - { CPU_TO_BE32(0xcf5b16a7), CPU_TO_BE32(0x78af8380), - CPU_TO_BE32(0x036ce59e), CPU_TO_BE32(0x7b049237), - CPU_TO_BE32(0x0b249b11), CPU_TO_BE32(0xe8f07a51), - CPU_TO_BE32(0xafac4503), CPU_TO_BE32(0x7afee9d1) } }, - { "a", 1000000, - { CPU_TO_BE32(0xcdc76e5c), CPU_TO_BE32(0x9914fb92), - CPU_TO_BE32(0x81a1c7e2), CPU_TO_BE32(0x84d73e67), - CPU_TO_BE32(0xf1809a48), CPU_TO_BE32(0xa497200e), - CPU_TO_BE32(0x046d39cc), CPU_TO_BE32(0xc7112cd0) } } -#if 0 /* Good test, but takes ages! */ - , { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno", 16777216, - { CPU_TO_BE32(0x50e72a0e), CPU_TO_BE32(0x26442fe2), - CPU_TO_BE32(0x552dc393), CPU_TO_BE32(0x8ac58658), - CPU_TO_BE32(0x228c0cbf), CPU_TO_BE32(0xb1d2ca87), - CPU_TO_BE32(0x2ae43526), CPU_TO_BE32(0x6fcd055e) } } -#endif -}; - -static bool do_test(const struct test *t, bool single) -{ - struct sha256 h; - - if (single) { - if (t->repetitions != 1) - return true; - sha256(&h, t->test, strlen(t->test)); - } else { - struct sha256_ctx ctx = SHA256_INIT; - size_t i; - - for (i = 0; i < t->repetitions; i++) - sha256_update(&ctx, t->test, strlen(t->test)); - sha256_done(&ctx, &h); - } - - return memcmp(&h.u, t->result, sizeof(t->result)) == 0; -} - -int main(void) -{ - size_t i; - - /* This is how many tests you plan to run */ - plan_tests(sizeof(tests) / sizeof(struct test) * 2); - - for (i = 0; i < sizeof(tests) / sizeof(struct test); i++) - ok1(do_test(&tests[i], false)); - - for (i = 0; i < sizeof(tests) / sizeof(struct test); i++) - ok1(do_test(&tests[i], true)); - - /* This exits depending on whether all tests passed */ - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-types.c b/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-types.c deleted file mode 100644 index 02b2f7a86..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha256/test/run-types.c +++ /dev/null @@ -1,63 +0,0 @@ -#include -/* Include the C files directly. */ -#include -#include - -static unsigned char arr[] = { - 0x12, -#if HAVE_BIG_ENDIAN - /* u16 */ - 0x12, 0x34, - /* u32 */ - 0x12, 0x34, 0x56, 0x78, - /* u64 */ - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, -#else - /* u16 */ - 0x34, 0x12, - /* u32 */ - 0x78, 0x56, 0x34, 0x12, - /* u64 */ - 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, -#endif - /* le16 */ - 0x34, 0x12, - /* le32 */ - 0x78, 0x56, 0x34, 0x12, - /* le64 */ - 0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, - /* be16 */ - 0x12, 0x34, - /* be32 */ - 0x12, 0x34, 0x56, 0x78, - /* be64 */ - 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 -}; - -int main(void) -{ - struct sha256 h, expected; - struct sha256_ctx ctx; - - /* This is how many tests you plan to run */ - plan_tests(1); - - sha256_init(&ctx); - sha256_u8(&ctx, 0x12); - sha256_u16(&ctx, 0x1234); - sha256_u32(&ctx, 0x12345678); - sha256_u64(&ctx, 0x123456789abcdef0ULL); - sha256_le16(&ctx, 0x1234); - sha256_le32(&ctx, 0x12345678); - sha256_le64(&ctx, 0x123456789abcdef0ULL); - sha256_be16(&ctx, 0x1234); - sha256_be32(&ctx, 0x12345678); - sha256_be64(&ctx, 0x123456789abcdef0ULL); - sha256_done(&ctx, &h); - - sha256(&expected, arr, sizeof(arr)); - ok1(memcmp(&h, &expected, sizeof(h)) == 0); - - /* This exits depending on whether all tests passed */ - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha512/LICENSE b/external/libwally-core/src/ccan/ccan/crypto/sha512/LICENSE deleted file mode 120000 index 2b1feca54..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha512/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../../licenses/BSD-MIT \ No newline at end of file diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha512/_info b/external/libwally-core/src/ccan/ccan/crypto/sha512/_info deleted file mode 100644 index bf14e173d..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha512/_info +++ /dev/null @@ -1,55 +0,0 @@ -#include "config.h" -#include -#include - -/** - * crypto/sha512 - implementation of SHA-2 with 512 bit digest. - * - * This code is either a wrapper for openssl (if CCAN_CRYPTO_SHA512_USE_OPENSSL - * is defined) or an open-coded implementation based on Bitcoin's. - * - * License: BSD-MIT - * Maintainer: Rusty Russell - * - * Example: - * #include - * #include - * #include - * #include - * - * // Simple demonstration: idential strings will have the same hash, but - * // two different strings will not. - * int main(int argc, char *argv[]) - * { - * struct sha512 hash1, hash2; - * - * if (argc != 3) - * errx(1, "Usage: %s ", argv[0]); - * - * sha512(&hash1, argv[1], strlen(argv[1])); - * sha512(&hash2, argv[2], strlen(argv[2])); - * printf("Hash is %s\n", memcmp(&hash1, &hash2, sizeof(hash1)) - * ? "different" : "same"); - * return 0; - * } - */ -int main(int argc, char *argv[]) -{ - /* Expect exactly one argument */ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) { - printf("ccan/endian\n"); - return 0; - } - - if (strcmp(argv[1], "libs") == 0) { -#ifdef CCAN_CRYPTO_SHA512_USE_OPENSSL - printf("crypto\n"); -#endif - return 0; - } - - return 1; -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha512/sha512.c b/external/libwally-core/src/ccan/ccan/crypto/sha512/sha512.c deleted file mode 100644 index ab56734bd..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha512/sha512.c +++ /dev/null @@ -1,260 +0,0 @@ -/* MIT (BSD) license - see LICENSE file for details */ -/* SHA512 core code translated from the Bitcoin project's C++: - * - * src/crypto/sha512.cpp commit f914f1a746d7f91951c1da262a4a749dd3ebfa71 - * Copyright (c) 2014 The Bitcoin Core developers - * Distributed under the MIT software license, see the accompanying - * file COPYING or http://www.opensource.org/licenses/mit-license.php. - */ -#include -#include -#include -#include -#include -#include - -static void invalidate_sha512(struct sha512_ctx *ctx) -{ -#ifdef CCAN_CRYPTO_SHA512_USE_OPENSSL - ctx->c.md_len = 0; -#else - ctx->bytes = (size_t)-1; -#endif -} - -static void check_sha512(struct sha512_ctx *ctx UNUSED) -{ -#ifdef CCAN_CRYPTO_SHA512_USE_OPENSSL - assert(ctx->c.md_len != 0); -#else - assert(ctx->bytes != (size_t)-1); -#endif -} - -#ifdef CCAN_CRYPTO_SHA512_USE_OPENSSL -void sha512_init(struct sha512_ctx *ctx) -{ - SHA512_Init(&ctx->c); -} - -void sha512_update(struct sha512_ctx *ctx, const void *p, size_t size) -{ - check_sha512(ctx); - SHA512_Update(&ctx->c, p, size); -} - -void sha512_done(struct sha512_ctx *ctx, struct sha512 *res) -{ - SHA512_Final(res->u.u8, &ctx->c); - invalidate_sha512(ctx); -} -#else -static uint64_t Ch(uint64_t x, uint64_t y, uint64_t z) -{ - return z ^ (x & (y ^ z)); -} -static uint64_t Maj(uint64_t x, uint64_t y, uint64_t z) -{ - return (x & y) | (z & (x | y)); -} -static uint64_t Sigma0(uint64_t x) -{ - return (x >> 28 | x << 36) ^ (x >> 34 | x << 30) ^ (x >> 39 | x << 25); -} -static uint64_t Sigma1(uint64_t x) -{ - return (x >> 14 | x << 50) ^ (x >> 18 | x << 46) ^ (x >> 41 | x << 23); -} -static uint64_t sigma0(uint64_t x) -{ - return (x >> 1 | x << 63) ^ (x >> 8 | x << 56) ^ (x >> 7); -} -static uint64_t sigma1(uint64_t x) -{ - return (x >> 19 | x << 45) ^ (x >> 61 | x << 3) ^ (x >> 6); -} - -/** One round of SHA-512. */ -static void Round(uint64_t a, uint64_t b, uint64_t c, uint64_t *d, uint64_t e, uint64_t f, uint64_t g, uint64_t *h, uint64_t k, uint64_t w) -{ - uint64_t t1 = *h + Sigma1(e) + Ch(e, f, g) + k + w; - uint64_t t2 = Sigma0(a) + Maj(a, b, c); - *d += t1; - *h = t1 + t2; -} - -/** Perform one SHA-512 transformation, processing a 128-byte chunk. */ -static void Transform(uint64_t *s, const uint64_t *chunk) -{ - uint64_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7]; - uint64_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15; - - Round(a, b, c, &d, e, f, g, &h, 0x428a2f98d728ae22ull, w0 = be64_to_cpu(chunk[0])); - Round(h, a, b, &c, d, e, f, &g, 0x7137449123ef65cdull, w1 = be64_to_cpu(chunk[1])); - Round(g, h, a, &b, c, d, e, &f, 0xb5c0fbcfec4d3b2full, w2 = be64_to_cpu(chunk[2])); - Round(f, g, h, &a, b, c, d, &e, 0xe9b5dba58189dbbcull, w3 = be64_to_cpu(chunk[3])); - Round(e, f, g, &h, a, b, c, &d, 0x3956c25bf348b538ull, w4 = be64_to_cpu(chunk[4])); - Round(d, e, f, &g, h, a, b, &c, 0x59f111f1b605d019ull, w5 = be64_to_cpu(chunk[5])); - Round(c, d, e, &f, g, h, a, &b, 0x923f82a4af194f9bull, w6 = be64_to_cpu(chunk[6])); - Round(b, c, d, &e, f, g, h, &a, 0xab1c5ed5da6d8118ull, w7 = be64_to_cpu(chunk[7])); - Round(a, b, c, &d, e, f, g, &h, 0xd807aa98a3030242ull, w8 = be64_to_cpu(chunk[8])); - Round(h, a, b, &c, d, e, f, &g, 0x12835b0145706fbeull, w9 = be64_to_cpu(chunk[9])); - Round(g, h, a, &b, c, d, e, &f, 0x243185be4ee4b28cull, w10 = be64_to_cpu(chunk[10])); - Round(f, g, h, &a, b, c, d, &e, 0x550c7dc3d5ffb4e2ull, w11 = be64_to_cpu(chunk[11])); - Round(e, f, g, &h, a, b, c, &d, 0x72be5d74f27b896full, w12 = be64_to_cpu(chunk[12])); - Round(d, e, f, &g, h, a, b, &c, 0x80deb1fe3b1696b1ull, w13 = be64_to_cpu(chunk[13])); - Round(c, d, e, &f, g, h, a, &b, 0x9bdc06a725c71235ull, w14 = be64_to_cpu(chunk[14])); - Round(b, c, d, &e, f, g, h, &a, 0xc19bf174cf692694ull, w15 = be64_to_cpu(chunk[15])); - - Round(a, b, c, &d, e, f, g, &h, 0xe49b69c19ef14ad2ull, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, &c, d, e, f, &g, 0xefbe4786384f25e3ull, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, &b, c, d, e, &f, 0x0fc19dc68b8cd5b5ull, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, &a, b, c, d, &e, 0x240ca1cc77ac9c65ull, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, &h, a, b, c, &d, 0x2de92c6f592b0275ull, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, &g, h, a, b, &c, 0x4a7484aa6ea6e483ull, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, &f, g, h, a, &b, 0x5cb0a9dcbd41fbd4ull, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, &e, f, g, h, &a, 0x76f988da831153b5ull, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, &d, e, f, g, &h, 0x983e5152ee66dfabull, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, &c, d, e, f, &g, 0xa831c66d2db43210ull, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, &b, c, d, e, &f, 0xb00327c898fb213full, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, &a, b, c, d, &e, 0xbf597fc7beef0ee4ull, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, &h, a, b, c, &d, 0xc6e00bf33da88fc2ull, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, &g, h, a, b, &c, 0xd5a79147930aa725ull, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, &f, g, h, a, &b, 0x06ca6351e003826full, w14 += sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, &e, f, g, h, &a, 0x142929670a0e6e70ull, w15 += sigma1(w13) + w8 + sigma0(w0)); - - Round(a, b, c, &d, e, f, g, &h, 0x27b70a8546d22ffcull, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, &c, d, e, f, &g, 0x2e1b21385c26c926ull, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, &b, c, d, e, &f, 0x4d2c6dfc5ac42aedull, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, &a, b, c, d, &e, 0x53380d139d95b3dfull, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, &h, a, b, c, &d, 0x650a73548baf63deull, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, &g, h, a, b, &c, 0x766a0abb3c77b2a8ull, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, &f, g, h, a, &b, 0x81c2c92e47edaee6ull, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, &e, f, g, h, &a, 0x92722c851482353bull, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, &d, e, f, g, &h, 0xa2bfe8a14cf10364ull, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, &c, d, e, f, &g, 0xa81a664bbc423001ull, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, &b, c, d, e, &f, 0xc24b8b70d0f89791ull, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, &a, b, c, d, &e, 0xc76c51a30654be30ull, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, &h, a, b, c, &d, 0xd192e819d6ef5218ull, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, &g, h, a, b, &c, 0xd69906245565a910ull, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, &f, g, h, a, &b, 0xf40e35855771202aull, w14 += sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, &e, f, g, h, &a, 0x106aa07032bbd1b8ull, w15 += sigma1(w13) + w8 + sigma0(w0)); - - Round(a, b, c, &d, e, f, g, &h, 0x19a4c116b8d2d0c8ull, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, &c, d, e, f, &g, 0x1e376c085141ab53ull, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, &b, c, d, e, &f, 0x2748774cdf8eeb99ull, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, &a, b, c, d, &e, 0x34b0bcb5e19b48a8ull, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, &h, a, b, c, &d, 0x391c0cb3c5c95a63ull, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, &g, h, a, b, &c, 0x4ed8aa4ae3418acbull, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, &f, g, h, a, &b, 0x5b9cca4f7763e373ull, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, &e, f, g, h, &a, 0x682e6ff3d6b2b8a3ull, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, &d, e, f, g, &h, 0x748f82ee5defb2fcull, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, &c, d, e, f, &g, 0x78a5636f43172f60ull, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, &b, c, d, e, &f, 0x84c87814a1f0ab72ull, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, &a, b, c, d, &e, 0x8cc702081a6439ecull, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, &h, a, b, c, &d, 0x90befffa23631e28ull, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, &g, h, a, b, &c, 0xa4506cebde82bde9ull, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, &f, g, h, a, &b, 0xbef9a3f7b2c67915ull, w14 += sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, &e, f, g, h, &a, 0xc67178f2e372532bull, w15 += sigma1(w13) + w8 + sigma0(w0)); - - Round(a, b, c, &d, e, f, g, &h, 0xca273eceea26619cull, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, &c, d, e, f, &g, 0xd186b8c721c0c207ull, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, &b, c, d, e, &f, 0xeada7dd6cde0eb1eull, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, &a, b, c, d, &e, 0xf57d4f7fee6ed178ull, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, &h, a, b, c, &d, 0x06f067aa72176fbaull, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, &g, h, a, b, &c, 0x0a637dc5a2c898a6ull, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, &f, g, h, a, &b, 0x113f9804bef90daeull, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, &e, f, g, h, &a, 0x1b710b35131c471bull, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, &d, e, f, g, &h, 0x28db77f523047d84ull, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, &c, d, e, f, &g, 0x32caab7b40c72493ull, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, &b, c, d, e, &f, 0x3c9ebe0a15c9bebcull, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, &a, b, c, d, &e, 0x431d67c49c100d4cull, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, &h, a, b, c, &d, 0x4cc5d4becb3e42b6ull, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, &g, h, a, b, &c, 0x597f299cfc657e2aull, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, &f, g, h, a, &b, 0x5fcb6fab3ad6faecull, w14 + sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, &e, f, g, h, &a, 0x6c44198c4a475817ull, w15 + sigma1(w13) + w8 + sigma0(w0)); - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - s[5] += f; - s[6] += g; - s[7] += h; -} - -static void add(struct sha512_ctx *ctx, const void *p, size_t len) -{ - const unsigned char *data = p; - size_t bufsize = ctx->bytes % 128; - - if (bufsize + len >= 128) { - /* Fill the buffer, and process it. */ - memcpy(ctx->buf.u8 + bufsize, data, 128 - bufsize); - ctx->bytes += 128 - bufsize; - data += 128 - bufsize; - len -= 128 - bufsize; - Transform(ctx->s, ctx->buf.u64); - bufsize = 0; - } - - while (len >= 128) { - /* Process full chunks directly from the source. */ - if (alignment_ok(data, sizeof(uint64_t))) - Transform(ctx->s, (const uint64_t *)data); - else { - memcpy(ctx->buf.u8, data, sizeof(ctx->buf)); - Transform(ctx->s, ctx->buf.u64); - } - ctx->bytes += 128; - data += 128; - len -= 128; - } - - if (len) { - /* Fill the buffer with what remains. */ - memcpy(ctx->buf.u8 + bufsize, data, len); - ctx->bytes += len; - } -} - -void sha512_init(struct sha512_ctx *ctx) -{ - struct sha512_ctx init = SHA512_INIT; - *ctx = init; -} - -void sha512_update(struct sha512_ctx *ctx, const void *p, size_t size) -{ - check_sha512(ctx); - add(ctx, p, size); -} - -void sha512_done(struct sha512_ctx *ctx, struct sha512 *res) -{ - static const unsigned char pad[128] = { 0x80 }; - uint64_t sizedesc[2] = { 0, 0 }; - size_t i; - - sizedesc[1] = cpu_to_be64((uint64_t)ctx->bytes << 3); - - /* Add '1' bit to terminate, then all 0 bits, up to next block - 16. */ - add(ctx, pad, 1 + ((256 - 16 - (ctx->bytes % 128) - 1) % 128)); - /* Add number of bits of data (big endian) */ - add(ctx, sizedesc, sizeof(sizedesc)); - for (i = 0; i < sizeof(ctx->s) / sizeof(ctx->s[0]); i++) - res->u.u64[i] = cpu_to_be64(ctx->s[i]); - invalidate_sha512(ctx); -} -#endif /* CCAN_CRYPTO_SHA512_USE_OPENSSL */ - -void sha512(struct sha512 *sha, const void *p, size_t size) -{ - struct sha512_ctx ctx; - - sha512_init(&ctx); - sha512_update(&ctx, p, size); - sha512_done(&ctx, sha); - CCAN_CLEAR_MEMORY(&ctx, sizeof(ctx)); -} diff --git a/external/libwally-core/src/ccan/ccan/crypto/sha512/sha512.h b/external/libwally-core/src/ccan/ccan/crypto/sha512/sha512.h deleted file mode 100644 index 33f3df734..000000000 --- a/external/libwally-core/src/ccan/ccan/crypto/sha512/sha512.h +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef CCAN_CRYPTO_SHA512_H -#define CCAN_CRYPTO_SHA512_H -/* BSD-MIT - see LICENSE file for details */ -#include "config.h" -#include -#include - -/* Uncomment this to use openssl's SHA512 routines (and link with -lcrypto) */ -/*#define CCAN_CRYPTO_SHA512_USE_OPENSSL 1*/ - -#ifdef CCAN_CRYPTO_SHA512_USE_OPENSSL -#include -#endif - -/** - * struct sha512 - structure representing a completed SHA512. - * @u.u8: an unsigned char array. - * @u.u64: a 64-bit integer array. - * - * Other fields may be added to the union in future. - */ -struct sha512 { - union { - uint64_t u64[8]; - unsigned char u8[64]; - } u; -}; - -/** - * sha512 - return sha512 of an object. - * @sha512: the sha512 to fill in - * @p: pointer to memory, - * @size: the number of bytes pointed to by @p - * - * The bytes pointed to by @p is SHA512 hashed into @sha512. This is - * equivalent to sha512_init(), sha512_update() then sha512_done(). - */ -void sha512(struct sha512 *sha, const void *p, size_t size); - -/** - * struct sha512_ctx - structure to store running context for sha512 - */ -struct sha512_ctx { -#ifdef CCAN_CRYPTO_SHA512_USE_OPENSSL - SHA512_CTX c; -#else - uint64_t s[8]; - union { - uint64_t u64[16]; - unsigned char u8[128]; - } buf; - size_t bytes; -#endif -}; - -/** - * sha512_init - initialize an SHA512 context. - * @ctx: the sha512_ctx to initialize - * - * This must be called before sha512_update or sha512_done, or - * alternately you can assign SHA512_INIT. - * - * If it was already initialized, this forgets anything which was - * hashed before. - * - * Example: - * static void hash_all(const char **arr, struct sha512 *hash) - * { - * size_t i; - * struct sha512_ctx ctx; - * - * sha512_init(&ctx); - * for (i = 0; arr[i]; i++) - * sha512_update(&ctx, arr[i], strlen(arr[i])); - * sha512_done(&ctx, hash); - * } - */ -void sha512_init(struct sha512_ctx *ctx); - -/** - * SHA512_INIT - initializer for an SHA512 context. - * - * This can be used to statically initialize an SHA512 context (instead - * of sha512_init()). - * - * Example: - * static void hash_all(const char **arr, struct sha512 *hash) - * { - * size_t i; - * struct sha512_ctx ctx = SHA512_INIT; - * - * for (i = 0; arr[i]; i++) - * sha512_update(&ctx, arr[i], strlen(arr[i])); - * sha512_done(&ctx, hash); - * } - */ -#ifdef CCAN_CRYPTO_SHA512_USE_OPENSSL - { { { 0x6a09e667f3bcc908ull, 0xbb67ae8584caa73bull, \ - 0x3c6ef372fe94f82bull, 0xa54ff53a5f1d36f1ull, \ - 0x510e527fade682d1ull, 0x9b05688c2b3e6c1full, \ - 0x1f83d9abfb41bd6bull, 0x5be0cd19137e2179ull }, \ - 0, 0, \ - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, \ - 0, 0x40 } } -#else -#define SHA512_INIT \ - { { 0x6a09e667f3bcc908ull, 0xbb67ae8584caa73bull, \ - 0x3c6ef372fe94f82bull, 0xa54ff53a5f1d36f1ull, \ - 0x510e527fade682d1ull, 0x9b05688c2b3e6c1full, \ - 0x1f83d9abfb41bd6bull, 0x5be0cd19137e2179ull }, \ - { { 0 } }, 0 } -#endif - -/** - * sha512_update - include some memory in the hash. - * @ctx: the sha512_ctx to use - * @p: pointer to memory, - * @size: the number of bytes pointed to by @p - * - * You can call this multiple times to hash more data, before calling - * sha512_done(). - */ -void sha512_update(struct sha512_ctx *ctx, const void *p, size_t size); - -/** - * sha512_done - finish SHA512 and return the hash - * @ctx: the sha512_ctx to complete - * @res: the hash to return. - * - * Note that @ctx is *destroyed* by this, and must be reinitialized. - * To avoid that, pass a copy instead. - */ -void sha512_done(struct sha512_ctx *sha512, struct sha512 *res); - -#endif /* CCAN_CRYPTO_SHA512_H */ diff --git a/external/libwally-core/src/ccan/ccan/endian/LICENSE b/external/libwally-core/src/ccan/ccan/endian/LICENSE deleted file mode 120000 index b7951dabd..000000000 --- a/external/libwally-core/src/ccan/ccan/endian/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../licenses/CC0 \ No newline at end of file diff --git a/external/libwally-core/src/ccan/ccan/endian/_info b/external/libwally-core/src/ccan/ccan/endian/_info deleted file mode 100644 index efe5a8bbd..000000000 --- a/external/libwally-core/src/ccan/ccan/endian/_info +++ /dev/null @@ -1,55 +0,0 @@ -#include "config.h" -#include -#include - -/** - * endian - endian conversion macros for simple types - * - * Portable protocols (such as on-disk formats, or network protocols) - * are often defined to be a particular endian: little-endian (least - * significant bytes first) or big-endian (most significant bytes - * first). - * - * Similarly, some CPUs lay out values in memory in little-endian - * order (most commonly, Intel's 8086 and derivatives), or big-endian - * order (almost everyone else). - * - * This module provides conversion routines, inspired by the linux kernel. - * It also provides leint32_t, beint32_t etc typedefs, which are annotated for - * the sparse checker. - * - * Example: - * #include - * #include - * #include - * - * // - * int main(int argc, char *argv[]) - * { - * uint32_t value; - * - * if (argc != 2) - * errx(1, "Usage: %s ", argv[0]); - * - * value = atoi(argv[1]); - * printf("native: %08x\n", value); - * printf("little-endian: %08x\n", cpu_to_le32(value)); - * printf("big-endian: %08x\n", cpu_to_be32(value)); - * printf("byte-reversed: %08x\n", bswap_32(value)); - * exit(0); - * } - * - * License: License: CC0 (Public domain) - * Author: Rusty Russell - */ -int main(int argc, char *argv[]) -{ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) - /* Nothing */ - return 0; - - return 1; -} diff --git a/external/libwally-core/src/ccan/ccan/endian/endian.h b/external/libwally-core/src/ccan/ccan/endian/endian.h deleted file mode 100644 index 0c99cc802..000000000 --- a/external/libwally-core/src/ccan/ccan/endian/endian.h +++ /dev/null @@ -1,346 +0,0 @@ -/* CC0 (Public domain) - see LICENSE file for details */ -#ifndef CCAN_ENDIAN_H -#define CCAN_ENDIAN_H -#include -#include "config.h" - -/** - * BSWAP_16 - reverse bytes in a constant uint16_t value. - * @val: constant value whose bytes to swap. - * - * Designed to be usable in constant-requiring initializers. - * - * Example: - * struct mystruct { - * char buf[BSWAP_16(0x1234)]; - * }; - */ -#define BSWAP_16(val) \ - ((((uint16_t)(val) & 0x00ff) << 8) \ - | (((uint16_t)(val) & 0xff00) >> 8)) - -/** - * BSWAP_32 - reverse bytes in a constant uint32_t value. - * @val: constant value whose bytes to swap. - * - * Designed to be usable in constant-requiring initializers. - * - * Example: - * struct mystruct { - * char buf[BSWAP_32(0xff000000)]; - * }; - */ -#define BSWAP_32(val) \ - ((((uint32_t)(val) & 0x000000ff) << 24) \ - | (((uint32_t)(val) & 0x0000ff00) << 8) \ - | (((uint32_t)(val) & 0x00ff0000) >> 8) \ - | (((uint32_t)(val) & 0xff000000) >> 24)) - -/** - * BSWAP_64 - reverse bytes in a constant uint64_t value. - * @val: constantvalue whose bytes to swap. - * - * Designed to be usable in constant-requiring initializers. - * - * Example: - * struct mystruct { - * char buf[BSWAP_64(0xff00000000000000ULL)]; - * }; - */ -#define BSWAP_64(val) \ - ((((uint64_t)(val) & 0x00000000000000ffULL) << 56) \ - | (((uint64_t)(val) & 0x000000000000ff00ULL) << 40) \ - | (((uint64_t)(val) & 0x0000000000ff0000ULL) << 24) \ - | (((uint64_t)(val) & 0x00000000ff000000ULL) << 8) \ - | (((uint64_t)(val) & 0x000000ff00000000ULL) >> 8) \ - | (((uint64_t)(val) & 0x0000ff0000000000ULL) >> 24) \ - | (((uint64_t)(val) & 0x00ff000000000000ULL) >> 40) \ - | (((uint64_t)(val) & 0xff00000000000000ULL) >> 56)) - -#if HAVE_BYTESWAP_H -#include -#else -/** - * bswap_16 - reverse bytes in a uint16_t value. - * @val: value whose bytes to swap. - * - * Example: - * // Output contains "1024 is 4 as two bytes reversed" - * printf("1024 is %u as two bytes reversed\n", bswap_16(1024)); - */ -static inline uint16_t bswap_16(uint16_t val) -{ - return BSWAP_16(val); -} - -/** - * bswap_32 - reverse bytes in a uint32_t value. - * @val: value whose bytes to swap. - * - * Example: - * // Output contains "1024 is 262144 as four bytes reversed" - * printf("1024 is %u as four bytes reversed\n", bswap_32(1024)); - */ -static inline uint32_t bswap_32(uint32_t val) -{ - return BSWAP_32(val); -} -#endif /* !HAVE_BYTESWAP_H */ - -#if !HAVE_BSWAP_64 -/** - * bswap_64 - reverse bytes in a uint64_t value. - * @val: value whose bytes to swap. - * - * Example: - * // Output contains "1024 is 1125899906842624 as eight bytes reversed" - * printf("1024 is %llu as eight bytes reversed\n", - * (unsigned long long)bswap_64(1024)); - */ -static inline uint64_t bswap_64(uint64_t val) -{ - return BSWAP_64(val); -} -#endif - -/* Sanity check the defines. We don't handle weird endianness. */ -#if !HAVE_LITTLE_ENDIAN && !HAVE_BIG_ENDIAN -#error "Unknown endian" -#elif HAVE_LITTLE_ENDIAN && HAVE_BIG_ENDIAN -#error "Can't compile for both big and little endian." -#endif - -#ifdef __CHECKER__ -/* sparse needs forcing to remove bitwise attribute from ccan/short_types */ -#define ENDIAN_CAST __attribute__((force)) -#define ENDIAN_TYPE __attribute__((bitwise)) -#else -#define ENDIAN_CAST -#define ENDIAN_TYPE -#endif - -typedef uint64_t ENDIAN_TYPE leint64_t; -typedef uint64_t ENDIAN_TYPE beint64_t; -typedef uint32_t ENDIAN_TYPE leint32_t; -typedef uint32_t ENDIAN_TYPE beint32_t; -typedef uint16_t ENDIAN_TYPE leint16_t; -typedef uint16_t ENDIAN_TYPE beint16_t; - -#if HAVE_LITTLE_ENDIAN -/** - * CPU_TO_LE64 - convert a constant uint64_t value to little-endian - * @native: constant to convert - */ -#define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)(native)) - -/** - * CPU_TO_LE32 - convert a constant uint32_t value to little-endian - * @native: constant to convert - */ -#define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)(native)) - -/** - * CPU_TO_LE16 - convert a constant uint16_t value to little-endian - * @native: constant to convert - */ -#define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)(native)) - -/** - * LE64_TO_CPU - convert a little-endian uint64_t constant - * @le_val: little-endian constant to convert - */ -#define LE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val)) - -/** - * LE32_TO_CPU - convert a little-endian uint32_t constant - * @le_val: little-endian constant to convert - */ -#define LE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val)) - -/** - * LE16_TO_CPU - convert a little-endian uint16_t constant - * @le_val: little-endian constant to convert - */ -#define LE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val)) - -#else /* ... HAVE_BIG_ENDIAN */ -#define CPU_TO_LE64(native) ((ENDIAN_CAST leint64_t)BSWAP_64(native)) -#define CPU_TO_LE32(native) ((ENDIAN_CAST leint32_t)BSWAP_32(native)) -#define CPU_TO_LE16(native) ((ENDIAN_CAST leint16_t)BSWAP_16(native)) -#define LE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val) -#define LE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val) -#define LE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val) -#endif /* HAVE_BIG_ENDIAN */ - -#if HAVE_BIG_ENDIAN -/** - * CPU_TO_BE64 - convert a constant uint64_t value to big-endian - * @native: constant to convert - */ -#define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)(native)) - -/** - * CPU_TO_BE32 - convert a constant uint32_t value to big-endian - * @native: constant to convert - */ -#define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)(native)) - -/** - * CPU_TO_BE16 - convert a constant uint16_t value to big-endian - * @native: constant to convert - */ -#define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)(native)) - -/** - * BE64_TO_CPU - convert a big-endian uint64_t constant - * @le_val: big-endian constant to convert - */ -#define BE64_TO_CPU(le_val) ((ENDIAN_CAST uint64_t)(le_val)) - -/** - * BE32_TO_CPU - convert a big-endian uint32_t constant - * @le_val: big-endian constant to convert - */ -#define BE32_TO_CPU(le_val) ((ENDIAN_CAST uint32_t)(le_val)) - -/** - * BE16_TO_CPU - convert a big-endian uint16_t constant - * @le_val: big-endian constant to convert - */ -#define BE16_TO_CPU(le_val) ((ENDIAN_CAST uint16_t)(le_val)) - -#else /* ... HAVE_LITTLE_ENDIAN */ -#define CPU_TO_BE64(native) ((ENDIAN_CAST beint64_t)BSWAP_64(native)) -#define CPU_TO_BE32(native) ((ENDIAN_CAST beint32_t)BSWAP_32(native)) -#define CPU_TO_BE16(native) ((ENDIAN_CAST beint16_t)BSWAP_16(native)) -#define BE64_TO_CPU(le_val) BSWAP_64((ENDIAN_CAST uint64_t)le_val) -#define BE32_TO_CPU(le_val) BSWAP_32((ENDIAN_CAST uint32_t)le_val) -#define BE16_TO_CPU(le_val) BSWAP_16((ENDIAN_CAST uint16_t)le_val) -#endif /* HAVE_LITTE_ENDIAN */ - - -/** - * cpu_to_le64 - convert a uint64_t value to little-endian - * @native: value to convert - */ -static inline leint64_t cpu_to_le64(uint64_t native) -{ - return CPU_TO_LE64(native); -} - -/** - * cpu_to_le32 - convert a uint32_t value to little-endian - * @native: value to convert - */ -static inline leint32_t cpu_to_le32(uint32_t native) -{ - return CPU_TO_LE32(native); -} - -/** - * cpu_to_le16 - convert a uint16_t value to little-endian - * @native: value to convert - */ -static inline leint16_t cpu_to_le16(uint16_t native) -{ - return CPU_TO_LE16(native); -} - -/** - * le64_to_cpu - convert a little-endian uint64_t value - * @le_val: little-endian value to convert - */ -static inline uint64_t le64_to_cpu(leint64_t le_val) -{ - return LE64_TO_CPU(le_val); -} - -/** - * le32_to_cpu - convert a little-endian uint32_t value - * @le_val: little-endian value to convert - */ -static inline uint32_t le32_to_cpu(leint32_t le_val) -{ - return LE32_TO_CPU(le_val); -} - -/** - * le16_to_cpu - convert a little-endian uint16_t value - * @le_val: little-endian value to convert - */ -static inline uint16_t le16_to_cpu(leint16_t le_val) -{ - return LE16_TO_CPU(le_val); -} - -/** - * cpu_to_be64 - convert a uint64_t value to big endian. - * @native: value to convert - */ -static inline beint64_t cpu_to_be64(uint64_t native) -{ - return CPU_TO_BE64(native); -} - -/** - * cpu_to_be32 - convert a uint32_t value to big endian. - * @native: value to convert - */ -static inline beint32_t cpu_to_be32(uint32_t native) -{ - return CPU_TO_BE32(native); -} - -/** - * cpu_to_be16 - convert a uint16_t value to big endian. - * @native: value to convert - */ -static inline beint16_t cpu_to_be16(uint16_t native) -{ - return CPU_TO_BE16(native); -} - -/** - * be64_to_cpu - convert a big-endian uint64_t value - * @be_val: big-endian value to convert - */ -static inline uint64_t be64_to_cpu(beint64_t be_val) -{ - return BE64_TO_CPU(be_val); -} - -/** - * be32_to_cpu - convert a big-endian uint32_t value - * @be_val: big-endian value to convert - */ -static inline uint32_t be32_to_cpu(beint32_t be_val) -{ - return BE32_TO_CPU(be_val); -} - -/** - * be16_to_cpu - convert a big-endian uint16_t value - * @be_val: big-endian value to convert - */ -static inline uint16_t be16_to_cpu(beint16_t be_val) -{ - return BE16_TO_CPU(be_val); -} - -/* Whichever they include first, they get these definitions. */ -#ifdef CCAN_SHORT_TYPES_H -/** - * be64/be32/be16 - 64/32/16 bit big-endian representation. - */ -typedef beint64_t be64; -typedef beint32_t be32; -typedef beint16_t be16; - -/** - * le64/le32/le16 - 64/32/16 bit little-endian representation. - */ -typedef leint64_t le64; -typedef leint32_t le32; -typedef leint16_t le16; -#endif -#endif /* CCAN_ENDIAN_H */ diff --git a/external/libwally-core/src/ccan/ccan/endian/test/compile_ok-constant.c b/external/libwally-core/src/ccan/ccan/endian/test/compile_ok-constant.c deleted file mode 100644 index 1aef1dd19..000000000 --- a/external/libwally-core/src/ccan/ccan/endian/test/compile_ok-constant.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -struct foo { - char one[BSWAP_16(0xFF00)]; - char two[BSWAP_32(0xFF000000)]; - char three[BSWAP_64(0xFF00000000000000ULL)]; -}; - -int main(void) -{ - return 0; -} diff --git a/external/libwally-core/src/ccan/ccan/endian/test/run.c b/external/libwally-core/src/ccan/ccan/endian/test/run.c deleted file mode 100644 index a00fce74e..000000000 --- a/external/libwally-core/src/ccan/ccan/endian/test/run.c +++ /dev/null @@ -1,106 +0,0 @@ -#include -#include -#include -#include - -int main(int argc, char *argv[]) -{ - union { - uint64_t u64; - unsigned char u64_bytes[8]; - } u64; - union { - uint32_t u32; - unsigned char u32_bytes[4]; - } u32; - union { - uint16_t u16; - unsigned char u16_bytes[2]; - } u16; - - plan_tests(48); - - /* Straight swap tests. */ - u64.u64_bytes[0] = 0x00; - u64.u64_bytes[1] = 0x11; - u64.u64_bytes[2] = 0x22; - u64.u64_bytes[3] = 0x33; - u64.u64_bytes[4] = 0x44; - u64.u64_bytes[5] = 0x55; - u64.u64_bytes[6] = 0x66; - u64.u64_bytes[7] = 0x77; - u64.u64 = bswap_64(u64.u64); - ok1(u64.u64_bytes[7] == 0x00); - ok1(u64.u64_bytes[6] == 0x11); - ok1(u64.u64_bytes[5] == 0x22); - ok1(u64.u64_bytes[4] == 0x33); - ok1(u64.u64_bytes[3] == 0x44); - ok1(u64.u64_bytes[2] == 0x55); - ok1(u64.u64_bytes[1] == 0x66); - ok1(u64.u64_bytes[0] == 0x77); - - u32.u32_bytes[0] = 0x00; - u32.u32_bytes[1] = 0x11; - u32.u32_bytes[2] = 0x22; - u32.u32_bytes[3] = 0x33; - u32.u32 = bswap_32(u32.u32); - ok1(u32.u32_bytes[3] == 0x00); - ok1(u32.u32_bytes[2] == 0x11); - ok1(u32.u32_bytes[1] == 0x22); - ok1(u32.u32_bytes[0] == 0x33); - - u16.u16_bytes[0] = 0x00; - u16.u16_bytes[1] = 0x11; - u16.u16 = bswap_16(u16.u16); - ok1(u16.u16_bytes[1] == 0x00); - ok1(u16.u16_bytes[0] == 0x11); - - /* Endian tests. */ - u64.u64 = cpu_to_le64(0x0011223344556677ULL); - ok1(u64.u64_bytes[0] == 0x77); - ok1(u64.u64_bytes[1] == 0x66); - ok1(u64.u64_bytes[2] == 0x55); - ok1(u64.u64_bytes[3] == 0x44); - ok1(u64.u64_bytes[4] == 0x33); - ok1(u64.u64_bytes[5] == 0x22); - ok1(u64.u64_bytes[6] == 0x11); - ok1(u64.u64_bytes[7] == 0x00); - ok1(le64_to_cpu(u64.u64) == 0x0011223344556677ULL); - - u64.u64 = cpu_to_be64(0x0011223344556677ULL); - ok1(u64.u64_bytes[7] == 0x77); - ok1(u64.u64_bytes[6] == 0x66); - ok1(u64.u64_bytes[5] == 0x55); - ok1(u64.u64_bytes[4] == 0x44); - ok1(u64.u64_bytes[3] == 0x33); - ok1(u64.u64_bytes[2] == 0x22); - ok1(u64.u64_bytes[1] == 0x11); - ok1(u64.u64_bytes[0] == 0x00); - ok1(be64_to_cpu(u64.u64) == 0x0011223344556677ULL); - - u32.u32 = cpu_to_le32(0x00112233); - ok1(u32.u32_bytes[0] == 0x33); - ok1(u32.u32_bytes[1] == 0x22); - ok1(u32.u32_bytes[2] == 0x11); - ok1(u32.u32_bytes[3] == 0x00); - ok1(le32_to_cpu(u32.u32) == 0x00112233); - - u32.u32 = cpu_to_be32(0x00112233); - ok1(u32.u32_bytes[3] == 0x33); - ok1(u32.u32_bytes[2] == 0x22); - ok1(u32.u32_bytes[1] == 0x11); - ok1(u32.u32_bytes[0] == 0x00); - ok1(be32_to_cpu(u32.u32) == 0x00112233); - - u16.u16 = cpu_to_le16(0x0011); - ok1(u16.u16_bytes[0] == 0x11); - ok1(u16.u16_bytes[1] == 0x00); - ok1(le16_to_cpu(u16.u16) == 0x0011); - - u16.u16 = cpu_to_be16(0x0011); - ok1(u16.u16_bytes[1] == 0x11); - ok1(u16.u16_bytes[0] == 0x00); - ok1(be16_to_cpu(u16.u16) == 0x0011); - - exit(exit_status()); -} diff --git a/external/libwally-core/src/ccan/ccan/str/hex/LICENSE b/external/libwally-core/src/ccan/ccan/str/hex/LICENSE deleted file mode 120000 index 08d5d486f..000000000 --- a/external/libwally-core/src/ccan/ccan/str/hex/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../../licenses/CC0 \ No newline at end of file diff --git a/external/libwally-core/src/ccan/ccan/str/hex/_info b/external/libwally-core/src/ccan/ccan/str/hex/_info deleted file mode 100644 index 8d65490c7..000000000 --- a/external/libwally-core/src/ccan/ccan/str/hex/_info +++ /dev/null @@ -1,39 +0,0 @@ -#include "config.h" -#include -#include - -/** - * str/hex - hex-to-string conversions and vice-versa - * - * This code contains simple routines for hexidecimal strings. - * - * License: CC0 (Public domain) - * Author: Rusty Russell - * - * Example: - * int main(int argc, char *argv[]) - * { - * int i; - * - * for (i = 1; i < argc; i++) { - * char str[hex_str_size(strlen(argv[i]))]; - * - * hex_encode(str, sizeof(str), argv[i], strlen(argv[i])); - * printf("%s ", str); - * } - * printf("\n"); - * return 0; - * } - */ -int main(int argc, char *argv[]) -{ - /* Expect exactly one argument */ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) { - return 0; - } - - return 1; -} diff --git a/external/libwally-core/src/ccan/ccan/str/hex/hex.c b/external/libwally-core/src/ccan/ccan/str/hex/hex.c deleted file mode 100644 index 66d3cf178..000000000 --- a/external/libwally-core/src/ccan/ccan/str/hex/hex.c +++ /dev/null @@ -1,66 +0,0 @@ -/* CC0 license (public domain) - see LICENSE file for details */ -#include -#include -#include -#include - -static bool char_to_hex(unsigned char *val, char c) -{ - if (c >= '0' && c <= '9') { - *val = c - '0'; - return true; - } - if (c >= 'a' && c <= 'f') { - *val = c - 'a' + 10; - return true; - } - if (c >= 'A' && c <= 'F') { - *val = c - 'A' + 10; - return true; - } - return false; -} - -bool hex_decode(const char *str, size_t slen, void *buf, size_t bufsize) -{ - unsigned char v1, v2; - unsigned char *p = buf; - - while (slen > 1) { - if (!char_to_hex(&v1, str[0]) || !char_to_hex(&v2, str[1])) - return false; - if (!bufsize) - return false; - *(p++) = (v1 << 4) | v2; - str += 2; - slen -= 2; - bufsize--; - } - return slen == 0 && bufsize == 0; -} - -static char hexchar(unsigned int val) -{ - if (val < 10) - return '0' + val; - if (val < 16) - return 'a' + val - 10; - abort(); -} - -bool hex_encode(const void *buf, size_t bufsize, char *dest, size_t destsize) -{ - size_t i; - - if (destsize < hex_str_size(bufsize)) - return false; - - for (i = 0; i < bufsize; i++) { - unsigned int c = ((const unsigned char *)buf)[i]; - *(dest++) = hexchar(c >> 4); - *(dest++) = hexchar(c & 0xF); - } - *dest = '\0'; - - return true; -} diff --git a/external/libwally-core/src/ccan/ccan/str/hex/hex.h b/external/libwally-core/src/ccan/ccan/str/hex/hex.h deleted file mode 100644 index 0a0d5c5aa..000000000 --- a/external/libwally-core/src/ccan/ccan/str/hex/hex.h +++ /dev/null @@ -1,73 +0,0 @@ -/* CC0 (Public domain) - see LICENSE file for details */ -#ifndef CCAN_HEX_H -#define CCAN_HEX_H -#include "config.h" -#include -#include - -/** - * hex_decode - Unpack a hex string. - * @str: the hexidecimal string - * @slen: the length of @str - * @buf: the buffer to write the data into - * @bufsize: the length of @buf - * - * Returns false if there are any characters which aren't 0-9, a-f or A-F, - * of the string wasn't the right length for @bufsize. - * - * Example: - * unsigned char data[20]; - * - * if (!hex_decode(argv[1], strlen(argv[1]), data, 20)) - * printf("String is malformed!\n"); - */ -bool hex_decode(const char *str, size_t slen, void *buf, size_t bufsize); - -/** - * hex_encode - Create a nul-terminated hex string - * @buf: the buffer to read the data from - * @bufsize: the length of @buf - * @dest: the string to fill - * @destsize: the max size of the string - * - * Returns true if the string, including terminator, fit in @destsize; - * - * Example: - * unsigned char buf[] = { 0x1F, 0x2F }; - * char str[5]; - * - * if (!hex_encode(buf, sizeof(buf), str, sizeof(str))) - * abort(); - */ -bool hex_encode(const void *buf, size_t bufsize, char *dest, size_t destsize); - -/** - * hex_str_size - Calculate how big a nul-terminated hex string is - * @bytes: bytes of data to represent - * - * Example: - * unsigned char buf[] = { 0x1F, 0x2F }; - * char str[hex_str_size(sizeof(buf))]; - * - * hex_encode(buf, sizeof(buf), str, sizeof(str)); - */ -static inline size_t hex_str_size(size_t bytes) -{ - return 2 * bytes + 1; -} - -/** - * hex_data_size - Calculate how many bytes of data in a hex string - * @strlen: the length of the string (with or without NUL) - * - * Example: - * const char str[] = "1F2F"; - * unsigned char buf[hex_data_size(sizeof(str))]; - * - * hex_decode(str, strlen(str), buf, sizeof(buf)); - */ -static inline size_t hex_data_size(size_t strlen) -{ - return strlen / 2; -} -#endif /* PETTYCOIN_HEX_H */ diff --git a/external/libwally-core/src/ccan/ccan/str/hex/test/run.c b/external/libwally-core/src/ccan/ccan/str/hex/test/run.c deleted file mode 100644 index c750ed261..000000000 --- a/external/libwally-core/src/ccan/ccan/str/hex/test/run.c +++ /dev/null @@ -1,42 +0,0 @@ -#include -/* Include the C files directly. */ -#include -#include -#include - -int main(void) -{ - const char teststr[] = "0123456789abcdefABCDEF"; - const char bad_teststr[] = "0123456789abcdefABCDEF1O"; - const unsigned char testdata[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, - 0xcd, 0xef, 0xAB, 0xCD, 0xEF }; - unsigned char data[11]; - char str[23]; - size_t i; - - plan_tests(10 + sizeof(str)); - - ok1(hex_str_size(sizeof(testdata)) == sizeof(teststr)); - /* This gives right result with or without nul included */ - ok1(hex_data_size(strlen(teststr)) == sizeof(testdata)); - ok1(hex_data_size(sizeof(teststr)) == sizeof(testdata)); - - ok1(hex_decode(teststr, strlen(teststr), data, sizeof(data))); - ok1(memcmp(data, testdata, sizeof(testdata)) == 0); - ok1(hex_encode(testdata, sizeof(testdata), str, sizeof(str))); - ok1(strcmp(str, "0123456789abcdefabcdef") == 0); - - /* Bad char */ - ok1(!hex_decode(bad_teststr, strlen(bad_teststr), data, sizeof(data))); - /* Bad hex string len */ - ok1(!hex_decode(teststr, strlen(teststr) - 1, data, sizeof(data))); - /* Bad buffer len */ - ok1(!hex_decode(teststr, strlen(teststr), data, sizeof(data) - 1)); - - /* Bad deststring size. */ - for (i = 1; i <= sizeof(str); i++) - ok1(!hex_encode(testdata, sizeof(testdata), str, sizeof(str)-i)); - - /* This exits depending on whether all tests passed */ - return exit_status(); -} diff --git a/external/libwally-core/src/ccan/ccan/tap/_info b/external/libwally-core/src/ccan/ccan/tap/_info deleted file mode 100644 index 2b116de95..000000000 --- a/external/libwally-core/src/ccan/ccan/tap/_info +++ /dev/null @@ -1,61 +0,0 @@ -#include "config.h" -#include -#include - -/** - * tap - Test Anything Protocol - * - * The tap package produces simple-to-parse mainly-human-readable test - * output to assist in the writing of test cases. It is based on the - * (now-defunct) libtap, which is based on Perl's CPAN TAP module. Its - * output can be parsed by a harness such as CPAN's Prove. - * - * CCAN testcases are expected to output the TAP format, usually using - * this package. - * - * For more information about TAP, see: - * http://en.wikipedia.org/wiki/Test_Anything_Protocol - * - * Based on the original libtap, Copyright (c) 2004 Nik Clayton. - * - * License: BSD (2 clause) - * - * Example: - * #include - * #include - * - * // Run some simple (but overly chatty) tests on strcmp(). - * int main(int argc, char *argv[]) - * { - * const char a[] = "a", another_a[] = "a"; - * const char b[] = "b"; - * const char ab[] = "ab"; - * - * plan_tests(4); - * diag("Testing different pointers (%p/%p) with same contents", - * a, another_a); - * ok1(strcmp(a, another_a) == 0); - * - * diag("'a' comes before 'b'"); - * ok1(strcmp(a, b) < 0); - * ok1(strcmp(b, a) > 0); - * - * diag("'ab' comes after 'a'"); - * ok1(strcmp(ab, a) > 0); - * return exit_status(); - * } - * - * Maintainer: Rusty Russell - */ -int main(int argc, char *argv[]) -{ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) { - printf("ccan/compiler\n"); - return 0; - } - - return 1; -} diff --git a/external/libwally-core/src/ccan/ccan/tap/tap.3 b/external/libwally-core/src/ccan/ccan/tap/tap.3 deleted file mode 100644 index 0abab740d..000000000 --- a/external/libwally-core/src/ccan/ccan/tap/tap.3 +++ /dev/null @@ -1,362 +0,0 @@ -.Dd December 20, 2004 -.Os -.Dt TAP 3 -.Sh NAME -.Nm tap -.Nd write tests that implement the Test Anything Protocol -.Sh SYNOPSIS -.In tap.h -.Sh DESCRIPTION -The -.Nm -library provides functions for writing test scripts that produce output -consistent with the Test Anything Protocol. A test harness that parses -this protocol can run these tests and produce useful reports indicating -their success or failure. -.Ss PRINTF STRINGS -In the descriptions that follow, for any function that takes as the -last two parameters -.Dq Fa const char * , Fa ... -it can be assumed that the -.Fa const char * -is a -.Fn printf --like format string, and the optional arguments are values to be placed -in that string. -.Ss TEST PLANS -.Bl -tag -width indent -.It Xo -.Ft void -.Fn plan_tests "unsigned int" -.Xc -.It Xo -.Ft void -.Fn plan_no_plan "void" -.Xc -.It Xo -.Ft void -.Fn plan_skip_all "const char *" "..." -.Xc -.El -.Pp -You must first specify a test plan. This indicates how many tests you -intend to run, and allows the test harness to notice if any tests were -missed, or if the test program exited prematurely. -.Pp -To do this, use -.Fn plan_tests . -The function will cause your program to exit prematurely if you specify -0 tests. -.Pp -In some situations you may not know how many tests you will be running, or -you are developing your test program, and do not want to update the -.Fn plan_tests -parameter every time you make a change. For those situations use -.Fn plan_no_plan . -It indicates to the test harness that an indeterminate number -of tests will be run. -.Pp -Both -.Fn plan_tests -and -.Fn plan_no_plan -will cause your test program to exit prematurely with a diagnostic -message if they are called more than once. -.Pp -If your test program detects at run time that some required functionality -is missing (for example, it relies on a database connection which is not -present, or a particular configuration option that has not been included -in the running kernel) use -.Fn plan_skip_all , -passing as parameters a string to display indicating the reason for skipping -the tests. -.Ss SIMPLE TESTS -.Bl -tag -width indent -.It Xo -.Ft unsigned int -.Fn ok "expression" "const char *" "..." -.Xc -.It Xo -.Ft unsigned int -.Fn ok1 "expression" -.Xc -.It Xo -.Ft unsigned int -.Fn pass "const char *" "..." -.Xc -.It Xo -.Ft unsigned int -.Fn fail "const char *" "..." -.Xc -.El -.Pp -Tests are implemented as expressions checked by calls to the -.Fn ok -and -.Fn ok1 -macros. In both cases -.Fa expression -should evaluate to true if the test succeeded. -.Pp -.Fn ok -allows you to specify a name, or comment, describing the test which will -be included in the output. -.Fn ok1 -is for those times when the expression to be tested is self -explanatory and does not need an associated comment. In those cases -the test expression becomes the comment. -.Pp -These four calls are equivalent: -.Bd -literal -offset indent -int i = 5; - -ok(i == 5, "i equals 5"); /* Overly verbose */ -ok(i == 5, "i equals %d", i); /* Just to demonstrate printf-like - behaviour of the test name */ -ok(i == 5, "i == 5"); /* Needless repetition */ -ok1(i == 5); /* Just right */ -.Ed -.Pp -It is good practice to ensure that the test name describes the meaning -behind the test rather than what you are testing. Viz -.Bd -literal -offset indent -ok(db != NULL, "db is not NULL"); /* Not bad, but */ -ok(db != NULL, "Database conn. succeeded"); /* this is better */ -.Ed -.Pp -.Fn ok -and -.Fn ok1 -return 1 if the expression evaluated to true, and 0 if it evaluated to -false. This lets you chain calls from -.Fn ok -to -.Fn diag -to only produce diagnostic output if the test failed. For example, this -code will include diagnostic information about why the database connection -failed, but only if the test failed. -.Bd -literal -offset indent -if (!ok(db != NULL, "Database conn. succeeded")) { - diag("Database error code: %d", dberrno); -} -.Ed -.Pp -You also have -.Fn pass -and -.Fn fail . -From the Test::More documentation: -.Bd -literal -offset indent -Sometimes you just want to say that the tests have passed. -Usually the case is you've got some complicated condition -that is difficult to wedge into an ok(). In this case, -you can simply use pass() (to declare the test ok) or fail -(for not ok). - -Use these very, very, very sparingly. -.Ed -.Pp -These are synonyms for ok(1, ...) and ok(0, ...). -.Ss SKIPPING TESTS -.Bl -tag -width indent -.It Xo -.Ft void -.Fn skip "unsigned int" "const char *" "..." -.Xc -.It Xo -.Fn skip_if "expression" "unsigned int" "const char *" "..." -.Xc -.El -.Pp -Sets of tests can be skipped. Ordinarily you would do this because -the test can't be run in this particular testing environment. -.Pp -For example, suppose some tests should be run as root. If the test is -not being run as root then the tests should be skipped. In this -implementation, skipped tests are flagged as being ok, with a special -message indicating that they were skipped. It is your responsibility -to ensure that the number of tests skipped (the first parameter to -.Fn skip ) -is correct for the number of tests to skip. -.Pp -One way of implementing this is with a -.Dq do { } while(0); -loop, or an -.Dq if( ) { } else { } -construct, to ensure that there are no additional side effects from the -skipped tests. -.Bd -literal -offset indent -if(getuid() != 0) { - skip(1, "because test only works as root"); -} else { - ok(do_something_as_root() == 0, "Did something as root"); -} -.Ed -.Pp -A convenient macro is provided to assist with this. The previous example could -be re-written as follows. -.Bd -literal -offset indent -skip_if(getuid() != 0, 1, "because test only works as root") { - ok(do_something_as_root() == 0, "Did something as root"); -} -.Ed -.Ss MARKING TESTS AS Dq TODO -.Bl -tag -width indent -.It Xo -.Ft void -.Fn todo_start "const char *" "..." -.Xc -.It Xo -.Ft void -.Fn todo_end "void" -.Xc -.El -.Pp -Sets of tests can be flagged as being -.Dq TODO . -These are tests that you expect to fail, probably because you haven't -fixed a bug, or finished a new feature yet. These tests will still be -run, but with additional output that indicates that they are expected -to fail. Should a test start to succeed unexpectedly, tools like -.Xr prove 1 -will indicate this, and you can move the test out of the todo -block. This is much more useful than simply commenting out (or -.Dq #ifdef 0 ... #endif ) -the tests. -.Bd -literal -offset indent -todo_start("dwim() not returning true yet"); - -ok(dwim(), "Did what the user wanted"); - -todo_end(); -.Ed -.Pp -Should -.Fn dwim -ever start succeeding you will know about it as soon as you run the -tests. Note that -.Em unlike -the -.Fn skip_* -family, additional code between -.Fn todo_start -and -.Fn todo_end -.Em is -executed. -.Ss SKIP vs. TODO -From the Test::More documentation; -.Bd -literal -offset indent -If it's something the user might not be able to do, use SKIP. -This includes optional modules that aren't installed, running -under an OS that doesn't have some feature (like fork() or -symlinks), or maybe you need an Internet connection and one -isn't available. - -If it's something the programmer hasn't done yet, use TODO. -This is for any code you haven't written yet, or bugs you have -yet to fix, but want to put tests in your testing script -(always a good idea). -.Ed -.Ss DIAGNOSTIC OUTPUT -.Bl -tag -width indent -.It Xo -.Fr int -.Fn diag "const char *" "..." -.Xc -.El -.Pp -If your tests need to produce diagnostic output, use -.Fn diag . -It ensures that the output will not be considered by the TAP test harness. -.Fn diag -adds the necessary trailing -.Dq \en -for you. -It returns the number of characters written. -.Bd -literal -offset indent -diag("Expected return code 0, got return code %d", rcode); -.Ed -.Ss EXIT STATUS -.Bl -tag -width indent -.It Xo -.Fr int -.Fn exit_status void -.Xc -.El -.Pp -For maximum compatability your test program should return a particular -exit code. This is calculated by -.Fn exit_status -so it is sufficient to always return from -.Fn main -with either -.Dq return exit_status(); -or -.Dq exit(exit_status()); -as appropriate. -.Sh EXAMPLES -The -.Pa tests -directory in the source distribution contains numerous tests of -.Nm -functionality, written using -.Nm . -Examine them for examples of how to construct test suites. -.Sh COMPATABILITY -.Nm -strives to be compatible with the Perl Test::More and Test::Harness -modules. The test suite verifies that -.Nm -is bug-for-bug compatible with their behaviour. This is why some -functions which would more naturally return nothing return constant -values. -.Pp -If the -.Lb libpthread -is found at compile time, -.Nm -.Em should -be thread safe. Indications to the contrary (and test cases that expose -incorrect behaviour) are very welcome. -.Sh SEE ALSO -.Xr Test::More 1 , -.Xr Test::Harness 1 , -.Xr prove 1 -.Sh STANDARDS -.Nm -requires a -.St -isoC-99 -compiler. Some of the -.Nm -functionality is implemented as variadic macros, and that functionality -was not formally codified until C99. Patches to use -.Nm -with earlier compilers that have their own implementation of variadic -macros will be gratefully received. -.Sh HISTORY -.Nm -was written to help improve the quality and coverage of the FreeBSD -regression test suite, and released in the hope that others find it -a useful tool to help improve the quality of their code. -.Sh AUTHORS -.An "Nik Clayton" Aq nik@ngo.org.uk , -.Aq nik@FreeBSD.org -.Pp -.Nm -would not exist without the efforts of -.An "Michael G Schwern" Aq schqern@pobox.com , -.An "Andy Lester" Aq andy@petdance.com , -and the countless others who have worked on the Perl QA programme. -.Sh BUGS -Ideally, running the tests would have no side effects on the behaviour -of the application you are testing. However, it is not always possible -to avoid them. The following side effects of using -.Nm -are known. -.Bl -bullet -offset indent -.It -stdout is set to unbuffered mode after calling any of the -.Fn plan_* -functions. -.El diff --git a/external/libwally-core/src/ccan/ccan/tap/tap.c b/external/libwally-core/src/ccan/ccan/tap/tap.c deleted file mode 100644 index bf8a276c7..000000000 --- a/external/libwally-core/src/ccan/ccan/tap/tap.c +++ /dev/null @@ -1,457 +0,0 @@ -/*- - * Copyright (c) 2004 Nik Clayton - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#include "config.h" -#include -#include -#include -#include -#include - -#include "tap.h" - -static int no_plan = 0; -static int skip_all = 0; -static int have_plan = 0; -static unsigned int test_count = 0; /* Number of tests that have been run */ -static unsigned int e_tests = 0; /* Expected number of tests to run */ -static unsigned int failures = 0; /* Number of tests that failed */ -static char *todo_msg = NULL; -static const char *todo_msg_fixed = "libtap malloc issue"; -static int todo = 0; -static int test_died = 0; -static int test_pid; - -/* Encapsulate the pthread code in a conditional. In the absence of - libpthread the code does nothing. - - If you have multiple threads calling ok() etc. at the same time you would - need this, but in that case your test numbers will be random and I'm not - sure it makes sense. --RR -*/ -#ifdef WANT_PTHREAD -#include -static pthread_mutex_t M = PTHREAD_MUTEX_INITIALIZER; -# define LOCK pthread_mutex_lock(&M) -# define UNLOCK pthread_mutex_unlock(&M) -#else -# define LOCK -# define UNLOCK -#endif - -static void -_expected_tests(unsigned int tests) -{ - - printf("1..%d\n", tests); - e_tests = tests; -} - -static void -diagv(const char *fmt, va_list ap) -{ - fputs("# ", stdout); - vfprintf(stdout, fmt, ap); - fputs("\n", stdout); -} - -static void -_diag(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - diagv(fmt, ap); - va_end(ap); -} - -/* - * Generate a test result. - * - * ok -- boolean, indicates whether or not the test passed. - * test_name -- the name of the test, may be NULL - * test_comment -- a comment to print afterwards, may be NULL - */ -unsigned int -_gen_result(int ok, const char *func, const char *file, unsigned int line, - const char *test_name, ...) -{ - va_list ap; - char *local_test_name = NULL; - char *c; - int name_is_digits; - - LOCK; - - test_count++; - - /* Start by taking the test name and performing any printf() - expansions on it */ - if(test_name != NULL) { - va_start(ap, test_name); - if (vasprintf(&local_test_name, test_name, ap) < 0) - local_test_name = NULL; - va_end(ap); - - /* Make sure the test name contains more than digits - and spaces. Emit an error message and exit if it - does */ - if(local_test_name) { - name_is_digits = 1; - for(c = local_test_name; *c != '\0'; c++) { - if(!isdigit((unsigned char)*c) - && !isspace((unsigned char)*c)) { - name_is_digits = 0; - break; - } - } - - if(name_is_digits) { - _diag(" You named your test '%s'. You shouldn't use numbers for your test names.", local_test_name); - _diag(" Very confusing."); - } - } - } - - if(!ok) { - printf("not "); - failures++; - } - - printf("ok %d", test_count); - - if(test_name != NULL) { - printf(" - "); - - /* Print the test name, escaping any '#' characters it - might contain */ - if(local_test_name != NULL) { - flockfile(stdout); - for(c = local_test_name; *c != '\0'; c++) { - if(*c == '#') - fputc('\\', stdout); - fputc((int)*c, stdout); - } - funlockfile(stdout); - } else { /* vasprintf() failed, use a fixed message */ - printf("%s", todo_msg_fixed); - } - } - - /* If we're in a todo_start() block then flag the test as being - TODO. todo_msg should contain the message to print at this - point. If it's NULL then asprintf() failed, and we should - use the fixed message. - - This is not counted as a failure, so decrement the counter if - the test failed. */ - if(todo) { - printf(" # TODO %s", todo_msg ? todo_msg : todo_msg_fixed); - if(!ok) - failures--; - } - - printf("\n"); - - if(!ok) - _diag(" Failed %stest (%s:%s() at line %d)", - todo ? "(TODO) " : "", file, func, line); - - free(local_test_name); - - UNLOCK; - - if (!ok && tap_fail_callback) - tap_fail_callback(); - - /* We only care (when testing) that ok is positive, but here we - specifically only want to return 1 or 0 */ - return ok ? 1 : 0; -} - -/* - * Cleanup at the end of the run, produce any final output that might be - * required. - */ -static void -_cleanup(void) -{ - /* If we forked, don't do cleanup in child! */ - if (getpid() != test_pid) - return; - - LOCK; - - /* If plan_no_plan() wasn't called, and we don't have a plan, - and we're not skipping everything, then something happened - before we could produce any output */ - if(!no_plan && !have_plan && !skip_all) { - _diag("Looks like your test died before it could output anything."); - UNLOCK; - return; - } - - if(test_died) { - _diag("Looks like your test died just after %d.", test_count); - UNLOCK; - return; - } - - - /* No plan provided, but now we know how many tests were run, and can - print the header at the end */ - if(!skip_all && (no_plan || !have_plan)) { - printf("1..%d\n", test_count); - } - - if((have_plan && !no_plan) && e_tests < test_count) { - _diag("Looks like you planned %d tests but ran %d extra.", - e_tests, test_count - e_tests); - UNLOCK; - return; - } - - if((have_plan || !no_plan) && e_tests > test_count) { - _diag("Looks like you planned %d tests but only ran %d.", - e_tests, test_count); - if(failures) { - _diag("Looks like you failed %d tests of %d run.", - failures, test_count); - } - UNLOCK; - return; - } - - if(failures) - _diag("Looks like you failed %d tests of %d.", - failures, test_count); - - UNLOCK; -} - -/* - * Initialise the TAP library. Will only do so once, however many times it's - * called. - */ -static void -_tap_init(void) -{ - static int run_once = 0; - - if(!run_once) { - test_pid = getpid(); - atexit(_cleanup); - - /* stdout needs to be unbuffered so that the output appears - in the same place relative to stderr output as it does - with Test::Harness */ -// setbuf(stdout, 0); - run_once = 1; - } -} - -/* - * Note that there's no plan. - */ -void -plan_no_plan(void) -{ - - LOCK; - - _tap_init(); - - if(have_plan != 0) { - fprintf(stderr, "You tried to plan twice!\n"); - test_died = 1; - UNLOCK; - exit(255); - } - - have_plan = 1; - no_plan = 1; - - UNLOCK; -} - -/* - * Note that the plan is to skip all tests - */ -void -plan_skip_all(const char *reason) -{ - - LOCK; - - _tap_init(); - - skip_all = 1; - - printf("1..0"); - - if(reason != NULL) - printf(" # Skip %s", reason); - - printf("\n"); - - UNLOCK; -} - -/* - * Note the number of tests that will be run. - */ -void -plan_tests(unsigned int tests) -{ - - LOCK; - - _tap_init(); - - if(have_plan != 0) { - fprintf(stderr, "You tried to plan twice!\n"); - test_died = 1; - UNLOCK; - exit(255); - } - - if(tests == 0) { - fprintf(stderr, "You said to run 0 tests! You've got to run something.\n"); - test_died = 1; - UNLOCK; - exit(255); - } - - have_plan = 1; - - _expected_tests(tests); - - UNLOCK; -} - -void -diag(const char *fmt, ...) -{ - va_list ap; - - LOCK; - - va_start(ap, fmt); - diagv(fmt, ap); - va_end(ap); - - UNLOCK; -} - -void -skip(unsigned int n, const char *fmt, ...) -{ - va_list ap; - char *skip_msg; - - LOCK; - - va_start(ap, fmt); - if (vasprintf(&skip_msg, fmt, ap) < 0) - skip_msg = NULL; - va_end(ap); - - while(n-- > 0) { - test_count++; - printf("ok %d # skip %s\n", test_count, - skip_msg != NULL ? - skip_msg : "libtap():malloc() failed"); - } - - free(skip_msg); - - UNLOCK; -} - -void -todo_start(const char *fmt, ...) -{ - va_list ap; - - LOCK; - - va_start(ap, fmt); - if (vasprintf(&todo_msg, fmt, ap) < 0) - todo_msg = NULL; - va_end(ap); - - todo = 1; - - UNLOCK; -} - -void -todo_end(void) -{ - - LOCK; - - todo = 0; - free(todo_msg); - - UNLOCK; -} - -static int -exit_status_(void) -{ - int r; - - LOCK; - - /* If there's no plan, just return the number of failures */ - if(no_plan || !have_plan) { - UNLOCK; - return failures; - } - - /* Ran too many tests? Return the number of tests that were run - that shouldn't have been */ - if(e_tests < test_count) { - r = test_count - e_tests; - UNLOCK; - return r; - } - - /* Return the number of tests that failed + the number of tests - that weren't run */ - r = failures + e_tests - test_count; - UNLOCK; - - return r; -} - -int -exit_status(void) -{ - int r = exit_status_(); - if (r > 255) - r = 255; - return r; -} diff --git a/external/libwally-core/src/ccan/ccan/tap/tap.h b/external/libwally-core/src/ccan/ccan/tap/tap.h deleted file mode 100644 index 5b21ff756..000000000 --- a/external/libwally-core/src/ccan/ccan/tap/tap.h +++ /dev/null @@ -1,251 +0,0 @@ -#ifndef CCAN_TAP_H -#define CCAN_TAP_H -/*- - * Copyright (c) 2004 Nik Clayton - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#include - -/** - * plan_tests - announce the number of tests you plan to run - * @tests: the number of tests - * - * This should be the first call in your test program: it allows tracing - * of failures which mean that not all tests are run. - * - * If you don't know how many tests will actually be run, assume all of them - * and use skip() if you don't actually run some tests. - * - * Example: - * plan_tests(13); - */ -void plan_tests(unsigned int tests); - -/** - * ok1 - Simple conditional test - * @e: the expression which we expect to be true. - * - * This is the simplest kind of test: if the expression is true, the - * test passes. The name of the test which is printed will simply be - * file name, line number, and the expression itself. - * - * Example: - * ok1(somefunc() == 1); - */ -# define ok1(e) ((e) ? \ - _gen_result(1, __func__, __FILE__, __LINE__, "%s", #e) : \ - _gen_result(0, __func__, __FILE__, __LINE__, "%s", #e)) - -/** - * ok - Conditional test with a name - * @e: the expression which we expect to be true. - * @...: the printf-style name of the test. - * - * If the expression is true, the test passes. The name of the test will be - * the filename, line number, and the printf-style string. This can be clearer - * than simply the expression itself. - * - * Example: - * ok1(somefunc() == 1); - * ok(somefunc() == 0, "Second somefunc() should fail"); - */ -# define ok(e, ...) ((e) ? \ - _gen_result(1, __func__, __FILE__, __LINE__, \ - __VA_ARGS__) : \ - _gen_result(0, __func__, __FILE__, __LINE__, \ - __VA_ARGS__)) - -/** - * pass - Note that a test passed - * @...: the printf-style name of the test. - * - * For complicated code paths, it can be easiest to simply call pass() in one - * branch and fail() in another. - * - * Example: - * int x = somefunc(); - * if (x > 0) - * pass("somefunc() returned a valid value"); - * else - * fail("somefunc() returned an invalid value"); - */ -# define pass(...) ok(1, __VA_ARGS__) - -/** - * fail - Note that a test failed - * @...: the printf-style name of the test. - * - * For complicated code paths, it can be easiest to simply call pass() in one - * branch and fail() in another. - */ -# define fail(...) ok(0, __VA_ARGS__) - -/* I don't find these to be useful. */ -# define skip_if(cond, n, ...) \ - if (cond) skip((n), __VA_ARGS__); \ - else - -# define skip_start(test, n, ...) \ - do { \ - if((test)) { \ - skip(n, __VA_ARGS__); \ - continue; \ - } - -# define skip_end } while(0) - -unsigned int _gen_result(int, const char *, const char *, unsigned int, - const char *, ...) PRINTF_FMT(5, 6); - -/** - * diag - print a diagnostic message (use instead of printf/fprintf) - * @fmt: the format of the printf-style message - * - * diag ensures that the output will not be considered to be a test - * result by the TAP test harness. It will append '\n' for you. - * - * Example: - * diag("Now running complex tests"); - */ -void diag(const char *fmt, ...) PRINTF_FMT(1, 2); - -/** - * skip - print a diagnostic message (use instead of printf/fprintf) - * @n: number of tests you're skipping. - * @fmt: the format of the reason you're skipping the tests. - * - * Sometimes tests cannot be run because the test system lacks some feature: - * you should explicitly document that you're skipping tests using skip(). - * - * From the Test::More documentation: - * If it's something the user might not be able to do, use SKIP. This - * includes optional modules that aren't installed, running under an OS that - * doesn't have some feature (like fork() or symlinks), or maybe you need an - * Internet connection and one isn't available. - * - * Example: - * #ifdef HAVE_SOME_FEATURE - * ok1(somefunc()); - * #else - * skip(1, "Don't have SOME_FEATURE"); - * #endif - */ -void skip(unsigned int n, const char *fmt, ...) PRINTF_FMT(2, 3); - -/** - * todo_start - mark tests that you expect to fail. - * @fmt: the reason they currently fail. - * - * It's extremely useful to write tests before you implement the matching fix - * or features: surround these tests by todo_start()/todo_end(). These tests - * will still be run, but with additional output that indicates that they are - * expected to fail. - * - * This way, should a test start to succeed unexpectedly, tools like prove(1) - * will indicate this and you can move the test out of the todo block. This - * is much more useful than simply commenting out (or '#if 0') the tests. - * - * From the Test::More documentation: - * If it's something the programmer hasn't done yet, use TODO. This is for - * any code you haven't written yet, or bugs you have yet to fix, but want to - * put tests in your testing script (always a good idea). - * - * Example: - * static bool dwim(void) - * { - * return false; // NYI - * } - * ... - * todo_start("dwim() not returning true yet"); - * ok(dwim(), "Did what the user wanted"); - * todo_end(); - */ -void todo_start(const char *fmt, ...) PRINTF_FMT(1, 2); - -/** - * todo_end - end of tests you expect to fail. - * - * See todo_start(). - */ -void todo_end(void); - -/** - * exit_status - the value that main should return. - * - * For maximum compatibility your test program should return a particular exit - * code (ie. 0 if all tests were run, and every test which was expected to - * succeed succeeded). - * - * Example: - * exit(exit_status()); - */ -int exit_status(void); - -/** - * plan_no_plan - I have no idea how many tests I'm going to run. - * - * In some situations you may not know how many tests you will be running, or - * you are developing your test program, and do not want to update the - * plan_tests() call every time you make a change. For those situations use - * plan_no_plan() instead of plan_tests(). It indicates to the test harness - * that an indeterminate number of tests will be run. - * - * Remember, if you fail to plan, you plan to fail. - * - * Example: - * plan_no_plan(); - * while (random() % 2) - * ok1(somefunc()); - * exit(exit_status()); - */ -void plan_no_plan(void); - -/** - * plan_skip_all - Indicate that you will skip all tests. - * @reason: the string indicating why you can't run any tests. - * - * If your test program detects at run time that some required functionality - * is missing (for example, it relies on a database connection which is not - * present, or a particular configuration option that has not been included - * in the running kernel) use plan_skip_all() instead of plan_tests(). - * - * Example: - * #ifndef HAVE_SOME_FEATURE - * plan_skip_all("Need SOME_FEATURE support"); - * exit(exit_status()); - * #else - * plan_tests(13); - * ... - * #endif - */ -void plan_skip_all(const char *reason); - -/** - * tap_fail_callback - function to call when we fail - * - * This can be used to ease debugging, or exit on the first failure. - */ -void (*tap_fail_callback)(void); - -#endif /* CCAN_TAP_H */ diff --git a/external/libwally-core/src/ccan/ccan/tap/test/run.c b/external/libwally-core/src/ccan/ccan/tap/test/run.c deleted file mode 100644 index fb039a895..000000000 --- a/external/libwally-core/src/ccan/ccan/tap/test/run.c +++ /dev/null @@ -1,133 +0,0 @@ -/* We use the fact that pipes have a buffer greater than the size of - * any output, and change stdout and stderr to use that. - * - * Since we don't use libtap for output, this looks like one big test. */ -#include -#include -#include -#include -#include -#include -#include -#include - - - -/* We dup stderr to here. */ -static int stderrfd; - -/* write_all inlined here to avoid circular dependency. */ -static void write_all(int fd, const void *data, size_t size) -{ - while (size) { - ssize_t done; - - done = write(fd, data, size); - if (done <= 0) - _exit(1); - data = (const char *)data + done; - size -= done; - } -} - -/* Simple replacement for err() */ -static void failmsg(const char *fmt, ...) -{ - char buf[1024]; - va_list ap; - - /* Write into buffer. */ - va_start(ap, fmt); - vsprintf(buf, fmt, ap); - va_end(ap); - - write_all(stderrfd, "# ", 2); - write_all(stderrfd, buf, strlen(buf)); - write_all(stderrfd, "\n", 1); - _exit(1); -} - -static void expect(int fd, const char *pattern) -{ - char buffer[PIPE_BUF+1]; - int r; - - r = read(fd, buffer, sizeof(buffer)-1); - if (r < 0) - failmsg("reading from pipe"); - buffer[r] = '\0'; - - if (fnmatch(pattern, buffer, 0) != 0) - failmsg("Expected '%s' got '%s'", pattern, buffer); -} - -int main(int argc, char *argv[]) -{ - int p[2]; - int stdoutfd; - - setbuf(stdout, 0); - printf("1..1\n"); - stderrfd = dup(STDERR_FILENO); - if (stderrfd < 0) - err(1, "dup of stderr failed"); - - stdoutfd = dup(STDOUT_FILENO); - if (stdoutfd < 0) - err(1, "dup of stdout failed"); - - if (pipe(p) != 0) - failmsg("pipe failed"); - - if (dup2(p[1], STDERR_FILENO) < 0 || dup2(p[1], STDOUT_FILENO) < 0) - failmsg("Duplicating file descriptor"); - - plan_tests(10); - expect(p[0], "1..10\n"); - - ok(1, "msg1"); - expect(p[0], "ok 1 - msg1\n"); - - ok(0, "msg2"); - expect(p[0], "not ok 2 - msg2\n" - "# Failed test (*test/run.c:main() at line 91)\n"); - - ok1(true); - expect(p[0], "ok 3 - true\n"); - - ok1(false); - expect(p[0], "not ok 4 - false\n" - "# Failed test (*test/run.c:main() at line 98)\n"); - - pass("passed"); - expect(p[0], "ok 5 - passed\n"); - - fail("failed"); - expect(p[0], "not ok 6 - failed\n" - "# Failed test (*test/run.c:main() at line 105)\n"); - - skip(2, "skipping %s", "test"); - expect(p[0], "ok 7 # skip skipping test\n" - "ok 8 # skip skipping test\n"); - - todo_start("todo"); - ok1(false); - expect(p[0], "not ok 9 - false # TODO todo\n" - "# Failed (TODO) test (*test/run.c:main() at line 114)\n"); - ok1(true); - expect(p[0], "ok 10 - true # TODO todo\n"); - todo_end(); - - if (exit_status() != 3) - failmsg("Expected exit status 3, not %i", exit_status()); - -#if 0 - /* Manually run the atexit command. */ - _cleanup(); - expect(p[0], "# Looks like you failed 2 tests of 9.\n"); -#endif - - write_all(stdoutfd, "ok 1 - All passed\n", - strlen("ok 1 - All passed\n")); - exit(0); -} diff --git a/external/libwally-core/src/ccan/licenses/BSD-MIT b/external/libwally-core/src/ccan/licenses/BSD-MIT deleted file mode 100644 index 89de35479..000000000 --- a/external/libwally-core/src/ccan/licenses/BSD-MIT +++ /dev/null @@ -1,17 +0,0 @@ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/external/libwally-core/src/ccan/licenses/CC0 b/external/libwally-core/src/ccan/licenses/CC0 deleted file mode 100644 index feb9b118e..000000000 --- a/external/libwally-core/src/ccan/licenses/CC0 +++ /dev/null @@ -1,28 +0,0 @@ -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: - - the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; - moral rights retained by the original author(s) and/or performer(s); - publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; - rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; - rights protecting the extraction, dissemination, use and reuse of data in a Work; - database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and - other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. - -4. Limitations and Disclaimers. - - No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. - Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. - Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. - Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. diff --git a/external/libwally-core/src/ccan_config.h b/external/libwally-core/src/ccan_config.h deleted file mode 100644 index 516530bd3..000000000 --- a/external/libwally-core/src/ccan_config.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Config directives for ccan */ - -#ifdef WORDS_BIGENDIAN -# define HAVE_BIG_ENDIAN 1 -#else -# define HAVE_LITTLE_ENDIAN 1 -#endif - -#ifdef __GNUC__ -# define HAVE_ATTRIBUTE_COLD 1 -# define HAVE_ATTRIBUTE_NORETURN 1 -# define HAVE_ATTRIBUTE_PRINTF 1 -# define HAVE_ATTRIBUTE_CONST 1 -# define HAVE_ATTRIBUTE_PURE 1 -# define HAVE_ATTRIBUTE_UNUSED 1 -# define HAVE_ATTRIBUTE_USED 1 -# define HAVE_BUILTIN_CONSTANT_P 1 -# define HAVE_WARN_UNUSED_RESULT 1 -#endif - -#ifdef HAVE_BYTESWAP_H -#define HAVE_BSWAP_64 1 -#endif - -#if HAVE_UNALIGNED_ACCESS -#define alignment_ok(p, n) true -#else -#define alignment_ok(p, n) ((size_t)(p) % (n) == 0) -#endif - -/* Clear a set of memory areas passed as ptr1, len1, ptr2, len2 etc */ -void clear_n(unsigned int count, ...); - -#define CCAN_CLEAR_MEMORY(p, len) clear_n(1, p, len) diff --git a/external/libwally-core/src/cpufeatures/NOTICE b/external/libwally-core/src/cpufeatures/NOTICE deleted file mode 100644 index d6c092292..000000000 --- a/external/libwally-core/src/cpufeatures/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (C) 2016 The Android Open Source Project - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/external/libwally-core/src/cpufeatures/cpu-features.c b/external/libwally-core/src/cpufeatures/cpu-features.c deleted file mode 100644 index 7e3a6f02a..000000000 --- a/external/libwally-core/src/cpufeatures/cpu-features.c +++ /dev/null @@ -1,1281 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* ChangeLog for this library: - * - * NDK r10e?: Add MIPS MSA feature. - * - * NDK r10: Support for 64-bit CPUs (Intel, ARM & MIPS). - * - * NDK r8d: Add android_setCpu(). - * - * NDK r8c: Add new ARM CPU features: VFPv2, VFP_D32, VFP_FP16, - * VFP_FMA, NEON_FMA, IDIV_ARM, IDIV_THUMB2 and iWMMXt. - * - * Rewrite the code to parse /proc/self/auxv instead of - * the "Features" field in /proc/cpuinfo. - * - * Dynamically allocate the buffer that hold the content - * of /proc/cpuinfo to deal with newer hardware. - * - * NDK r7c: Fix CPU count computation. The old method only reported the - * number of _active_ CPUs when the library was initialized, - * which could be less than the real total. - * - * NDK r5: Handle buggy kernels which report a CPU Architecture number of 7 - * for an ARMv6 CPU (see below). - * - * Handle kernels that only report 'neon', and not 'vfpv3' - * (VFPv3 is mandated by the ARM architecture is Neon is implemented) - * - * Handle kernels that only report 'vfpv3d16', and not 'vfpv3' - * - * Fix x86 compilation. Report ANDROID_CPU_FAMILY_X86 in - * android_getCpuFamily(). - * - * NDK r4: Initial release - */ - -#include "cpu-features.h" - -#include -#include -#include -#include -#include -#include -#include - -static pthread_once_t g_once; -static int g_inited; -static AndroidCpuFamily g_cpuFamily; -static uint64_t g_cpuFeatures; -static int g_cpuCount; - -#ifdef __arm__ -static uint32_t g_cpuIdArm; -#endif - -#if 0 -static const int android_cpufeatures_debug = 0; - -#define D(...) \ - do { \ - if (android_cpufeatures_debug) { \ - printf(__VA_ARGS__); fflush(stdout); \ - } \ - } while (0) -#endif - -#ifdef __i386__ -static __inline__ void x86_cpuid(int func, int values[4]) -{ - int a, b, c, d; - /* We need to preserve ebx since we're compiling PIC code */ - /* this means we can't use "=b" for the second output register */ - __asm__ __volatile__ ( \ - "push %%ebx\n" - "cpuid\n" \ - "mov %%ebx, %1\n" - "pop %%ebx\n" - : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ - : "a" (func) \ - ); - values[0] = a; - values[1] = b; - values[2] = c; - values[3] = d; -} -#elif defined(__x86_64__) -static __inline__ void x86_cpuid(int func, int values[4]) -{ - int64_t a, b, c, d; - /* We need to preserve ebx since we're compiling PIC code */ - /* this means we can't use "=b" for the second output register */ - __asm__ __volatile__ ( \ - "push %%rbx\n" - "cpuid\n" \ - "mov %%rbx, %1\n" - "pop %%rbx\n" - : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ - : "a" (func) \ - ); - values[0] = a; - values[1] = b; - values[2] = c; - values[3] = d; -} -#endif - -/* Get the size of a file by reading it until the end. This is needed - * because files under /proc do not always return a valid size when - * using fseek(0, SEEK_END) + ftell(). Nor can they be mmap()-ed. - */ -static int -get_file_size(const char* pathname) -{ - - int fd, result = 0; - char buffer[256]; - - fd = open(pathname, O_RDONLY); - if (fd < 0) { - return -1; - } - - for (;;) { - int ret = read(fd, buffer, sizeof buffer); - if (ret < 0) { - if (errno == EINTR) - continue; - break; - } - if (ret == 0) - break; - - result += ret; - } - close(fd); - return result; -} - -/* Read the content of /proc/cpuinfo into a user-provided buffer. - * Return the length of the data, or -1 on error. Does *not* - * zero-terminate the content. Will not read more - * than 'buffsize' bytes. - */ -static int -read_file(const char* pathname, char* buffer, size_t buffsize) -{ - int fd, count; - - fd = open(pathname, O_RDONLY); - if (fd < 0) { - return -1; - } - count = 0; - while (count < (int)buffsize) { - int ret = read(fd, buffer + count, buffsize - count); - if (ret < 0) { - if (errno == EINTR) - continue; - if (count == 0) - count = -1; - break; - } - if (ret == 0) - break; - count += ret; - } - close(fd); - return count; -} - -#ifdef __arm__ -/* Extract the content of a the first occurence of a given field in - * the content of /proc/cpuinfo and return it as a heap-allocated - * string that must be freed by the caller. - * - * Return NULL if not found - */ -static char* -extract_cpuinfo_field(const char* buffer, int buflen, const char* field) -{ - int fieldlen = strlen(field); - const char* bufend = buffer + buflen; - char* result = NULL; - int len; - const char *p, *q; - - /* Look for first field occurence, and ensures it starts the line. */ - p = buffer; - for (;;) { - p = memmem(p, bufend-p, field, fieldlen); - if (p == NULL) - goto EXIT; - - if (p == buffer || p[-1] == '\n') - break; - - p += fieldlen; - } - - /* Skip to the first column followed by a space */ - p += fieldlen; - p = memchr(p, ':', bufend-p); - if (p == NULL || p[1] != ' ') - goto EXIT; - - /* Find the end of the line */ - p += 2; - q = memchr(p, '\n', bufend-p); - if (q == NULL) - q = bufend; - - /* Copy the line into a heap-allocated buffer */ - len = q-p; - result = malloc(len+1); - if (result == NULL) - goto EXIT; - - memcpy(result, p, len); - result[len] = '\0'; - -EXIT: - return result; -} - -/* Checks that a space-separated list of items contains one given 'item'. - * Returns 1 if found, 0 otherwise. - */ -static int -has_list_item(const char* list, const char* item) -{ - const char* p = list; - int itemlen = strlen(item); - - if (list == NULL) - return 0; - - while (*p) { - const char* q; - - /* skip spaces */ - while (*p == ' ' || *p == '\t') - p++; - - /* find end of current list item */ - q = p; - while (*q && *q != ' ' && *q != '\t') - q++; - - if (itemlen == q-p && !memcmp(p, item, itemlen)) - return 1; - - /* skip to next item */ - p = q; - } - return 0; -} -#endif /* __arm__ */ - -/* Parse a number starting from 'input', but not going further - * than 'limit'. Return the value into '*result'. - * - * NOTE: Does not skip over leading spaces, or deal with sign characters. - * NOTE: Ignores overflows. - * - * The function returns NULL in case of error (bad format), or the new - * position after the decimal number in case of success (which will always - * be <= 'limit'). - */ -static const char* -parse_number(const char* input, const char* limit, int base, int* result) -{ - const char* p = input; - int val = 0; - while (p < limit) { - int d = (*p - '0'); - if ((unsigned)d >= 10U) { - d = (*p - 'a'); - if ((unsigned)d >= 6U) - d = (*p - 'A'); - if ((unsigned)d >= 6U) - break; - d += 10; - } - if (d >= base) - break; - val = val*base + d; - p++; - } - if (p == input) - return NULL; - - *result = val; - return p; -} - -static const char* -parse_decimal(const char* input, const char* limit, int* result) -{ - return parse_number(input, limit, 10, result); -} - -#ifdef __arm__ -static const char* -parse_hexadecimal(const char* input, const char* limit, int* result) -{ - return parse_number(input, limit, 16, result); -} -#endif /* __arm__ */ - -/* This small data type is used to represent a CPU list / mask, as read - * from sysfs on Linux. See http://www.kernel.org/doc/Documentation/cputopology.txt - * - * For now, we don't expect more than 32 cores on mobile devices, so keep - * everything simple. - */ -typedef struct { - uint32_t mask; -} CpuList; - -static __inline__ void -cpulist_init(CpuList* list) { - list->mask = 0; -} - -static __inline__ void -cpulist_and(CpuList* list1, CpuList* list2) { - list1->mask &= list2->mask; -} - -static __inline__ void -cpulist_set(CpuList* list, int index) { - if ((unsigned)index < 32) { - list->mask |= (uint32_t)(1U << index); - } -} - -static __inline__ int -cpulist_count(CpuList* list) { - return __builtin_popcount(list->mask); -} - -/* Parse a textual list of cpus and store the result inside a CpuList object. - * Input format is the following: - * - comma-separated list of items (no spaces) - * - each item is either a single decimal number (cpu index), or a range made - * of two numbers separated by a single dash (-). Ranges are inclusive. - * - * Examples: 0 - * 2,4-127,128-143 - * 0-1 - */ -static void -cpulist_parse(CpuList* list, const char* line, int line_len) -{ - const char* p = line; - const char* end = p + line_len; - const char* q; - - /* NOTE: the input line coming from sysfs typically contains a - * trailing newline, so take care of it in the code below - */ - while (p < end && *p != '\n') - { - int val, start_value, end_value; - - /* Find the end of current item, and put it into 'q' */ - q = memchr(p, ',', end-p); - if (q == NULL) { - q = end; - } - - /* Get first value */ - p = parse_decimal(p, q, &start_value); - if (p == NULL) - goto BAD_FORMAT; - - end_value = start_value; - - /* If we're not at the end of the item, expect a dash and - * and integer; extract end value. - */ - if (p < q && *p == '-') { - p = parse_decimal(p+1, q, &end_value); - if (p == NULL) - goto BAD_FORMAT; - } - - /* Set bits CPU list bits */ - for (val = start_value; val <= end_value; val++) { - cpulist_set(list, val); - } - - /* Jump to next item */ - p = q; - if (p < end) - p++; - } - -BAD_FORMAT: - ; -} - -/* Read a CPU list from one sysfs file */ -static void -cpulist_read_from(CpuList* list, const char* filename) -{ - char file[64]; - int filelen; - - cpulist_init(list); - - filelen = read_file(filename, file, sizeof file); - if (filelen < 0) { - return; - } - - cpulist_parse(list, file, filelen); -} -#if defined(__aarch64__) -/* see kernel header */ -#define HWCAP_FP (1 << 0) -#define HWCAP_ASIMD (1 << 1) -#define HWCAP_AES (1 << 3) -#define HWCAP_PMULL (1 << 4) -#define HWCAP_SHA1 (1 << 5) -#define HWCAP_SHA2 (1 << 6) -#define HWCAP_CRC32 (1 << 7) -#endif - -#if defined(__arm__) - -/* See kernel header. */ -#define HWCAP_VFP (1 << 6) -#define HWCAP_IWMMXT (1 << 9) -#define HWCAP_NEON (1 << 12) -#define HWCAP_VFPv3 (1 << 13) -#define HWCAP_VFPv3D16 (1 << 14) -#define HWCAP_VFPv4 (1 << 16) -#define HWCAP_IDIVA (1 << 17) -#define HWCAP_IDIVT (1 << 18) - -/* see kernel header*/ -#define HWCAP2_AES (1 << 0) -#define HWCAP2_PMULL (1 << 1) -#define HWCAP2_SHA1 (1 << 2) -#define HWCAP2_SHA2 (1 << 3) -#define HWCAP2_CRC32 (1 << 4) - -/* This is the list of 32-bit ARMv7 optional features that are _always_*/ -/* supported by ARMv8 CPUs, as mandated by the ARM Architecture Reference*/ -/* Manual.*/ -#define HWCAP_SET_FOR_ARMV8 \ - ( HWCAP_VFP | \ - HWCAP_NEON | \ - HWCAP_VFPv3 | \ - HWCAP_VFPv4 | \ - HWCAP_IDIVA | \ - HWCAP_IDIVT ) -#endif - -#if defined(__mips__) -/* see kernel header*/ -#define HWCAP_MIPS_R6 (1 << 0) -#define HWCAP_MIPS_MSA (1 << 1) -#endif - -#if defined(__arm__) || defined(__aarch64__) || defined(__mips__) - -#define AT_HWCAP 16 -#define AT_HWCAP2 26 - -/* Probe the system's C library for a 'getauxval' function and call it if*/ -/* it exits, or return 0 for failure. This function is available since API*/ -/* level 20.*/ -/**/ -/* This code does *NOT* check for '__ANDROID_API__ >= 20' to support the*/ -/* edge case where some NDK developers use headers for a platform that is*/ -/* newer than the one really targetted by their application.*/ -/* This is typically done to use newer native APIs only when running on more*/ -/* recent Android versions, and requires careful symbol management.*/ -/**/ -/* Note that getauxval() can't really be re-implemented here, because*/ -/* its implementation does not parse /proc/self/auxv. Instead it depends*/ -/* on values that are passed by the kernel at process-init time to the*/ -/* C runtime initialization layer.*/ -static uint32_t -get_elf_hwcap_from_getauxval(int hwcap_type) { - typedef unsigned long getauxval_func_t(unsigned long); - void* libc_handle; - uint32_t ret = 0; - getauxval_func_t* func; - - dlerror(); - libc_handle = dlopen("libc.so", RTLD_NOW); - if (!libc_handle) { - return 0; - } - - func = (getauxval_func_t*) - dlsym(libc_handle, "getauxval"); - if (!func) { - } else { - /* Note: getauxval() returns 0 on failure. Doesn't touch errno.*/ - ret = (uint32_t)(*func)(hwcap_type); - } - dlclose(libc_handle); - return ret; -} -#endif - -#if defined(__arm__) -/* Parse /proc/self/auxv to extract the ELF HW capabilities bitmap for the*/ -/* current CPU. Note that this file is not accessible from regular*/ -/* application processes on some Android platform releases.*/ -/* On success, return new ELF hwcaps, or 0 on failure.*/ -static uint32_t -get_elf_hwcap_from_proc_self_auxv(void) { - struct { uint32_t tag; uint32_t value; } entry; - uint32_t result = 0; - const char filepath[] = "/proc/self/auxv"; - int fd = TEMP_FAILURE_RETRY(open(filepath, O_RDONLY)); - if (fd < 0) { - return 0; - } - - - for (;;) { - int ret = TEMP_FAILURE_RETRY(read(fd, (char*)&entry, sizeof entry)); - if (ret < 0) { - break; - } - /* Detect end of list.*/ - if (ret == 0 || (entry.tag == 0 && entry.value == 0)) - break; - if (entry.tag == AT_HWCAP) { - result = entry.value; - break; - } - } - close(fd); - return result; -} - -/* Compute the ELF HWCAP flags from the content of /proc/cpuinfo. - * This works by parsing the 'Features' line, which lists which optional - * features the device's CPU supports, on top of its reference - * architecture. - */ -static uint32_t -get_elf_hwcap_from_proc_cpuinfo(const char* cpuinfo, int cpuinfo_len) { - uint32_t hwcaps = 0; - long architecture = 0; - char* cpuFeatures; - char* cpuArch = extract_cpuinfo_field(cpuinfo, cpuinfo_len, "CPU architecture"); - if (cpuArch) { - architecture = strtol(cpuArch, NULL, 10); - free(cpuArch); - - if (architecture >= 8L) { - /* This is a 32-bit ARM binary running on a 64-bit ARM64 kernel.*/ - /* The 'Features' line only lists the optional features that the*/ - /* device's CPU supports, compared to its reference architecture*/ - /* which are of no use for this process.*/ - return HWCAP_SET_FOR_ARMV8; - } - } - - cpuFeatures = extract_cpuinfo_field(cpuinfo, cpuinfo_len, "Features"); - if (cpuFeatures != NULL) { - - if (has_list_item(cpuFeatures, "vfp")) - hwcaps |= HWCAP_VFP; - if (has_list_item(cpuFeatures, "vfpv3")) - hwcaps |= HWCAP_VFPv3; - if (has_list_item(cpuFeatures, "vfpv3d16")) - hwcaps |= HWCAP_VFPv3D16; - if (has_list_item(cpuFeatures, "vfpv4")) - hwcaps |= HWCAP_VFPv4; - if (has_list_item(cpuFeatures, "neon")) - hwcaps |= HWCAP_NEON; - if (has_list_item(cpuFeatures, "idiva")) - hwcaps |= HWCAP_IDIVA; - if (has_list_item(cpuFeatures, "idivt")) - hwcaps |= HWCAP_IDIVT; - if (has_list_item(cpuFeatures, "idiv")) - hwcaps |= HWCAP_IDIVA | HWCAP_IDIVT; - if (has_list_item(cpuFeatures, "iwmmxt")) - hwcaps |= HWCAP_IWMMXT; - - free(cpuFeatures); - } - return hwcaps; -} -#endif /* __arm__ */ - -/* Return the number of cpus present on a given device. - * - * To handle all weird kernel configurations, we need to compute the - * intersection of the 'present' and 'possible' CPU lists and count - * the result. - */ -static int -get_cpu_count(void) -{ - CpuList cpus_present[1]; - CpuList cpus_possible[1]; - - cpulist_read_from(cpus_present, "/sys/devices/system/cpu/present"); - cpulist_read_from(cpus_possible, "/sys/devices/system/cpu/possible"); - - /* Compute the intersection of both sets to get the actual number of - * CPU cores that can be used on this device by the kernel. - */ - cpulist_and(cpus_present, cpus_possible); - - return cpulist_count(cpus_present); -} - -static void -android_cpuInitFamily(void) -{ -#if defined(__arm__) - g_cpuFamily = ANDROID_CPU_FAMILY_ARM; -#elif defined(__i386__) - g_cpuFamily = ANDROID_CPU_FAMILY_X86; -#elif defined(__mips64) -/* Needs to be before __mips__ since the compiler defines both */ - g_cpuFamily = ANDROID_CPU_FAMILY_MIPS64; -#elif defined(__mips__) - g_cpuFamily = ANDROID_CPU_FAMILY_MIPS; -#elif defined(__aarch64__) - g_cpuFamily = ANDROID_CPU_FAMILY_ARM64; -#elif defined(__x86_64__) - g_cpuFamily = ANDROID_CPU_FAMILY_X86_64; -#else - g_cpuFamily = ANDROID_CPU_FAMILY_UNKNOWN; -#endif -} - -static void -android_cpuInit(void) -{ - char* cpuinfo = NULL; - int cpuinfo_len; - - android_cpuInitFamily(); - - g_cpuFeatures = 0; - g_cpuCount = 1; - g_inited = 1; - - cpuinfo_len = get_file_size("/proc/cpuinfo"); - if (cpuinfo_len < 0) { - return; - } - cpuinfo = malloc(cpuinfo_len); - if (cpuinfo == NULL) { - return; - } - cpuinfo_len = read_file("/proc/cpuinfo", cpuinfo, cpuinfo_len); - - if (cpuinfo_len < 0) /* should not happen */ { - free(cpuinfo); - return; - } - - /* Count the CPU cores, the value may be 0 for single-core CPUs */ - g_cpuCount = get_cpu_count(); - if (g_cpuCount == 0) { - g_cpuCount = 1; - } - -#ifdef __arm__ - { - /* Extract architecture from the "CPU Architecture" field. - * The list is well-known, unlike the the output of - * the 'Processor' field which can vary greatly. - * - * See the definition of the 'proc_arch' array in - * $KERNEL/arch/arm/kernel/setup.c and the 'c_show' function in - * same file. - */ - char* cpuArch = extract_cpuinfo_field(cpuinfo, cpuinfo_len, "CPU architecture"); - uint32_t hwcaps = 0; - uint32_t hwcaps2 = 0; - - if (cpuArch != NULL) { - char* end; - long archNumber; - int hasARMv7 = 0; - - /* read the initial decimal number, ignore the rest */ - archNumber = strtol(cpuArch, &end, 10); - - /* Note that ARMv8 is upwards compatible with ARMv7. */ - if (end > cpuArch && archNumber >= 7) { - hasARMv7 = 1; - } - - /* Unfortunately, it seems that certain ARMv6-based CPUs - * report an incorrect architecture number of 7! - * - * See http://code.google.com/p/android/issues/detail?id=10812 - * - * We try to correct this by looking at the 'elf_format' - * field reported by the 'Processor' field, which is of the - * form of "(v7l)" for an ARMv7-based CPU, and "(v6l)" for - * an ARMv6-one. - */ - if (hasARMv7) { - char* cpuProc = extract_cpuinfo_field(cpuinfo, cpuinfo_len, - "Processor"); - if (cpuProc != NULL) { - if (has_list_item(cpuProc, "(v6l)")) { - hasARMv7 = 0; - } - free(cpuProc); - } - } - - if (hasARMv7) { - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_ARMv7; - } - - /* The LDREX / STREX instructions are available from ARMv6 */ - if (archNumber >= 6) { - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_LDREX_STREX; - } - - free(cpuArch); - } - - /* Extract the list of CPU features from ELF hwcaps */ - hwcaps = get_elf_hwcap_from_getauxval(AT_HWCAP); - if (!hwcaps) { - hwcaps = get_elf_hwcap_from_proc_self_auxv(); - } - if (!hwcaps) { - /* Parsing /proc/self/auxv will fail from regular application*/ - /* processes on some Android platform versions, when this happens*/ - /* parse proc/cpuinfo instead.*/ - hwcaps = get_elf_hwcap_from_proc_cpuinfo(cpuinfo, cpuinfo_len); - } - - if (hwcaps != 0) { - int has_vfp = (hwcaps & HWCAP_VFP); - int has_vfpv3 = (hwcaps & HWCAP_VFPv3); - int has_vfpv3d16 = (hwcaps & HWCAP_VFPv3D16); - int has_vfpv4 = (hwcaps & HWCAP_VFPv4); - int has_neon = (hwcaps & HWCAP_NEON); - int has_idiva = (hwcaps & HWCAP_IDIVA); - int has_idivt = (hwcaps & HWCAP_IDIVT); - int has_iwmmxt = (hwcaps & HWCAP_IWMMXT); - - /* The kernel does a poor job at ensuring consistency when*/ - /* describing CPU features. So lots of guessing is needed.*/ - - /* 'vfpv4' implies VFPv3|VFP_FMA|FP16*/ - if (has_vfpv4) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFPv3 | - ANDROID_CPU_ARM_FEATURE_VFP_FP16 | - ANDROID_CPU_ARM_FEATURE_VFP_FMA; - - /* 'vfpv3' or 'vfpv3d16' imply VFPv3. Note that unlike GCC,*/ - /* a value of 'vfpv3' doesn't necessarily mean that the D32*/ - /* feature is present, so be conservative. All CPUs in the*/ - /* field that support D32 also support NEON, so this should*/ - /* not be a problem in practice.*/ - if (has_vfpv3 || has_vfpv3d16) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFPv3; - - /* 'vfp' is super ambiguous. Depending on the kernel, it can*/ - /* either mean VFPv2 or VFPv3. Make it depend on ARMv7.*/ - if (has_vfp) { - if (g_cpuFeatures & ANDROID_CPU_ARM_FEATURE_ARMv7) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFPv3; - else - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFPv2; - } - - /* Neon implies VFPv3|D32, and if vfpv4 is detected, NEON_FMA*/ - if (has_neon) { - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFPv3 | - ANDROID_CPU_ARM_FEATURE_NEON | - ANDROID_CPU_ARM_FEATURE_VFP_D32; - if (has_vfpv4) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_NEON_FMA; - } - - /* VFPv3 implies VFPv2 and ARMv7*/ - if (g_cpuFeatures & ANDROID_CPU_ARM_FEATURE_VFPv3) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_VFPv2 | - ANDROID_CPU_ARM_FEATURE_ARMv7; - - if (has_idiva) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_IDIV_ARM; - if (has_idivt) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2; - - if (has_iwmmxt) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_iWMMXt; - } - - /* Extract the list of CPU features from ELF hwcaps2 */ - hwcaps2 = get_elf_hwcap_from_getauxval(AT_HWCAP2); - if (hwcaps2 != 0) { - int has_aes = (hwcaps2 & HWCAP2_AES); - int has_pmull = (hwcaps2 & HWCAP2_PMULL); - int has_sha1 = (hwcaps2 & HWCAP2_SHA1); - int has_sha2 = (hwcaps2 & HWCAP2_SHA2); - int has_crc32 = (hwcaps2 & HWCAP2_CRC32); - - if (has_aes) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_AES; - if (has_pmull) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_PMULL; - if (has_sha1) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_SHA1; - if (has_sha2) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_SHA2; - if (has_crc32) - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_CRC32; - } - { - /* Extract the cpuid value from various fields */ - /* The CPUID value is broken up in several entries in /proc/cpuinfo.*/ - /* This table is used to rebuild it from the entries.*/ - static const struct CpuIdEntry { - const char* field; - char format; - char bit_lshift; - char bit_length; - } cpu_id_entries[] = { - { "CPU implementer", 'x', 24, 8 }, - { "CPU variant", 'x', 20, 4 }, - { "CPU part", 'x', 4, 12 }, - { "CPU revision", 'd', 0, 4 }, - }; - size_t i; - for (i = 0; - i < sizeof(cpu_id_entries)/sizeof(cpu_id_entries[0]); - ++i) { - const struct CpuIdEntry* entry = &cpu_id_entries[i]; - char* value = extract_cpuinfo_field(cpuinfo, - cpuinfo_len, - entry->field); - char* value_end; - int val = 0; - const char* start = value; - const char* p; - - if (value == NULL) - continue; - - value_end = value + strlen(value); - if (value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) { - start += 2; - p = parse_hexadecimal(start, value_end, &val); - } else if (entry->format == 'x') - p = parse_hexadecimal(value, value_end, &val); - else - p = parse_decimal(value, value_end, &val); - - if (p > (const char*)start) { - val &= ((1 << entry->bit_length)-1); - val <<= entry->bit_lshift; - g_cpuIdArm |= (uint32_t) val; - } - - free(value); - } - } - - { - /* Handle kernel configuration bugs that prevent the correct*/ - /* reporting of CPU features.*/ - static const struct CpuFix { - uint32_t cpuid; - uint64_t or_flags; - } cpu_fixes[] = { - /* The Nexus 4 (Qualcomm Krait) kernel configuration - * forgets to report IDIV support. */ - { 0x510006f2, ANDROID_CPU_ARM_FEATURE_IDIV_ARM | - ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 }, - { 0x510006f3, ANDROID_CPU_ARM_FEATURE_IDIV_ARM | - ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 }, - }; - size_t n; - for (n = 0; n < sizeof(cpu_fixes)/sizeof(cpu_fixes[0]); ++n) { - const struct CpuFix* entry = &cpu_fixes[n]; - - if (g_cpuIdArm == entry->cpuid) - g_cpuFeatures |= entry->or_flags; - } - } - - /* Special case: The emulator-specific Android 4.2 kernel fails*/ - /* to report support for the 32-bit ARM IDIV instruction.*/ - /* Technically, this is a feature of the virtual CPU implemented*/ - /* by the emulator. Note that it could also support Thumb IDIV*/ - /* in the future, and this will have to be slightly updated.*/ - { - char* hardware = extract_cpuinfo_field(cpuinfo, - cpuinfo_len, - "Hardware"); - if (hardware) { - if (!strcmp(hardware, "Goldfish") && - g_cpuIdArm == 0x4100c080 && - (g_cpuFamily & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0) { - g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_IDIV_ARM; - } - free(hardware); - } - } - } -#endif /* __arm__ */ -#ifdef __aarch64__ - { - /* Extract the list of CPU features from ELF hwcaps */ - uint32_t hwcaps = 0; - hwcaps = get_elf_hwcap_from_getauxval(AT_HWCAP); - if (hwcaps != 0) { - int has_fp = (hwcaps & HWCAP_FP); - int has_asimd = (hwcaps & HWCAP_ASIMD); - int has_aes = (hwcaps & HWCAP_AES); - int has_pmull = (hwcaps & HWCAP_PMULL); - int has_sha1 = (hwcaps & HWCAP_SHA1); - int has_sha2 = (hwcaps & HWCAP_SHA2); - int has_crc32 = (hwcaps & HWCAP_CRC32); - - if(has_fp == 0) { - } - if(has_asimd == 0) { - } - - if (has_fp) - g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_FP; - if (has_asimd) - g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_ASIMD; - if (has_aes) - g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_AES; - if (has_pmull) - g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_PMULL; - if (has_sha1) - g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_SHA1; - if (has_sha2) - g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_SHA2; - if (has_crc32) - g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_CRC32; - } - } -#endif /* __aarch64__ */ - -#if defined(__i386__) || defined(__x86_64__) - { - int regs[4]; - int vendorIsIntel; - -/* According to http://en.wikipedia.org/wiki/CPUID */ -#define VENDOR_INTEL_b 0x756e6547 -#define VENDOR_INTEL_c 0x6c65746e -#define VENDOR_INTEL_d 0x49656e69 - - x86_cpuid(0, regs); - vendorIsIntel = (regs[1] == VENDOR_INTEL_b && - regs[2] == VENDOR_INTEL_c && - regs[3] == VENDOR_INTEL_d); - - x86_cpuid(1, regs); - if ((regs[2] & (1 << 9)) != 0) { - g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SSSE3; - } - if ((regs[2] & (1 << 23)) != 0) { - g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_POPCNT; - } - if ((regs[2] & (1 << 19)) != 0) { - g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SSE4_1; - } - if ((regs[2] & (1 << 20)) != 0) { - g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SSE4_2; - } - if (vendorIsIntel && (regs[2] & (1 << 22)) != 0) { - g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_MOVBE; - } - } -#endif -#if defined( __mips__) - { /* MIPS and MIPS64 */ - /* Extract the list of CPU features from ELF hwcaps */ - uint32_t hwcaps = 0; - hwcaps = get_elf_hwcap_from_getauxval(AT_HWCAP); - if (hwcaps != 0) { - int has_r6 = (hwcaps & HWCAP_MIPS_R6); - int has_msa = (hwcaps & HWCAP_MIPS_MSA); - if (has_r6) - g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_R6; - if (has_msa) - g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_MSA; - } - } -#endif /* __mips__ */ - - free(cpuinfo); -} - - -AndroidCpuFamily -android_getCpuFamily(void) -{ - pthread_once(&g_once, android_cpuInit); - return g_cpuFamily; -} - - -uint64_t -android_getCpuFeatures(void) -{ - pthread_once(&g_once, android_cpuInit); - return g_cpuFeatures; -} - - -int -android_getCpuCount(void) -{ - pthread_once(&g_once, android_cpuInit); - return g_cpuCount; -} - -static void -android_cpuInitDummy(void) -{ - g_inited = 1; -} - -int -android_setCpu(int cpu_count, uint64_t cpu_features) -{ - /* Fail if the library was already initialized. */ - if (g_inited) - return 0; - - android_cpuInitFamily(); - g_cpuCount = (cpu_count <= 0 ? 1 : cpu_count); - g_cpuFeatures = cpu_features; - pthread_once(&g_once, android_cpuInitDummy); - - return 1; -} - -#ifdef __arm__ -uint32_t -android_getCpuIdArm(void) -{ - pthread_once(&g_once, android_cpuInit); - return g_cpuIdArm; -} - -int -android_setCpuArm(int cpu_count, uint64_t cpu_features, uint32_t cpu_id) -{ - if (!android_setCpu(cpu_count, cpu_features)) - return 0; - - g_cpuIdArm = cpu_id; - return 1; -} -#endif /* __arm__ */ - -/* - * Technical note: Making sense of ARM's FPU architecture versions. - * - * FPA was ARM's first attempt at an FPU architecture. There is no Android - * device that actually uses it since this technology was already obsolete - * when the project started. If you see references to FPA instructions - * somewhere, you can be sure that this doesn't apply to Android at all. - * - * FPA was followed by "VFP", soon renamed "VFPv1" due to the emergence of - * new versions / additions to it. ARM considers this obsolete right now, - * and no known Android device implements it either. - * - * VFPv2 added a few instructions to VFPv1, and is an *optional* extension - * supported by some ARMv5TE, ARMv6 and ARMv6T2 CPUs. Note that a device - * supporting the 'armeabi' ABI doesn't necessarily support these. - * - * VFPv3-D16 adds a few instructions on top of VFPv2 and is typically used - * on ARMv7-A CPUs which implement a FPU. Note that it is also mandated - * by the Android 'armeabi-v7a' ABI. The -D16 suffix in its name means - * that it provides 16 double-precision FPU registers (d0-d15) and 32 - * single-precision ones (s0-s31) which happen to be mapped to the same - * register banks. - * - * VFPv3-D32 is the name of an extension to VFPv3-D16 that provides 16 - * additional double precision registers (d16-d31). Note that there are - * still only 32 single precision registers. - * - * VFPv3xD is a *subset* of VFPv3-D16 that only provides single-precision - * registers. It is only used on ARMv7-M (i.e. on micro-controllers) which - * are not supported by Android. Note that it is not compatible with VFPv2. - * - * NOTE: The term 'VFPv3' usually designate either VFPv3-D16 or VFPv3-D32 - * depending on context. For example GCC uses it for VFPv3-D32, but - * the Linux kernel code uses it for VFPv3-D16 (especially in - * /proc/cpuinfo). Always try to use the full designation when - * possible. - * - * NEON, a.k.a. "ARM Advanced SIMD" is an extension that provides - * instructions to perform parallel computations on vectors of 8, 16, - * 32, 64 and 128 bit quantities. NEON requires VFPv32-D32 since all - * NEON registers are also mapped to the same register banks. - * - * VFPv4-D16, adds a few instructions on top of VFPv3-D16 in order to - * perform fused multiply-accumulate on VFP registers, as well as - * half-precision (16-bit) conversion operations. - * - * VFPv4-D32 is VFPv4-D16 with 32, instead of 16, FPU double precision - * registers. - * - * VPFv4-NEON is VFPv4-D32 with NEON instructions. It also adds fused - * multiply-accumulate instructions that work on the NEON registers. - * - * NOTE: Similarly, "VFPv4" might either reference VFPv4-D16 or VFPv4-D32 - * depending on context. - * - * The following information was determined by scanning the binutils-2.22 - * sources: - * - * Basic VFP instruction subsets: - * - * #define FPU_VFP_EXT_V1xD 0x08000000 // Base VFP instruction set. - * #define FPU_VFP_EXT_V1 0x04000000 // Double-precision insns. - * #define FPU_VFP_EXT_V2 0x02000000 // ARM10E VFPr1. - * #define FPU_VFP_EXT_V3xD 0x01000000 // VFPv3 single-precision. - * #define FPU_VFP_EXT_V3 0x00800000 // VFPv3 double-precision. - * #define FPU_NEON_EXT_V1 0x00400000 // Neon (SIMD) insns. - * #define FPU_VFP_EXT_D32 0x00200000 // Registers D16-D31. - * #define FPU_VFP_EXT_FP16 0x00100000 // Half-precision extensions. - * #define FPU_NEON_EXT_FMA 0x00080000 // Neon fused multiply-add - * #define FPU_VFP_EXT_FMA 0x00040000 // VFP fused multiply-add - * - * FPU types (excluding NEON) - * - * FPU_VFP_V1xD (EXT_V1xD) - * | - * +--------------------------+ - * | | - * FPU_VFP_V1 (+EXT_V1) FPU_VFP_V3xD (+EXT_V2+EXT_V3xD) - * | | - * | | - * FPU_VFP_V2 (+EXT_V2) FPU_VFP_V4_SP_D16 (+EXT_FP16+EXT_FMA) - * | - * FPU_VFP_V3D16 (+EXT_Vx3D+EXT_V3) - * | - * +--------------------------+ - * | | - * FPU_VFP_V3 (+EXT_D32) FPU_VFP_V4D16 (+EXT_FP16+EXT_FMA) - * | | - * | FPU_VFP_V4 (+EXT_D32) - * | - * FPU_VFP_HARD (+EXT_FMA+NEON_EXT_FMA) - * - * VFP architectures: - * - * ARCH_VFP_V1xD (EXT_V1xD) - * | - * +------------------+ - * | | - * | ARCH_VFP_V3xD (+EXT_V2+EXT_V3xD) - * | | - * | ARCH_VFP_V3xD_FP16 (+EXT_FP16) - * | | - * | ARCH_VFP_V4_SP_D16 (+EXT_FMA) - * | - * ARCH_VFP_V1 (+EXT_V1) - * | - * ARCH_VFP_V2 (+EXT_V2) - * | - * ARCH_VFP_V3D16 (+EXT_V3xD+EXT_V3) - * | - * +-------------------+ - * | | - * | ARCH_VFP_V3D16_FP16 (+EXT_FP16) - * | - * +-------------------+ - * | | - * | ARCH_VFP_V4_D16 (+EXT_FP16+EXT_FMA) - * | | - * | ARCH_VFP_V4 (+EXT_D32) - * | | - * | ARCH_NEON_VFP_V4 (+EXT_NEON+EXT_NEON_FMA) - * | - * ARCH_VFP_V3 (+EXT_D32) - * | - * +-------------------+ - * | | - * | ARCH_VFP_V3_FP16 (+EXT_FP16) - * | - * ARCH_VFP_V3_PLUS_NEON_V1 (+EXT_NEON) - * | - * ARCH_NEON_FP16 (+EXT_FP16) - * - * -fpu= values and their correspondance with FPU architectures above: - * - * {"vfp", FPU_ARCH_VFP_V2}, - * {"vfp9", FPU_ARCH_VFP_V2}, - * {"vfp3", FPU_ARCH_VFP_V3}, // For backwards compatbility. - * {"vfp10", FPU_ARCH_VFP_V2}, - * {"vfp10-r0", FPU_ARCH_VFP_V1}, - * {"vfpxd", FPU_ARCH_VFP_V1xD}, - * {"vfpv2", FPU_ARCH_VFP_V2}, - * {"vfpv3", FPU_ARCH_VFP_V3}, - * {"vfpv3-fp16", FPU_ARCH_VFP_V3_FP16}, - * {"vfpv3-d16", FPU_ARCH_VFP_V3D16}, - * {"vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16}, - * {"vfpv3xd", FPU_ARCH_VFP_V3xD}, - * {"vfpv3xd-fp16", FPU_ARCH_VFP_V3xD_FP16}, - * {"neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1}, - * {"neon-fp16", FPU_ARCH_NEON_FP16}, - * {"vfpv4", FPU_ARCH_VFP_V4}, - * {"vfpv4-d16", FPU_ARCH_VFP_V4D16}, - * {"fpv4-sp-d16", FPU_ARCH_VFP_V4_SP_D16}, - * {"neon-vfpv4", FPU_ARCH_NEON_VFP_V4}, - * - * - * Simplified diagram that only includes FPUs supported by Android: - * Only ARCH_VFP_V3D16 is actually mandated by the armeabi-v7a ABI, - * all others are optional and must be probed at runtime. - * - * ARCH_VFP_V3D16 (EXT_V1xD+EXT_V1+EXT_V2+EXT_V3xD+EXT_V3) - * | - * +-------------------+ - * | | - * | ARCH_VFP_V3D16_FP16 (+EXT_FP16) - * | - * +-------------------+ - * | | - * | ARCH_VFP_V4_D16 (+EXT_FP16+EXT_FMA) - * | | - * | ARCH_VFP_V4 (+EXT_D32) - * | | - * | ARCH_NEON_VFP_V4 (+EXT_NEON+EXT_NEON_FMA) - * | - * ARCH_VFP_V3 (+EXT_D32) - * | - * +-------------------+ - * | | - * | ARCH_VFP_V3_FP16 (+EXT_FP16) - * | - * ARCH_VFP_V3_PLUS_NEON_V1 (+EXT_NEON) - * | - * ARCH_NEON_FP16 (+EXT_FP16) - * - */ diff --git a/external/libwally-core/src/cpufeatures/cpu-features.h b/external/libwally-core/src/cpufeatures/cpu-features.h deleted file mode 100644 index dc9e6eed0..000000000 --- a/external/libwally-core/src/cpufeatures/cpu-features.h +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifndef CPU_FEATURES_H -#define CPU_FEATURES_H - -#include -#include - -__BEGIN_DECLS - -/* A list of valid values returned by android_getCpuFamily(). - * They describe the CPU Architecture of the current process. - */ -typedef enum { - ANDROID_CPU_FAMILY_UNKNOWN = 0, - ANDROID_CPU_FAMILY_ARM, - ANDROID_CPU_FAMILY_X86, - ANDROID_CPU_FAMILY_MIPS, - ANDROID_CPU_FAMILY_ARM64, - ANDROID_CPU_FAMILY_X86_64, - ANDROID_CPU_FAMILY_MIPS64, - - ANDROID_CPU_FAMILY_MAX /* do not remove */ - -} AndroidCpuFamily; - -/* Return the CPU family of the current process. - * - * Note that this matches the bitness of the current process. I.e. when - * running a 32-bit binary on a 64-bit capable CPU, this will return the - * 32-bit CPU family value. - */ -extern AndroidCpuFamily android_getCpuFamily(void); - -/* Return a bitmap describing a set of optional CPU features that are - * supported by the current device's CPU. The exact bit-flags returned - * depend on the value returned by android_getCpuFamily(). See the - * documentation for the ANDROID_CPU_*_FEATURE_* flags below for details. - */ -extern uint64_t android_getCpuFeatures(void); - -/* The list of feature flags for ANDROID_CPU_FAMILY_ARM that can be - * recognized by the library (see note below for 64-bit ARM). Value details - * are: - * - * VFPv2: - * CPU supports the VFPv2 instruction set. Many, but not all, ARMv6 CPUs - * support these instructions. VFPv2 is a subset of VFPv3 so this will - * be set whenever VFPv3 is set too. - * - * ARMv7: - * CPU supports the ARMv7-A basic instruction set. - * This feature is mandated by the 'armeabi-v7a' ABI. - * - * VFPv3: - * CPU supports the VFPv3-D16 instruction set, providing hardware FPU - * support for single and double precision floating point registers. - * Note that only 16 FPU registers are available by default, unless - * the D32 bit is set too. This feature is also mandated by the - * 'armeabi-v7a' ABI. - * - * VFP_D32: - * CPU VFP optional extension that provides 32 FPU registers, - * instead of 16. Note that ARM mandates this feature is the 'NEON' - * feature is implemented by the CPU. - * - * NEON: - * CPU FPU supports "ARM Advanced SIMD" instructions, also known as - * NEON. Note that this mandates the VFP_D32 feature as well, per the - * ARM Architecture specification. - * - * VFP_FP16: - * Half-width floating precision VFP extension. If set, the CPU - * supports instructions to perform floating-point operations on - * 16-bit registers. This is part of the VFPv4 specification, but - * not mandated by any Android ABI. - * - * VFP_FMA: - * Fused multiply-accumulate VFP instructions extension. Also part of - * the VFPv4 specification, but not mandated by any Android ABI. - * - * NEON_FMA: - * Fused multiply-accumulate NEON instructions extension. Optional - * extension from the VFPv4 specification, but not mandated by any - * Android ABI. - * - * IDIV_ARM: - * Integer division available in ARM mode. Only available - * on recent CPUs (e.g. Cortex-A15). - * - * IDIV_THUMB2: - * Integer division available in Thumb-2 mode. Only available - * on recent CPUs (e.g. Cortex-A15). - * - * iWMMXt: - * Optional extension that adds MMX registers and operations to an - * ARM CPU. This is only available on a few XScale-based CPU designs - * sold by Marvell. Pretty rare in practice. - * - * AES: - * CPU supports AES instructions. These instructions are only - * available for 32-bit applications running on ARMv8 CPU. - * - * CRC32: - * CPU supports CRC32 instructions. These instructions are only - * available for 32-bit applications running on ARMv8 CPU. - * - * SHA2: - * CPU supports SHA2 instructions. These instructions are only - * available for 32-bit applications running on ARMv8 CPU. - * - * SHA1: - * CPU supports SHA1 instructions. These instructions are only - * available for 32-bit applications running on ARMv8 CPU. - * - * PMULL: - * CPU supports 64-bit PMULL and PMULL2 instructions. These - * instructions are only available for 32-bit applications - * running on ARMv8 CPU. - * - * If you want to tell the compiler to generate code that targets one of - * the feature set above, you should probably use one of the following - * flags (for more details, see technical note at the end of this file): - * - * -mfpu=vfp - * -mfpu=vfpv2 - * These are equivalent and tell GCC to use VFPv2 instructions for - * floating-point operations. Use this if you want your code to - * run on *some* ARMv6 devices, and any ARMv7-A device supported - * by Android. - * - * Generated code requires VFPv2 feature. - * - * -mfpu=vfpv3-d16 - * Tell GCC to use VFPv3 instructions (using only 16 FPU registers). - * This should be generic code that runs on any CPU that supports the - * 'armeabi-v7a' Android ABI. Note that no ARMv6 CPU supports this. - * - * Generated code requires VFPv3 feature. - * - * -mfpu=vfpv3 - * Tell GCC to use VFPv3 instructions with 32 FPU registers. - * Generated code requires VFPv3|VFP_D32 features. - * - * -mfpu=neon - * Tell GCC to use VFPv3 instructions with 32 FPU registers, and - * also support NEON intrinsics (see ). - * Generated code requires VFPv3|VFP_D32|NEON features. - * - * -mfpu=vfpv4-d16 - * Generated code requires VFPv3|VFP_FP16|VFP_FMA features. - * - * -mfpu=vfpv4 - * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32 features. - * - * -mfpu=neon-vfpv4 - * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32|NEON|NEON_FMA - * features. - * - * -mcpu=cortex-a7 - * -mcpu=cortex-a15 - * Generated code requires VFPv3|VFP_FP16|VFP_FMA|VFP_D32| - * NEON|NEON_FMA|IDIV_ARM|IDIV_THUMB2 - * This flag implies -mfpu=neon-vfpv4. - * - * -mcpu=iwmmxt - * Allows the use of iWMMXt instrinsics with GCC. - * - * IMPORTANT NOTE: These flags should only be tested when - * android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM, i.e. this is a - * 32-bit process. - * - * When running a 64-bit ARM process on an ARMv8 CPU, - * android_getCpuFeatures() will return a different set of bitflags - */ -enum { - ANDROID_CPU_ARM_FEATURE_ARMv7 = (1 << 0), - ANDROID_CPU_ARM_FEATURE_VFPv3 = (1 << 1), - ANDROID_CPU_ARM_FEATURE_NEON = (1 << 2), - ANDROID_CPU_ARM_FEATURE_LDREX_STREX = (1 << 3), - ANDROID_CPU_ARM_FEATURE_VFPv2 = (1 << 4), - ANDROID_CPU_ARM_FEATURE_VFP_D32 = (1 << 5), - ANDROID_CPU_ARM_FEATURE_VFP_FP16 = (1 << 6), - ANDROID_CPU_ARM_FEATURE_VFP_FMA = (1 << 7), - ANDROID_CPU_ARM_FEATURE_NEON_FMA = (1 << 8), - ANDROID_CPU_ARM_FEATURE_IDIV_ARM = (1 << 9), - ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 = (1 << 10), - ANDROID_CPU_ARM_FEATURE_iWMMXt = (1 << 11), - ANDROID_CPU_ARM_FEATURE_AES = (1 << 12), - ANDROID_CPU_ARM_FEATURE_PMULL = (1 << 13), - ANDROID_CPU_ARM_FEATURE_SHA1 = (1 << 14), - ANDROID_CPU_ARM_FEATURE_SHA2 = (1 << 15), - ANDROID_CPU_ARM_FEATURE_CRC32 = (1 << 16) -}; - -/* The bit flags corresponding to the output of android_getCpuFeatures() - * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM64. Value details - * are: - * - * FP: - * CPU has Floating-point unit. - * - * ASIMD: - * CPU has Advanced SIMD unit. - * - * AES: - * CPU supports AES instructions. - * - * CRC32: - * CPU supports CRC32 instructions. - * - * SHA2: - * CPU supports SHA2 instructions. - * - * SHA1: - * CPU supports SHA1 instructions. - * - * PMULL: - * CPU supports 64-bit PMULL and PMULL2 instructions. - */ -enum { - ANDROID_CPU_ARM64_FEATURE_FP = (1 << 0), - ANDROID_CPU_ARM64_FEATURE_ASIMD = (1 << 1), - ANDROID_CPU_ARM64_FEATURE_AES = (1 << 2), - ANDROID_CPU_ARM64_FEATURE_PMULL = (1 << 3), - ANDROID_CPU_ARM64_FEATURE_SHA1 = (1 << 4), - ANDROID_CPU_ARM64_FEATURE_SHA2 = (1 << 5), - ANDROID_CPU_ARM64_FEATURE_CRC32 = (1 << 6) -}; - -/* The bit flags corresponding to the output of android_getCpuFeatures() - * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_X86 or - * ANDROID_CPU_FAMILY_X86_64. - */ -enum { - ANDROID_CPU_X86_FEATURE_SSSE3 = (1 << 0), - ANDROID_CPU_X86_FEATURE_POPCNT = (1 << 1), - ANDROID_CPU_X86_FEATURE_MOVBE = (1 << 2), - ANDROID_CPU_X86_FEATURE_SSE4_1 = (1 << 3), - ANDROID_CPU_X86_FEATURE_SSE4_2 = (1 << 4) -}; - -/* The bit flags corresponding to the output of android_getCpuFeatures() - * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_MIPS - * or ANDROID_CPU_FAMILY_MIPS64. Values are: - * - * R6: - * CPU executes MIPS Release 6 instructions natively, and - * supports obsoleted R1..R5 instructions only via kernel traps. - * - * MSA: - * CPU supports Mips SIMD Architecture instructions. - */ -enum { - ANDROID_CPU_MIPS_FEATURE_R6 = (1 << 0), - ANDROID_CPU_MIPS_FEATURE_MSA = (1 << 1) -}; - - -/* Return the number of CPU cores detected on this device. */ -extern int android_getCpuCount(void); - -/* The following is used to force the CPU count and features - * mask in sandboxed processes. Under 4.1 and higher, these processes - * cannot access /proc, which is the only way to get information from - * the kernel about the current hardware (at least on ARM). - * - * It _must_ be called only once, and before any android_getCpuXXX - * function, any other case will fail. - * - * This function return 1 on success, and 0 on failure. - */ -extern int android_setCpu(int cpu_count, - uint64_t cpu_features); - -#ifdef __arm__ -/* Retrieve the ARM 32-bit CPUID value from the kernel. - * Note that this cannot work on sandboxed processes under 4.1 and - * higher, unless you called android_setCpuArm() before. - */ -extern uint32_t android_getCpuIdArm(void); - -/* An ARM-specific variant of android_setCpu() that also allows you - * to set the ARM CPUID field. - */ -extern int android_setCpuArm(int cpu_count, - uint64_t cpu_features, - uint32_t cpu_id); -#endif - -__END_DECLS - -#endif /* CPU_FEATURES_H */ diff --git a/external/libwally-core/src/ctaes/COPYING b/external/libwally-core/src/ctaes/COPYING deleted file mode 100644 index 415b202a2..000000000 --- a/external/libwally-core/src/ctaes/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Pieter Wuille - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/external/libwally-core/src/ctaes/README.md b/external/libwally-core/src/ctaes/README.md deleted file mode 100644 index 0e7fe1775..000000000 --- a/external/libwally-core/src/ctaes/README.md +++ /dev/null @@ -1,41 +0,0 @@ -ctaes -===== - -Simple C module for constant-time AES encryption and decryption. - -Features: -* Simple, pure C code without any dependencies. -* No tables or data-dependent branches whatsoever, but using bit sliced approach from https://eprint.iacr.org/2009/129.pdf. -* Very small object code: slightly over 4k of executable code when compiled with -Os. -* Slower than implementations based on precomputed tables or specialized instructions, but can do ~15 MB/s on modern CPUs. - -Performance ------------ - -Compiled with GCC 5.3.1 with -O3, on an Intel(R) Core(TM) i7-4800MQ CPU, numbers in CPU cycles: - -| Algorithm | Key schedule | Encryption per byte | Decryption per byte | -| --------- | ------------:| -------------------:| -------------------:| -| AES-128 | 2.8k | 154 | 161 | -| AES-192 | 3.1k | 169 | 181 | -| AES-256 | 4.0k | 191 | 203 | - -Build steps ------------ - -Object code: - - $ gcc -O3 ctaes.c -c -o ctaes.o - -Tests: - - $ gcc -O3 ctaes.c test.c -o test - -Benchmark: - - $ gcc -O3 ctaes.c bench.c -o bench - -Review ------- - -Results of a formal review of the code can be found in http://bitcoin.sipa.be/ctaes/review.zip diff --git a/external/libwally-core/src/ctaes/bench.c b/external/libwally-core/src/ctaes/bench.c deleted file mode 100644 index a86df496c..000000000 --- a/external/libwally-core/src/ctaes/bench.c +++ /dev/null @@ -1,170 +0,0 @@ -#include -#include -#include "sys/time.h" - -#include "ctaes.h" - -static double gettimedouble(void) { - struct timeval tv; - gettimeofday(&tv, NULL); - return tv.tv_usec * 0.000001 + tv.tv_sec; -} - -static void print_number(double x) { - double y = x; - int c = 0; - if (y < 0.0) { - y = -y; - } - while (y < 100.0) { - y *= 10.0; - c++; - } - printf("%.*f", c, x); -} - -static void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) { - int i; - double min = HUGE_VAL; - double sum = 0.0; - double max = 0.0; - for (i = 0; i < count; i++) { - double begin, total; - if (setup != NULL) { - setup(data); - } - begin = gettimedouble(); - benchmark(data); - total = gettimedouble() - begin; - if (teardown != NULL) { - teardown(data); - } - if (total < min) { - min = total; - } - if (total > max) { - max = total; - } - sum += total; - } - printf("%s: min ", name); - print_number(min * 1000000000.0 / iter); - printf("ns / avg "); - print_number((sum / count) * 1000000000.0 / iter); - printf("ns / max "); - print_number(max * 1000000000.0 / iter); - printf("ns\n"); -} - -static void bench_AES128_init(void* data) { - AES128_ctx* ctx = (AES128_ctx*)data; - int i; - for (i = 0; i < 50000; i++) { - AES128_init(ctx, (unsigned char*)ctx); - } -} - -static void bench_AES128_encrypt_setup(void* data) { - AES128_ctx* ctx = (AES128_ctx*)data; - static const unsigned char key[16] = {0}; - AES128_init(ctx, key); -} - -static void bench_AES128_encrypt(void* data) { - const AES128_ctx* ctx = (const AES128_ctx*)data; - unsigned char scratch[16] = {0}; - int i; - for (i = 0; i < 4000000 / 16; i++) { - AES128_encrypt(ctx, 1, scratch, scratch); - } -} - -static void bench_AES128_decrypt(void* data) { - const AES128_ctx* ctx = (const AES128_ctx*)data; - unsigned char scratch[16] = {0}; - int i; - for (i = 0; i < 4000000 / 16; i++) { - AES128_decrypt(ctx, 1, scratch, scratch); - } -} - -static void bench_AES192_init(void* data) { - AES192_ctx* ctx = (AES192_ctx*)data; - int i; - for (i = 0; i < 50000; i++) { - AES192_init(ctx, (unsigned char*)ctx); - } -} - -static void bench_AES192_encrypt_setup(void* data) { - AES192_ctx* ctx = (AES192_ctx*)data; - static const unsigned char key[16] = {0}; - AES192_init(ctx, key); -} - -static void bench_AES192_encrypt(void* data) { - const AES192_ctx* ctx = (const AES192_ctx*)data; - unsigned char scratch[16] = {0}; - int i; - for (i = 0; i < 4000000 / 16; i++) { - AES192_encrypt(ctx, 1, scratch, scratch); - } -} - -static void bench_AES192_decrypt(void* data) { - const AES192_ctx* ctx = (const AES192_ctx*)data; - unsigned char scratch[16] = {0}; - int i; - for (i = 0; i < 4000000 / 16; i++) { - AES192_decrypt(ctx, 1, scratch, scratch); - } -} - -static void bench_AES256_init(void* data) { - AES256_ctx* ctx = (AES256_ctx*)data; - int i; - for (i = 0; i < 50000; i++) { - AES256_init(ctx, (unsigned char*)ctx); - } -} - - -static void bench_AES256_encrypt_setup(void* data) { - AES256_ctx* ctx = (AES256_ctx*)data; - static const unsigned char key[16] = {0}; - AES256_init(ctx, key); -} - -static void bench_AES256_encrypt(void* data) { - const AES256_ctx* ctx = (const AES256_ctx*)data; - unsigned char scratch[16] = {0}; - int i; - for (i = 0; i < 4000000 / 16; i++) { - AES256_encrypt(ctx, 1, scratch, scratch); - } -} - -static void bench_AES256_decrypt(void* data) { - const AES256_ctx* ctx = (const AES256_ctx*)data; - unsigned char scratch[16] = {0}; - int i; - for (i = 0; i < 4000000 / 16; i++) { - AES256_decrypt(ctx, 1, scratch, scratch); - } -} - -int main(void) { - AES128_ctx ctx128; - AES192_ctx ctx192; - AES256_ctx ctx256; - run_benchmark("aes128_init", bench_AES128_init, NULL, NULL, &ctx128, 20, 50000); - run_benchmark("aes128_encrypt_byte", bench_AES128_encrypt, bench_AES128_encrypt_setup, NULL, &ctx128, 20, 4000000); - run_benchmark("aes128_decrypt_byte", bench_AES128_decrypt, bench_AES128_encrypt_setup, NULL, &ctx128, 20, 4000000); - run_benchmark("aes192_init", bench_AES192_init, NULL, NULL, &ctx192, 20, 50000); - run_benchmark("aes192_encrypt_byte", bench_AES192_encrypt, bench_AES192_encrypt_setup, NULL, &ctx192, 20, 4000000); - run_benchmark("aes192_decrypt_byte", bench_AES192_decrypt, bench_AES192_encrypt_setup, NULL, &ctx192, 20, 4000000); - run_benchmark("aes256_init", bench_AES256_init, NULL, NULL, &ctx256, 20, 50000); - run_benchmark("aes256_encrypt_byte", bench_AES256_encrypt, bench_AES256_encrypt_setup, NULL, &ctx256, 20, 4000000); - run_benchmark("aes256_decrypt_byte", bench_AES256_decrypt, bench_AES256_encrypt_setup, NULL, &ctx256, 20, 4000000); - return 0; -} diff --git a/external/libwally-core/src/ctaes/ctaes.c b/external/libwally-core/src/ctaes/ctaes.c deleted file mode 100644 index 55962bf25..000000000 --- a/external/libwally-core/src/ctaes/ctaes.c +++ /dev/null @@ -1,556 +0,0 @@ - /********************************************************************* - * Copyright (c) 2016 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -/* Constant time, unoptimized, concise, plain C, AES implementation - * Based On: - * Emilia Kasper and Peter Schwabe, Faster and Timing-Attack Resistant AES-GCM - * http://www.iacr.org/archive/ches2009/57470001/57470001.pdf - * But using 8 16-bit integers representing a single AES state rather than 8 128-bit - * integers representing 8 AES states. - */ - -#include "ctaes.h" - -/* Slice variable slice_i contains the i'th bit of the 16 state variables in this order: - * 0 1 2 3 - * 4 5 6 7 - * 8 9 10 11 - * 12 13 14 15 - */ - -/** Convert a byte to sliced form, storing it corresponding to given row and column in s */ -static void LoadByte(AES_state* s, unsigned char byte, int r, int c) { - int i; - for (i = 0; i < 8; i++) { - s->slice[i] |= (byte & 1) << (r * 4 + c); - byte >>= 1; - } -} - -/** Load 16 bytes of data into 8 sliced integers */ -static void LoadBytes(AES_state *s, const unsigned char* data16) { - int c; - for (c = 0; c < 4; c++) { - int r; - for (r = 0; r < 4; r++) { - LoadByte(s, *(data16++), r, c); - } - } -} - -/** Convert 8 sliced integers into 16 bytes of data */ -static void SaveBytes(unsigned char* data16, const AES_state *s) { - int c; - for (c = 0; c < 4; c++) { - int r; - for (r = 0; r < 4; r++) { - int b; - uint8_t v = 0; - for (b = 0; b < 8; b++) { - v |= ((s->slice[b] >> (r * 4 + c)) & 1) << b; - } - *(data16++) = v; - } - } -} - -/* S-box implementation based on the gate logic from: - * Joan Boyar and Rene Peralta, A depth-16 circuit for the AES S-box. - * https://eprint.iacr.org/2011/332.pdf -*/ -static void SubBytes(AES_state *s, int inv) { - /* Load the bit slices */ - uint16_t U0 = s->slice[7], U1 = s->slice[6], U2 = s->slice[5], U3 = s->slice[4]; - uint16_t U4 = s->slice[3], U5 = s->slice[2], U6 = s->slice[1], U7 = s->slice[0]; - - uint16_t T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16; - uint16_t T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, D; - uint16_t M1, M6, M11, M13, M15, M20, M21, M22, M23, M25, M37, M38, M39, M40; - uint16_t M41, M42, M43, M44, M45, M46, M47, M48, M49, M50, M51, M52, M53, M54; - uint16_t M55, M56, M57, M58, M59, M60, M61, M62, M63; - - if (inv) { - uint16_t R5, R13, R17, R18, R19; - /* Undo linear postprocessing */ - T23 = U0 ^ U3; - T22 = ~(U1 ^ U3); - T2 = ~(U0 ^ U1); - T1 = U3 ^ U4; - T24 = ~(U4 ^ U7); - R5 = U6 ^ U7; - T8 = ~(U1 ^ T23); - T19 = T22 ^ R5; - T9 = ~(U7 ^ T1); - T10 = T2 ^ T24; - T13 = T2 ^ R5; - T3 = T1 ^ R5; - T25 = ~(U2 ^ T1); - R13 = U1 ^ U6; - T17 = ~(U2 ^ T19); - T20 = T24 ^ R13; - T4 = U4 ^ T8; - R17 = ~(U2 ^ U5); - R18 = ~(U5 ^ U6); - R19 = ~(U2 ^ U4); - D = U0 ^ R17; - T6 = T22 ^ R17; - T16 = R13 ^ R19; - T27 = T1 ^ R18; - T15 = T10 ^ T27; - T14 = T10 ^ R18; - T26 = T3 ^ T16; - } else { - /* Linear preprocessing. */ - T1 = U0 ^ U3; - T2 = U0 ^ U5; - T3 = U0 ^ U6; - T4 = U3 ^ U5; - T5 = U4 ^ U6; - T6 = T1 ^ T5; - T7 = U1 ^ U2; - T8 = U7 ^ T6; - T9 = U7 ^ T7; - T10 = T6 ^ T7; - T11 = U1 ^ U5; - T12 = U2 ^ U5; - T13 = T3 ^ T4; - T14 = T6 ^ T11; - T15 = T5 ^ T11; - T16 = T5 ^ T12; - T17 = T9 ^ T16; - T18 = U3 ^ U7; - T19 = T7 ^ T18; - T20 = T1 ^ T19; - T21 = U6 ^ U7; - T22 = T7 ^ T21; - T23 = T2 ^ T22; - T24 = T2 ^ T10; - T25 = T20 ^ T17; - T26 = T3 ^ T16; - T27 = T1 ^ T12; - D = U7; - } - - /* Non-linear transformation (shared between the forward and backward case) */ - M1 = T13 & T6; - M6 = T3 & T16; - M11 = T1 & T15; - M13 = (T4 & T27) ^ M11; - M15 = (T2 & T10) ^ M11; - M20 = T14 ^ M1 ^ (T23 & T8) ^ M13; - M21 = (T19 & D) ^ M1 ^ T24 ^ M15; - M22 = T26 ^ M6 ^ (T22 & T9) ^ M13; - M23 = (T20 & T17) ^ M6 ^ M15 ^ T25; - M25 = M22 & M20; - M37 = M21 ^ ((M20 ^ M21) & (M23 ^ M25)); - M38 = M20 ^ M25 ^ (M21 | (M20 & M23)); - M39 = M23 ^ ((M22 ^ M23) & (M21 ^ M25)); - M40 = M22 ^ M25 ^ (M23 | (M21 & M22)); - M41 = M38 ^ M40; - M42 = M37 ^ M39; - M43 = M37 ^ M38; - M44 = M39 ^ M40; - M45 = M42 ^ M41; - M46 = M44 & T6; - M47 = M40 & T8; - M48 = M39 & D; - M49 = M43 & T16; - M50 = M38 & T9; - M51 = M37 & T17; - M52 = M42 & T15; - M53 = M45 & T27; - M54 = M41 & T10; - M55 = M44 & T13; - M56 = M40 & T23; - M57 = M39 & T19; - M58 = M43 & T3; - M59 = M38 & T22; - M60 = M37 & T20; - M61 = M42 & T1; - M62 = M45 & T4; - M63 = M41 & T2; - - if (inv){ - /* Undo linear preprocessing */ - uint16_t P0 = M52 ^ M61; - uint16_t P1 = M58 ^ M59; - uint16_t P2 = M54 ^ M62; - uint16_t P3 = M47 ^ M50; - uint16_t P4 = M48 ^ M56; - uint16_t P5 = M46 ^ M51; - uint16_t P6 = M49 ^ M60; - uint16_t P7 = P0 ^ P1; - uint16_t P8 = M50 ^ M53; - uint16_t P9 = M55 ^ M63; - uint16_t P10 = M57 ^ P4; - uint16_t P11 = P0 ^ P3; - uint16_t P12 = M46 ^ M48; - uint16_t P13 = M49 ^ M51; - uint16_t P14 = M49 ^ M62; - uint16_t P15 = M54 ^ M59; - uint16_t P16 = M57 ^ M61; - uint16_t P17 = M58 ^ P2; - uint16_t P18 = M63 ^ P5; - uint16_t P19 = P2 ^ P3; - uint16_t P20 = P4 ^ P6; - uint16_t P22 = P2 ^ P7; - uint16_t P23 = P7 ^ P8; - uint16_t P24 = P5 ^ P7; - uint16_t P25 = P6 ^ P10; - uint16_t P26 = P9 ^ P11; - uint16_t P27 = P10 ^ P18; - uint16_t P28 = P11 ^ P25; - uint16_t P29 = P15 ^ P20; - s->slice[7] = P13 ^ P22; - s->slice[6] = P26 ^ P29; - s->slice[5] = P17 ^ P28; - s->slice[4] = P12 ^ P22; - s->slice[3] = P23 ^ P27; - s->slice[2] = P19 ^ P24; - s->slice[1] = P14 ^ P23; - s->slice[0] = P9 ^ P16; - } else { - /* Linear postprocessing */ - uint16_t L0 = M61 ^ M62; - uint16_t L1 = M50 ^ M56; - uint16_t L2 = M46 ^ M48; - uint16_t L3 = M47 ^ M55; - uint16_t L4 = M54 ^ M58; - uint16_t L5 = M49 ^ M61; - uint16_t L6 = M62 ^ L5; - uint16_t L7 = M46 ^ L3; - uint16_t L8 = M51 ^ M59; - uint16_t L9 = M52 ^ M53; - uint16_t L10 = M53 ^ L4; - uint16_t L11 = M60 ^ L2; - uint16_t L12 = M48 ^ M51; - uint16_t L13 = M50 ^ L0; - uint16_t L14 = M52 ^ M61; - uint16_t L15 = M55 ^ L1; - uint16_t L16 = M56 ^ L0; - uint16_t L17 = M57 ^ L1; - uint16_t L18 = M58 ^ L8; - uint16_t L19 = M63 ^ L4; - uint16_t L20 = L0 ^ L1; - uint16_t L21 = L1 ^ L7; - uint16_t L22 = L3 ^ L12; - uint16_t L23 = L18 ^ L2; - uint16_t L24 = L15 ^ L9; - uint16_t L25 = L6 ^ L10; - uint16_t L26 = L7 ^ L9; - uint16_t L27 = L8 ^ L10; - uint16_t L28 = L11 ^ L14; - uint16_t L29 = L11 ^ L17; - s->slice[7] = L6 ^ L24; - s->slice[6] = ~(L16 ^ L26); - s->slice[5] = ~(L19 ^ L28); - s->slice[4] = L6 ^ L21; - s->slice[3] = L20 ^ L22; - s->slice[2] = L25 ^ L29; - s->slice[1] = ~(L13 ^ L27); - s->slice[0] = ~(L6 ^ L23); - } -} - -#define BIT_RANGE(from,to) (((1 << ((to) - (from))) - 1) << (from)) - -#define BIT_RANGE_LEFT(x,from,to,shift) (((x) & BIT_RANGE((from), (to))) << (shift)) -#define BIT_RANGE_RIGHT(x,from,to,shift) (((x) & BIT_RANGE((from), (to))) >> (shift)) - -static void ShiftRows(AES_state* s) { - int i; - for (i = 0; i < 8; i++) { - uint16_t v = s->slice[i]; - s->slice[i] = - (v & BIT_RANGE(0, 4)) | - BIT_RANGE_LEFT(v, 4, 5, 3) | BIT_RANGE_RIGHT(v, 5, 8, 1) | - BIT_RANGE_LEFT(v, 8, 10, 2) | BIT_RANGE_RIGHT(v, 10, 12, 2) | - BIT_RANGE_LEFT(v, 12, 15, 1) | BIT_RANGE_RIGHT(v, 15, 16, 3); - } -} - -static void InvShiftRows(AES_state* s) { - int i; - for (i = 0; i < 8; i++) { - uint16_t v = s->slice[i]; - s->slice[i] = - (v & BIT_RANGE(0, 4)) | - BIT_RANGE_LEFT(v, 4, 7, 1) | BIT_RANGE_RIGHT(v, 7, 8, 3) | - BIT_RANGE_LEFT(v, 8, 10, 2) | BIT_RANGE_RIGHT(v, 10, 12, 2) | - BIT_RANGE_LEFT(v, 12, 13, 3) | BIT_RANGE_RIGHT(v, 13, 16, 1); - } -} - -#define ROT(x,b) (((x) >> ((b) * 4)) | ((x) << ((4-(b)) * 4))) - -static void MixColumns(AES_state* s, int inv) { - /* The MixColumns transform treats the bytes of the columns of the state as - * coefficients of a 3rd degree polynomial over GF(2^8) and multiplies them - * by the fixed polynomial a(x) = {03}x^3 + {01}x^2 + {01}x + {02}, modulo - * x^4 + {01}. - * - * In the inverse transform, we multiply by the inverse of a(x), - * a^-1(x) = {0b}x^3 + {0d}x^2 + {09}x + {0e}. This is equal to - * a(x) * ({04}x^2 + {05}), so we can reuse the forward transform's code - * (found in OpenSSL's bsaes-x86_64.pl, attributed to Jussi Kivilinna) - * - * In the bitsliced representation, a multiplication of every column by x - * mod x^4 + 1 is simply a right rotation. - */ - - /* Shared for both directions is a multiplication by a(x), which can be - * rewritten as (x^3 + x^2 + x) + {02}*(x^3 + {01}). - * - * First compute s into the s? variables, (x^3 + {01}) * s into the s?_01 - * variables and (x^3 + x^2 + x)*s into the s?_123 variables. - */ - uint16_t s0 = s->slice[0], s1 = s->slice[1], s2 = s->slice[2], s3 = s->slice[3]; - uint16_t s4 = s->slice[4], s5 = s->slice[5], s6 = s->slice[6], s7 = s->slice[7]; - uint16_t s0_01 = s0 ^ ROT(s0, 1), s0_123 = ROT(s0_01, 1) ^ ROT(s0, 3); - uint16_t s1_01 = s1 ^ ROT(s1, 1), s1_123 = ROT(s1_01, 1) ^ ROT(s1, 3); - uint16_t s2_01 = s2 ^ ROT(s2, 1), s2_123 = ROT(s2_01, 1) ^ ROT(s2, 3); - uint16_t s3_01 = s3 ^ ROT(s3, 1), s3_123 = ROT(s3_01, 1) ^ ROT(s3, 3); - uint16_t s4_01 = s4 ^ ROT(s4, 1), s4_123 = ROT(s4_01, 1) ^ ROT(s4, 3); - uint16_t s5_01 = s5 ^ ROT(s5, 1), s5_123 = ROT(s5_01, 1) ^ ROT(s5, 3); - uint16_t s6_01 = s6 ^ ROT(s6, 1), s6_123 = ROT(s6_01, 1) ^ ROT(s6, 3); - uint16_t s7_01 = s7 ^ ROT(s7, 1), s7_123 = ROT(s7_01, 1) ^ ROT(s7, 3); - /* Now compute s = s?_123 + {02} * s?_01. */ - s->slice[0] = s7_01 ^ s0_123; - s->slice[1] = s7_01 ^ s0_01 ^ s1_123; - s->slice[2] = s1_01 ^ s2_123; - s->slice[3] = s7_01 ^ s2_01 ^ s3_123; - s->slice[4] = s7_01 ^ s3_01 ^ s4_123; - s->slice[5] = s4_01 ^ s5_123; - s->slice[6] = s5_01 ^ s6_123; - s->slice[7] = s6_01 ^ s7_123; - if (inv) { - /* In the reverse direction, we further need to multiply by - * {04}x^2 + {05}, which can be written as {04} * (x^2 + {01}) + {01}. - * - * First compute (x^2 + {01}) * s into the t?_02 variables: */ - uint16_t t0_02 = s->slice[0] ^ ROT(s->slice[0], 2); - uint16_t t1_02 = s->slice[1] ^ ROT(s->slice[1], 2); - uint16_t t2_02 = s->slice[2] ^ ROT(s->slice[2], 2); - uint16_t t3_02 = s->slice[3] ^ ROT(s->slice[3], 2); - uint16_t t4_02 = s->slice[4] ^ ROT(s->slice[4], 2); - uint16_t t5_02 = s->slice[5] ^ ROT(s->slice[5], 2); - uint16_t t6_02 = s->slice[6] ^ ROT(s->slice[6], 2); - uint16_t t7_02 = s->slice[7] ^ ROT(s->slice[7], 2); - /* And then update s += {04} * t?_02 */ - s->slice[0] ^= t6_02; - s->slice[1] ^= t6_02 ^ t7_02; - s->slice[2] ^= t0_02 ^ t7_02; - s->slice[3] ^= t1_02 ^ t6_02; - s->slice[4] ^= t2_02 ^ t6_02 ^ t7_02; - s->slice[5] ^= t3_02 ^ t7_02; - s->slice[6] ^= t4_02; - s->slice[7] ^= t5_02; - } -} - -static void AddRoundKey(AES_state* s, const AES_state* round) { - int b; - for (b = 0; b < 8; b++) { - s->slice[b] ^= round->slice[b]; - } -} - -/** column_0(s) = column_c(a) */ -static void GetOneColumn(AES_state* s, const AES_state* a, int c) { - int b; - for (b = 0; b < 8; b++) { - s->slice[b] = (a->slice[b] >> c) & 0x1111; - } -} - -/** column_c1(r) |= (column_0(s) ^= column_c2(a)) */ -static void KeySetupColumnMix(AES_state* s, AES_state* r, const AES_state* a, int c1, int c2) { - int b; - for (b = 0; b < 8; b++) { - r->slice[b] |= ((s->slice[b] ^= ((a->slice[b] >> c2) & 0x1111)) & 0x1111) << c1; - } -} - -/** Rotate the rows in s one position upwards, and xor in r */ -static void KeySetupTransform(AES_state* s, const AES_state* r) { - int b; - for (b = 0; b < 8; b++) { - s->slice[b] = ((s->slice[b] >> 4) | (s->slice[b] << 12)) ^ r->slice[b]; - } -} - -/* Multiply the cells in s by x, as polynomials over GF(2) mod x^8 + x^4 + x^3 + x + 1 */ -static void MultX(AES_state* s) { - uint16_t top = s->slice[7]; - s->slice[7] = s->slice[6]; - s->slice[6] = s->slice[5]; - s->slice[5] = s->slice[4]; - s->slice[4] = s->slice[3] ^ top; - s->slice[3] = s->slice[2] ^ top; - s->slice[2] = s->slice[1]; - s->slice[1] = s->slice[0] ^ top; - s->slice[0] = top; -} - -/** Expand the cipher key into the key schedule. - * - * state must be a pointer to an array of size nrounds + 1. - * key must be a pointer to 4 * nkeywords bytes. - * - * AES128 uses nkeywords = 4, nrounds = 10 - * AES192 uses nkeywords = 6, nrounds = 12 - * AES256 uses nkeywords = 8, nrounds = 14 - */ -static void AES_setup(AES_state* rounds, const uint8_t* key, int nkeywords, int nrounds) -{ - int i; - - /* The one-byte round constant */ - AES_state rcon = {{1,0,0,0,0,0,0,0}}; - /* The number of the word being generated, modulo nkeywords */ - int pos = 0; - /* The column representing the word currently being processed */ - AES_state column; - - for (i = 0; i < nrounds + 1; i++) { - int b; - for (b = 0; b < 8; b++) { - rounds[i].slice[b] = 0; - } - } - - /* The first nkeywords round columns are just taken from the key directly. */ - for (i = 0; i < nkeywords; i++) { - int r; - for (r = 0; r < 4; r++) { - LoadByte(&rounds[i >> 2], *(key++), r, i & 3); - } - } - - GetOneColumn(&column, &rounds[(nkeywords - 1) >> 2], (nkeywords - 1) & 3); - - for (i = nkeywords; i < 4 * (nrounds + 1); i++) { - /* Transform column */ - if (pos == 0) { - SubBytes(&column, 0); - KeySetupTransform(&column, &rcon); - MultX(&rcon); - } else if (nkeywords > 6 && pos == 4) { - SubBytes(&column, 0); - } - if (++pos == nkeywords) pos = 0; - KeySetupColumnMix(&column, &rounds[i >> 2], &rounds[(i - nkeywords) >> 2], i & 3, (i - nkeywords) & 3); - } -} - -static void AES_encrypt(const AES_state* rounds, int nrounds, unsigned char* cipher16, const unsigned char* plain16) { - AES_state s = {{0}}; - int round; - - LoadBytes(&s, plain16); - AddRoundKey(&s, rounds++); - - for (round = 1; round < nrounds; round++) { - SubBytes(&s, 0); - ShiftRows(&s); - MixColumns(&s, 0); - AddRoundKey(&s, rounds++); - } - - SubBytes(&s, 0); - ShiftRows(&s); - AddRoundKey(&s, rounds); - - SaveBytes(cipher16, &s); -} - -static void AES_decrypt(const AES_state* rounds, int nrounds, unsigned char* plain16, const unsigned char* cipher16) { - /* Most AES decryption implementations use the alternate scheme - * (the Equivalent Inverse Cipher), which allows for more code reuse between - * the encryption and decryption code, but requires separate setup for both. - */ - AES_state s = {{0}}; - int round; - - rounds += nrounds; - - LoadBytes(&s, cipher16); - AddRoundKey(&s, rounds--); - - for (round = 1; round < nrounds; round++) { - InvShiftRows(&s); - SubBytes(&s, 1); - AddRoundKey(&s, rounds--); - MixColumns(&s, 1); - } - - InvShiftRows(&s); - SubBytes(&s, 1); - AddRoundKey(&s, rounds); - - SaveBytes(plain16, &s); -} - -void AES128_init(AES128_ctx* ctx, const unsigned char* key16) { - AES_setup(ctx->rk, key16, 4, 10); -} - -void AES128_encrypt(const AES128_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16) { - while (blocks--) { - AES_encrypt(ctx->rk, 10, cipher16, plain16); - cipher16 += 16; - plain16 += 16; - } -} - -void AES128_decrypt(const AES128_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16) { - while (blocks--) { - AES_decrypt(ctx->rk, 10, plain16, cipher16); - cipher16 += 16; - plain16 += 16; - } -} - -void AES192_init(AES192_ctx* ctx, const unsigned char* key24) { - AES_setup(ctx->rk, key24, 6, 12); -} - -void AES192_encrypt(const AES192_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16) { - while (blocks--) { - AES_encrypt(ctx->rk, 12, cipher16, plain16); - cipher16 += 16; - plain16 += 16; - } - -} - -void AES192_decrypt(const AES192_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16) { - while (blocks--) { - AES_decrypt(ctx->rk, 12, plain16, cipher16); - cipher16 += 16; - plain16 += 16; - } -} - -void AES256_init(AES256_ctx* ctx, const unsigned char* key32) { - AES_setup(ctx->rk, key32, 8, 14); -} - -void AES256_encrypt(const AES256_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16) { - while (blocks--) { - AES_encrypt(ctx->rk, 14, cipher16, plain16); - cipher16 += 16; - plain16 += 16; - } -} - -void AES256_decrypt(const AES256_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16) { - while (blocks--) { - AES_decrypt(ctx->rk, 14, plain16, cipher16); - cipher16 += 16; - plain16 += 16; - } -} diff --git a/external/libwally-core/src/ctaes/ctaes.h b/external/libwally-core/src/ctaes/ctaes.h deleted file mode 100644 index 2f0af0421..000000000 --- a/external/libwally-core/src/ctaes/ctaes.h +++ /dev/null @@ -1,41 +0,0 @@ - /********************************************************************* - * Copyright (c) 2016 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _CTAES_H_ -#define _CTAES_H_ 1 - -#include -#include - -typedef struct { - uint16_t slice[8]; -} AES_state; - -typedef struct { - AES_state rk[11]; -} AES128_ctx; - -typedef struct { - AES_state rk[13]; -} AES192_ctx; - -typedef struct { - AES_state rk[15]; -} AES256_ctx; - -void AES128_init(AES128_ctx* ctx, const unsigned char* key16); -void AES128_encrypt(const AES128_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16); -void AES128_decrypt(const AES128_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16); - -void AES192_init(AES192_ctx* ctx, const unsigned char* key24); -void AES192_encrypt(const AES192_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16); -void AES192_decrypt(const AES192_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16); - -void AES256_init(AES256_ctx* ctx, const unsigned char* key32); -void AES256_encrypt(const AES256_ctx* ctx, size_t blocks, unsigned char* cipher16, const unsigned char* plain16); -void AES256_decrypt(const AES256_ctx* ctx, size_t blocks, unsigned char* plain16, const unsigned char* cipher16); - -#endif diff --git a/external/libwally-core/src/ctaes/test.c b/external/libwally-core/src/ctaes/test.c deleted file mode 100644 index fce1696ac..000000000 --- a/external/libwally-core/src/ctaes/test.c +++ /dev/null @@ -1,110 +0,0 @@ - /********************************************************************* - * Copyright (c) 2016 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include "ctaes.h" - -#include -#include -#include - -typedef struct { - int keysize; - const char* key; - const char* plain; - const char* cipher; -} ctaes_test; - -static const ctaes_test ctaes_tests[] = { - /* AES test vectors from FIPS 197. */ - {128, "000102030405060708090a0b0c0d0e0f", "00112233445566778899aabbccddeeff", "69c4e0d86a7b0430d8cdb78070b4c55a"}, - {192, "000102030405060708090a0b0c0d0e0f1011121314151617", "00112233445566778899aabbccddeeff", "dda97ca4864cdfe06eaf70a0ec0d7191"}, - {256, "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", "00112233445566778899aabbccddeeff", "8ea2b7ca516745bfeafc49904b496089"}, - - /* AES-ECB test vectors from NIST sp800-38a. */ - {128, "2b7e151628aed2a6abf7158809cf4f3c", "6bc1bee22e409f96e93d7e117393172a", "3ad77bb40d7a3660a89ecaf32466ef97"}, - {128, "2b7e151628aed2a6abf7158809cf4f3c", "ae2d8a571e03ac9c9eb76fac45af8e51", "f5d3d58503b9699de785895a96fdbaaf"}, - {128, "2b7e151628aed2a6abf7158809cf4f3c", "30c81c46a35ce411e5fbc1191a0a52ef", "43b1cd7f598ece23881b00e3ed030688"}, - {128, "2b7e151628aed2a6abf7158809cf4f3c", "f69f2445df4f9b17ad2b417be66c3710", "7b0c785e27e8ad3f8223207104725dd4"}, - {192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "6bc1bee22e409f96e93d7e117393172a", "bd334f1d6e45f25ff712a214571fa5cc"}, - {192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "ae2d8a571e03ac9c9eb76fac45af8e51", "974104846d0ad3ad7734ecb3ecee4eef"}, - {192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "30c81c46a35ce411e5fbc1191a0a52ef", "ef7afd2270e2e60adce0ba2face6444e"}, - {192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f69f2445df4f9b17ad2b417be66c3710", "9a4b41ba738d6c72fb16691603c18e0e"}, - {256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "6bc1bee22e409f96e93d7e117393172a", "f3eed1bdb5d2a03c064b5a7e3db181f8"}, - {256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "ae2d8a571e03ac9c9eb76fac45af8e51", "591ccb10d410ed26dc5ba74a31362870"}, - {256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "30c81c46a35ce411e5fbc1191a0a52ef", "b6ed21b99ca6f4f9f153e7b1beafed1d"}, - {256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", "f69f2445df4f9b17ad2b417be66c3710", "23304b7a39f9f3ff067d8d8f9e24ecc7"} -}; - -static void from_hex(unsigned char* data, int len, const char* hex) { - int p; - for (p = 0; p < len; p++) { - int v = 0; - int n; - for (n = 0; n < 2; n++) { - assert((*hex >= '0' && *hex <= '9') || (*hex >= 'a' && *hex <= 'f')); - if (*hex >= '0' && *hex <= '9') { - v |= (*hex - '0') << (4 * (1 - n)); - } else { - v |= (*hex - 'a' + 10) << (4 * (1 - n)); - } - hex++; - } - *(data++) = v; - } - assert(*hex == 0); -} - -int main(void) { - int i; - int fail = 0; - for (i = 0; i < sizeof(ctaes_tests) / sizeof(ctaes_tests[0]); i++) { - unsigned char key[32], plain[16], cipher[16], ciphered[16], deciphered[16]; - const ctaes_test* test = &ctaes_tests[i]; - assert(test->keysize == 128 || test->keysize == 192 || test->keysize == 256); - from_hex(plain, 16, test->plain); - from_hex(cipher, 16, test->cipher); - switch (test->keysize) { - case 128: { - AES128_ctx ctx; - from_hex(key, 16, test->key); - AES128_init(&ctx, key); - AES128_encrypt(&ctx, 1, ciphered, plain); - AES128_decrypt(&ctx, 1, deciphered, cipher); - break; - } - case 192: { - AES192_ctx ctx; - from_hex(key, 24, test->key); - AES192_init(&ctx, key); - AES192_encrypt(&ctx, 1, ciphered, plain); - AES192_decrypt(&ctx, 1, deciphered, cipher); - break; - } - case 256: { - AES256_ctx ctx; - from_hex(key, 32, test->key); - AES256_init(&ctx, key); - AES256_encrypt(&ctx, 1, ciphered, plain); - AES256_decrypt(&ctx, 1, deciphered, cipher); - break; - } - } - if (memcmp(cipher, ciphered, 16)) { - fprintf(stderr, "E(key=\"%s\", plain=\"%s\") != \"%s\"\n", test->key, test->plain, test->cipher); - fail++; - } - if (memcmp(plain, deciphered, 16)) { - fprintf(stderr, "D(key=\"%s\", cipher=\"%s\") != \"%s\"\n", test->key, test->cipher, test->plain); - fail++; - } - } - if (fail == 0) { - fprintf(stderr, "All tests succesful\n"); - } else { - fprintf(stderr, "%i tests failed\n", fail); - } - return (fail != 0); -} diff --git a/external/libwally-core/src/ctest/test_clear.c b/external/libwally-core/src/ctest/test_clear.c deleted file mode 100644 index 941f6ede7..000000000 --- a/external/libwally-core/src/ctest/test_clear.c +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -/* Many compilers these days will elide calls to memset when they - * determine that the memory is not read afterwards. There are reports - * that tricks designed to work around this including making data volatile, - * calling through function pointers, dummy asm contraints etc are - * not always effective as optimisation continues to improve. - * - * Here we try to ensure that the clear/clear_n() functions work as advertised - * by: - * - Setting a custom thread stack, then - * - Calling a function that processes sensitive data, then - * - Searching the stack for any sensitive data when the function returns - * - * This test does not address data leaked through registers, ancillary heap - * allocations, side channels, or being swapped to disk. - */ -#ifndef PTHREAD_STACK_MIN -/* OSX Needs a minimum of 512K of stack per thread */ -#define PTHREAD_STACK_MIN 512u * 1024u -#endif - -/* Global alternate stack pointer */ -static unsigned char *gstack; -/* Global scratch buffer */ -static unsigned char *gbytes; - -static const char *BIP39_MNEMONIC = "legal winner thank year wave sausage worth " - "useful legal winner thank yellow"; -static const unsigned char BIP39_SECRET[16] = { - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f -}; - -/* Useful for developing these tests */ -static void dump_mem(const void *mem, size_t len) -{ - const unsigned char *p = (const unsigned char *)mem; - size_t i; - for (i = 0; i < len; ++i) { - if (!p[i]) - printf("."); - else - printf("%02x, ", p[i]); - } - printf("\n"); -} - -static unsigned char *checked_malloc(size_t len) -{ - void *ret = malloc(len); - if (!ret) - abort(); - wally_bzero(ret, len); - return ret; -} - -static bool in_stack(const char *caller, const void *search, size_t len) -{ - static size_t i; - - for (i = 0; i < PTHREAD_STACK_MIN - len - 1; ++i) - if (!memcmp(gstack + i, search, len)) { - if (caller) { - printf("Found %s secret at stack position %ld\n", caller, (long)i); - dump_mem(gstack + i, len); - dump_mem(search, len); - } - return true; /* Found */ - } - - return false; /* Not found */ -} - -/* Test that searching for data on the stack actually works */ -static bool test_search(void) -{ - unsigned char buf[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; - - /* Don't let the optimiser elide buf off the stack */ - buf[7] ^= (((size_t)gstack) & 0xff); - - return in_stack(NULL, buf, sizeof(buf)); -} - -static bool test_bip39(void) -{ - static size_t len; - /* Converting uses a temporary buffer on the stack */ - if (bip39_mnemonic_to_bytes(NULL, BIP39_MNEMONIC, gbytes, - BIP39_ENTROPY_LEN_128, &len)) - return false; - - if (in_stack("bip39_mnemonic_to_bytes", BIP39_SECRET, sizeof(BIP39_SECRET))) - return false; - - /* Internally converts to bytes */ - if (bip39_mnemonic_validate(NULL, BIP39_MNEMONIC)) - return false; - - if (in_stack("bip39_mnemonic_validate", BIP39_SECRET, sizeof(BIP39_SECRET))) - return false; - - return true; -} - -static void *run_tests(void *passed_stack) -{ - if (passed_stack != gstack) { - printf("stack mismatch!\n"); - return passed_stack; - } - -#define RUN(t) if (!t()) { printf(#t " clear() test failed!\n"); return gstack; } - - RUN(test_search); - RUN(test_bip39); - return NULL; -} - -static int error(const char *fn, int ret) -{ - printf("error: %s failed, returned %d\n", fn, ret); - return ret; -} - -int main(void) -{ - pthread_t id; - pthread_attr_t attr; - void *tests_ok = &gstack; /* Anything non-null */ - int ret; - - gstack = checked_malloc(PTHREAD_STACK_MIN); - gbytes = checked_malloc(64u * 1024u); - - ret = pthread_attr_init(&attr); - if (ret) - return error("pthread_attr_init", ret); - - ret = pthread_attr_setstack(&attr, gstack, PTHREAD_STACK_MIN); - if (ret) - return error("pthread_attr_setstack", ret); - - ret = pthread_create(&id, &attr, run_tests, gstack); - if (ret) - return error("pthread_create", ret); - - ret = pthread_join(id, &tests_ok); - if (ret) - return error("pthread_join", ret); - - free(gbytes); - free(gstack); - - return tests_ok == NULL ? 0 : 1; -} diff --git a/external/libwally-core/src/data/address_vectors.txt b/external/libwally-core/src/data/address_vectors.txt deleted file mode 100644 index 00929cfd1..000000000 --- a/external/libwally-core/src/data/address_vectors.txt +++ /dev/null @@ -1,1099 +0,0 @@ -18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725 -0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6 -600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408 -010966776006953D5567439E5E39F86A0D273BEE -00010966776006953D5567439E5E39F86A0D273BEE -445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094 -D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30 -D61967F6 -00010966776006953D5567439E5E39F86A0D273BEED61967F6 -16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM - -DD2DDC5AAE5F61E8850DB2772C07C71224932711E469B6705E298C26AB491F2A -047747ECECEB2C6692D6CEAAF4A11ED9DB900741730C201F95B8A4EEF20D7DEE2CDEC2802C6EDC880BEE41E9D114A8708260D01AB107B5177DECB4E109C5479223 -AFE3F5532852C4927B9CABBA1B9B37FE082D6D001C3A3108C8B20CF3D2580E99 -3A91CC0AF51BE125369A25FAC9CE5A950EF491AB -003A91CC0AF51BE125369A25FAC9CE5A950EF491AB -4953931680AAC7A5F6C722A59F68FDB1F2A9CA8EA9DD84033C168AEC2636C7A5 -06B2C8FB5F629CEEFA168A82A44171EE1A68A2CECDD99D9C6BE4F00FA447E5ED -06B2C8FB -003A91CC0AF51BE125369A25FAC9CE5A950EF491AB06B2C8FB -16LgrHNVKbrySfS97wegnWWA5P8fb62FQN - -A6622D5B3D1D12CAD7C17642CC9E7269CA1E2905DAB6EC95156922950CFCF37A -04050DE465C62476FFAAB8AA4E47B9E4A01079E8A287E7B1316F0CAB29DC58C734228F2DAE7F1799FB0290ECF2EF08207C087A4CE98F1051443A6A5ABE60963A93 -7B59C071F60A47EC0B635C4F9CB45ACBA54C28B5E9C5520E59EB6C681A3C38D1 -714076A39428B9B904F4007DCD1519EF97B87847 -00714076A39428B9B904F4007DCD1519EF97B87847 -FD6D6000DF7B1BA80F79501FA20B51897888207406A37EB9E74C7C29E5EEB2DE -75C992F59A30CBB2F4D74AEA4655B30A94C71B2331823AC2ED5BAF4EF26F0B8A -75C992F5 -00714076A39428B9B904F4007DCD1519EF97B8784775C992F5 -1BKpag8kykZNTxR2mw5qTEwUwmZX71c3JU - -C30FAAFED02895D3FFBA455CF139EF2C59A3DC2B8650894FD488AA639FD28E0E -04342433BE265FE2D6033E984D3E21E627EE6C87C0637F3DC63CECEB0C3F522C03BBC90203614826F6585996F0495E759A1DB6A630D035E1E9F69C8BBA3D4888FD -982914CC0BBBE2D90B4BB4A1DB11E15467828BADC2F9925C1EC663EEC46529DD -B9E57DF33679BCAABF4F7318082B703E4859AFCE -00B9E57DF33679BCAABF4F7318082B703E4859AFCE -3CB9797676E9BBF4B9C23BD7174DDD806AD79630DDE76F306B831C0C63BDC247 -DC276FCE800BCB7F947DDA5B7088193957DADB3BB306377A943B035CECBC55F5 -DC276FCE -00B9E57DF33679BCAABF4F7318082B703E4859AFCEDC276FCE -1HwvvsZjbAATRm5V1mw6i7g8sZ8gRqQQfX - -C2830290019DFBB615E3FE5A6904A97A3AF003B5F29EBA05C3FD5B6D6773223C -044EA2FDAAA36260258DACAFA153A0E0116051972A8F003693EA250FC3F21A0D5FD9E2E8CE17E6936A73607D2C2EA81D66A6EC0619235C2E60970CEA37BAE5A912 -145586BA66D896C2860884EF4EB83D940E16A70BF8C22639A271207481AFE01C -D3A0742714A3BE8A2005D5698464A3FF4BAA94F5 -00D3A0742714A3BE8A2005D5698464A3FF4BAA94F5 -998DD8CC50201B62F11E14124B9D6ED85365AA9FF48DBB00AE26593DC2B7B0EA -FD87AF189362F8E6E4A1DF63ECADC211113229868A083A25513A0DE5A2F01356 -FD87AF18 -00D3A0742714A3BE8A2005D5698464A3FF4BAA94F5FD87AF18 -1LHynznJ1kq4QcSUmCSgSo1HfUYP7UWcKZ - -B0D4F5FD3B686910E73D64A6C4D96DDA6E92E4A9273D98ABDEAB0C04FB5E8075 -049042E074B3C7057B4CC5B23097EE4DDF415988151313C9E5BF50C78F5577DDD10CD1604C9D5BA35700D07498B1BFB29B0F58021DC97D72DF87B8B5DFE02A982C -089D3597BEC7312283688D83856699E8638934A6CA6530AFC8780AC3B9C27677 -69325C54C6C8AB9D1E35DCEE0241E37A8820E5C7 -0069325C54C6C8AB9D1E35DCEE0241E37A8820E5C7 -4D2A23AA10BAB7BC9AB30929792E9FDD9C0CBD7C5B503B0D23A43C2CDFDF7E77 -09F1DBFB4964A36CFC14C32DC926DAF459C10D4DE4AFA062FFA66AC744BB637B -09F1DBFB -0069325C54C6C8AB9D1E35DCEE0241E37A8820E5C709F1DBFB -1AbEHGF2iFLR1MdpRzMmRfVzpMF32cWwGe - -3831C572AFF427471E6D3503684FD3E2763840BE5B269C53CCF94A0B8BA8A354 -0476A58D136E46E9A8B75584D612CBF697429DD0BFA313E860A5BBEAFC0C112EC6DB4AD45141AD2EE04C02F8B40C3682D864FC19CDC1B7995835F19C73121CDF52 -A75EBCC9552BFE6926C01C2C87A145395915B5F0A8EC57CC9792E50E1F0DB3D7 -EBC4E370B8B4908B8387A9442D7D9BA69C8B43B9 -00EBC4E370B8B4908B8387A9442D7D9BA69C8B43B9 -6F8DD9514133BE5747EE799CD16BCE9003158D258728FC9F8F3360FEC32924EF -2D14F43AF4823270D93ED63D6938575DC4DADB7F31886D1972FF0522296D718E -2D14F43A -00EBC4E370B8B4908B8387A9442D7D9BA69C8B43B92D14F43A -1NVdf8Twtk8CivHQDwR3PZGsHhiemCy7ay - -5821966B885EF66AE6669C43C6671E80C653A8F65DD4E727CC8F44FC2AED669E -04330D713A2C9F7970C27C67FF81404786C1522850E521434556224E60CA3BD34B12A71FE46413E8FB9383015DC35C57548C707B1C46B60922D6CC5B3F3B4E75AD -2C2F6C691FA5EDE7D52B6B783D71578869A4757093807EB9BC9B0A36059690B5 -B845CC57712326B953FF26A7F20763025DE3C16A -00B845CC57712326B953FF26A7F20763025DE3C16A -989B26625AB7D00518A35EABD2F4C7B6E135BB821E8A14673CE182A6FADF55C8 -BC114C14A858F02E6957EAC5FFF2AD49A35CA48F08F4450EE4C4C11DA527EF81 -BC114C14 -00B845CC57712326B953FF26A7F20763025DE3C16ABC114C14 -1HoLwxm944HpHWgEi2B2RYK6QN2icAaq9m - -EACC4FF9E9D3C34071FF468B6A4E7F48A4C3A7679293BAB0C47F05B6FFFFBDA2 -040F907C2097B6944F31E46A24AA477F5BF2BB4D1147B22B1ACFD43225FF313885853F3B6201D19AA2BF18EF407722B223C4CA604061215C50B00317B3BB2DC15E -7B9F6DAB6A064A1324F9B428E99AD6FB9D4FE3C28F05CAEF295CDCD12A58D9DC -E026053C1AE60FEABC4BCFC80D89900573197A10 -00E026053C1AE60FEABC4BCFC80D89900573197A10 -A3825F27E1B0ACDDABFDCF202210B6017965419F9D8FFE655CDF3E00763A6C7E -C26D4C1C70E22F731B00EA73950DCDC25BA32C99DDC6F5ED23F10BE5359C8696 -C26D4C1C -00E026053C1AE60FEABC4BCFC80D89900573197A10C26D4C1C -1MSBugGhNwy3imagYRHQV1hnAqcfjPTUou - -C7A567D84A95DF859B35850F59C890C58707A3D8177DDE6AC91A82B09F342111 -048C59CF9B3903A141A87CDD5B3B80E1E22CA1CF8D400BBEFF4F6B45D3453BCBDD1300521C35B261579A21FA459841929F4A5B394F071CCEDDF0F83BA9D1F46C1F -EEC092D36A74284DAB77B07B19FD6614254C2914D0D89E9B1DFB28CD120463D8 -B58EAE755587554B2C52D0155DFA670DA90E0A30 -00B58EAE755587554B2C52D0155DFA670DA90E0A30 -57394245BD050FA8AC783B52C7DB70F4E80B4E22B73AB72640AC52054195A73B -90485A28FC3CA78EE8327BDC2A321B651C4BA4BC0C4292AA7C61910762D83D83 -90485A28 -00B58EAE755587554B2C52D0155DFA670DA90E0A3090485A28 -1HYzEQSgoJT58XqjjpSVEwpahqhVdazRFd - -83FAF97D05738E88635DCD9E51D0DF2D1F5F58E0AB289BD8736D71E4BA65D825 -04CF590CAC5B77FE3864F9881C93FA91EDFEBDCDB1478FA8EEEB7C6C7C36954B252CEF8AC66E0E9076CBB05CE41EA5FFBC09D707822A23654FEB8CE36B665A2BB7 -90CC14675F9B23234C60916EFD4FDCDEA205F58206703D0DAC36B72DAB5F575B -3B3AC2F3ED6DCD58A249316B6DCE9BD655F43434 -003B3AC2F3ED6DCD58A249316B6DCE9BD655F43434 -31C5F62A2F88F2A605E5EF3E6C250834E3541875C5E9E8CB8BD2BD396F4DC75E -C307ED7D293A092AA417B72758BC9F29078593335AA23B91936A1438260D8210 -C307ED7D -003B3AC2F3ED6DCD58A249316B6DCE9BD655F43434C307ED7D -16QBG9BJ4XGKCt5zgKUDo6Hwimg1ZukQbN - -90D969DD9A3C0394FDAB333031D202A9D197B1C30B07B9180000F3572AB67B13 -04E880CEF245C32BB39531C9A057AC6E9BB6C664BBD1DFEA7F24EE8268530105A37BDCBA3DF4DA2408F060E990F9025720F8BD8F8D5765A5677B7748D07AD7E535 -4DA131D1B966FEE570AA90AF7FA7F530C800C8C20D09815041BDDAB03FD1FA65 -F9E7C2E6C0343120AA7FEB14D62650C87FFC06DB -00F9E7C2E6C0343120AA7FEB14D62650C87FFC06DB -E2B44B8BBC10501AF2AFAE8DD33C4ADF962451F14BF80AD0F99AA075E0030B2C -713327919CD1854F778682A232827613B1AD02A8A7A14CFECBA68D039AA42378 -71332791 -00F9E7C2E6C0343120AA7FEB14D62650C87FFC06DB71332791 -1PnNtpt5qLMoSEHHA5nq9T4N2hgRpqR4GY - -16BB2BCFB5EC32803ACC3D2BFD3F390692C14370C1DC04B6F8794E91C0A01CB3 -04E1D2B97DD8AE995899D097853E7182E8D6EC4FDD72BE25E2CF7E22E30A825F43C6DE289BBC485DCE2AEE55E72A7BBC0A905214937F1AC53A6CEDBBE53E9FA40D -A2D4DCDE5E088CE9BF2FCA8978A3383D087A0E5A12D18AFD04EF199A0CA62F00 -5F7CACB3D4A78BC61E34A9823F6B11EA31CC133F -005F7CACB3D4A78BC61E34A9823F6B11EA31CC133F -A61DB33194648A099E5C6B8E278184AAB16E708A9E60DF1E6CC8287D4D3CDDEC -6E94A1A95CBB18D849591E2A3397E6A02900F952E601CE6E7330F945E9493DEF -6E94A1A9 -005F7CACB3D4A78BC61E34A9823F6B11EA31CC133F6E94A1A9 -19htYmZW8dLtWtoX7ZsxLWSS7Ugh47aBiG - -9BAF8AAF06455A1B0A06EDF08E503A334B09E5C18C1DA2805D4EEDB3046AD67B -042DCA25FF994D8EA0F8C11E0C81F961D580A5CED7A7860989840EE645F2DC5A2BB401843094BE0E4CD785527A629C89E6D096448A27D8AD1513D55342B2FFF5A1 -7465E4395456EFF1C9A7094A3252E2B5AAD090F79C3ED773324224CD4D8D3C9A -2B2DD9C6DD0EAE871553DB582B8E6537F25F24C3 -002B2DD9C6DD0EAE871553DB582B8E6537F25F24C3 -1F98032002F01FEEAA4B02512F8B26F5CB6D83C89A3B35B56B663CFC3294E0E8 -2BDEEEE3CD7968586200F2D5D4D30F6F53238BFF37D816CEEEE3349A3950A9B5 -2BDEEEE3 -002B2DD9C6DD0EAE871553DB582B8E6537F25F24C32BDEEEE3 -14wJz1cUbJhPLxQRopfQG1KBuerudq1PHk - -06719D63F4AD67E51D707B19688D0B64A8CE63680A86EA8ABABBCE5C42E7AB90 -0470DB9F80EEB430FCB97E4D553E1202F48A563171C148C242D683BC4F371F9C034A886DEE0FB357E61FF550020BA2585CB5DEE4BA03ABC52271CFDF324106E837 -E81EB1121E53667580B6A791470C0EC1D92234CA77BC5B11FC9F84C9C47891B7 -29FA1AC9EDC3E161E5EF726E68A2D7B545A2CB22 -0029FA1AC9EDC3E161E5EF726E68A2D7B545A2CB22 -182507C37203AC70091F4BEDFF1A8A36B622CC43C22E0560B45100BBB3CFE682 -409D6C5E4A3709359D562B22B8F98CF87FC44CB011EB5CC9B6D2A3DEE7BB628A -409D6C5E -0029FA1AC9EDC3E161E5EF726E68A2D7B545A2CB22409D6C5E -14pxKSYJdKpSft4HjDFZFmfzYfSjFvy8aR - -89562C126D0587821B214501BB92A54188311340A9F54239ECA1A5A955194D20 -0435934BE63AE4C8F0FFA3323E0405E11A737660CD4DB307BEEEDD9D199494DA157CAE732787DD1C0844BFE94030A27E0A3DE632E2D06A7FB9A8BF217926D4FA73 -3042710744B09073915D8E8FE31886345D0A3DA8D1BD8DF22F4E0270A195EF9B -3AF7CFE671C5562CCF81AAD70670E390D8BA77AD -003AF7CFE671C5562CCF81AAD70670E390D8BA77AD -B9DFEF94A01F42128F30FC411CB7A8D2EC2920DE2E3F576A5E7465284EEB85B8 -89E43BAF35CBF8BC4A1856C7576C02354A54DC7B13AC9923DD9DE1F83C7BC027 -89E43BAF -003AF7CFE671C5562CCF81AAD70670E390D8BA77AD89E43BAF -16No4QymhRhPuDu5Gi14jaNWN7aPZtEoP4 - -AD1CC80C58CB1FFB0AC398A8D63DFEF8CB6D7A70194C877C46D4A16755043E32 -043E1BA1EFEEEA52025707FD9624B078578E3572469F9B80DA8FC17D69C0DACDBDD7CCF630C848A2B1678D2B2CE595D111BFD0F194063A77FE83142284CFBF6FA9 -5019D15583E6095C7A1346A569A59AF8986044D4C65378D6933A826BCC8B702D -5AB3ACE64A6B1165689191B8EEA3A77109CA654A -005AB3ACE64A6B1165689191B8EEA3A77109CA654A -4AADA9AAA013B2137A23594E508492FFED0E5F5E7E8FA76965E8679C59FD9E19 -7975132DBD5A5B80A4CE8C2648F4FCA65990D6DE1535EC4B5F09D2A092AE5867 -7975132D -005AB3ACE64A6B1165689191B8EEA3A77109CA654A7975132D -19Gb4L7rNtM8mc95A8fakX7aCbdVae7pCt - -AEB50A289FFF939D61C3ED64A28E02484A916C95EAC42AC86C329C896877581C -04AC4C838C438B81DEA64EE44454F3C45D3B9AF86568C73EB4DA39DCB5C8675DA88B815391D1E28B6B0C5690F716CD26AF2C0D60473D9A49D7FB62BEB69BBA0AA1 -062D2C481D5F039E96B98E16FB6C9A6E4DF60FAC8CA85C491DA7A9F70B912AB7 -195F24BE5D681C10F07A32D9CB3E46301400ABBF -00195F24BE5D681C10F07A32D9CB3E46301400ABBF -A7A7A2D5933EA99B6F473DC8559C2414BA608406B6FBC3314DDEFE04792EC0AF -8693255A7B1A05600D7CCECAE49D9269338BE17EA9E664F24675C3D04045A425 -8693255A -00195F24BE5D681C10F07A32D9CB3E46301400ABBF8693255A -13K9sV5WgQsuZsAagXEph2z7batg5xKv4y - -926866581E0A30DAF519953F1E07E6BA29443D9F452A1D7B5C4A0AB33909E40A -04FAB04D8AAF9754D67A51EDE7ACDD49159E63E2BAC2ACE1425697132F362C525675ADD32B29A9BD75139534698F85BC8F55F4F1514F50ACF7AE1491884D48C1F5 -02D81B7EE8B4A1E943E9EE9D9FC257C31ABF92143320A593A2F6DD487DF10F96 -308604F32F304A66D793F6E8B2D04D5801C88621 -00308604F32F304A66D793F6E8B2D04D5801C88621 -F674A85455918CDE2539418C77E0B2292345A8533F3774AE7C76E1F8815792F1 -00F653C5B3956CEC2079D2B32C5E47DD05E36922A6B217F8DAB4C11DFBA5D183 -00F653C5 -00308604F32F304A66D793F6E8B2D04D5801C8862100F653C5 -15RZz31EToZB93v1tvKrbGMk4VfpWs4gkL - -DBEB6DC8AFA3BF93D3CAECCA51914BB53E10142CBCD1C2C58C1DC498C56760EB -0484158534FBB748B80E31743D7C5025558EDAA6C0D3300809A42B102826004992C0B6774016C0FC17194CA359C8070D27373E8028991246DC7B8025838AD41AC2 -6FAE3F4868F0E9CE00725B59C1475EF0825CB30DE9D24FB9097B2F6A82A0D81F -86181EC307CF9BC2B9B46CB31F84A73438A51886 -0086181EC307CF9BC2B9B46CB31F84A73438A51886 -6088792B9B219918C7258C821512FE14E11A5EEB0B8CF1BADC820FC557EF00B9 -8FA455B0591E85A684D0B638976AEA4EC89AF7C1EFF8E988ECDF0740143ADE1F -8FA455B0 -0086181EC307CF9BC2B9B46CB31F84A73438A518868FA455B0 -1DE2Sc1YuHzQjYqdVmUnxWRj61uYctYfpB - -5B97B021169E53F512E15751EACE21E0ACE5CEDFCE4A29C7E47DD3D581FDCAB0 -0483DC80EF0106F8CD728185A8D9A1C428269029FE4AC3FEFAC2B60D70DBA2064B9430129D4B065E04D36ED0B5A22B2174F031B61D3A6ABDF81160C807B79EB7EC -F286B6767747317B6DE9438A920CA401C143B051CFE3453FB89F4D981BFBB363 -0A08201462985DF5255E4A6C9D493C932FAC98EF -000A08201462985DF5255E4A6C9D493C932FAC98EF -DC02FA64D7AE40D92FCBCC8CF9E933175133F00FE58A6362B6B181B67D1275B7 -791E2F220FDCF8B88C4C967EB8A6480CD64CC5A6A76D3AB246A7DEC985CEB8F5 -791E2F22 -000A08201462985DF5255E4A6C9D493C932FAC98EF791E2F22 -1v3VUYGogXD7S1E8kipahj7QXgC568dz1 - -1111C708358802A5A98222EDE3915F4A092F68A5B090A951458E6AA78F278CDE -0490792FDBA6DD56968A45BCA03F4C92ECFB962DF59FC10752C5D4C92FEDFF1FD4DABA5AADAE4B78535B68B48E5734D118D366A2263A77739DE70B2DF736D515F9 -8EBA4812564F0583CB9FC4AC16FF8BABC0880914CAA9706400D858344B82EC2B -1E4BC2766F178E2A489E1C6A4DF4B01385B97F25 -001E4BC2766F178E2A489E1C6A4DF4B01385B97F25 -F2D1DDC22C6AA6B491029EA0B851185F748207DBF790E44EE427926F7089130D -9C318AEB3BDB9571E3B77742F7A3ECF1F17FE1180EC601EDC084300138588ABC -9C318AEB -001E4BC2766F178E2A489E1C6A4DF4B01385B97F259C318AEB -13mC2dHQtUkChaVtR9sf6aZuWsDZJxVomC - -C284221838A2B161BE3C048D1742FFFBEA01ED1FA8BEC5C1951ACCE0597661AD -04355E713DFA0F3B675B2D6AD75C6C930248283421ADB0DE9E750FAB6A06D60DB5548C343CB08DBE6348C0831120A60C2838DD60381317851206E96E386260F366 -A4FDB620C890AD382C8B8B3DCBF4010F1C13D63320CD0D4BF91C74DF6BC7A6B1 -72DE1F2270445982A2F8E4A40A61C3988E98BD72 -0072DE1F2270445982A2F8E4A40A61C3988E98BD72 -6894297A79D2064CA06B5FD7782ECC3CBCD4F9D0B7EF6A64B754DBEB6E6DEDC6 -079D8F372E1B93A106ADE9349CBD31B9B223DC86A7F6A7253814E3BDDE8CDEA0 -079D8F37 -0072DE1F2270445982A2F8E4A40A61C3988E98BD72079D8F37 -1BUN89fNJ5re89HsoE45EsqTYP7NpnNiMt - -8AC500C249A395298041A188A3A104EDD0750879D030CC43798116218F12B53E -041D4037C7E8A5C7EA0C6DB565D7B84454EE9DC23907244438FDA018CCFB3006BC0B82BA705A8F7D034FA715948934A3FAB7548FCA63876462B015644617DEBB55 -26C2DB91AA454131624AB9A088C94FE83B1F99E69E1BC4BD50C1D7F50C244A27 -92ED8B99FA31F1D9B95811BC46591FF4A5E54653 -0092ED8B99FA31F1D9B95811BC46591FF4A5E54653 -F31B52EC8D2092B59B86CADC1134C16D07BDD7EA78775827D5B7D63FAF76B632 -20CF0D3E11553D9D4CC1BF430E52D8966CD4F0AAAD678600F9DDF932E402412E -20CF0D3E -0092ED8B99FA31F1D9B95811BC46591FF4A5E5465320CF0D3E -1EPtDwq1JzPVC5QmkJgzt52t84ox2iaNPw - -6465328BB0CD0653B905BA8988AA2C23C14D21E367C68769187315E8BA5F6C6C -048694C687123D27BA42448FF42D890C8B23746373E30D23F7A48DFD004F2059A0A16B86014C5D6C5905232B96490C483BCBF011A77B792E9CC040129D759E9FB4 -3D7D6B13CF75D0AC11402532E3BE540292EB27643613DA6A3CF30198D07B0DF5 -13E945F6293C717D0F8C2ACE6F0A787FFA2BD378 -0013E945F6293C717D0F8C2ACE6F0A787FFA2BD378 -9CABE317ADE611A9D42F0A5D185D0270DABDD0B9E29C9D4C55422C634BCB7566 -DE44886713A91C03579016025BE476C6E4195346F6B2FA67D2804E8EFE48F90D -DE448867 -0013E945F6293C717D0F8C2ACE6F0A787FFA2BD378DE448867 -12pHHkuKTvHhDWfVTjAXYJ5eevehwsig62 - -2BF3EEDC104B027B664470E647FFC9E6394B72C8BEADF3AFAFE10FFF12B7BC2A -0452112D31D211C7FEB4504A12D5F44088A3D59F088DAFA6D61F64676495FE3A7B33E1BDBCA22B080058803E27D3CB2BBFA95EB0E0987E30BF6B3F0977D5CCE071 -9C79FAE5C1EF2753B8C68B78F77088836E0848C215A5E03072C60E76E33C8D17 -066C0B8995C7464E89F6760900EA6978DF181573 -00066C0B8995C7464E89F6760900EA6978DF181573 -FE391A3E4394182807B351EE3A14D800047597EF71A16724255F8BB799F2CD1C -88421561354AE7A0EE5A74065F416A70FE5DFA4C7ACED9B144E497CF79235787 -88421561 -00066C0B8995C7464E89F6760900EA6978DF18157388421561 -1axVFjCkMWDFCHjQHf99AsszXTuzxLxxg - -242150B76E846B46000089BF2D55EE4D5DDE4684B792BE4867EB08035B924066 -044FBB845A1880A73BDD69D88ED8C16D00251CE0312A4572F2F7FFAB0CF6C0129D93EAB151DCDCCF63D378F1396756DD2D806DD286A588109C0A417E0CBDED3738 -B3C907E6F86847F30A4196183246491C8FCA235C0102B8C48D6F2696ED873E06 -806CD4DA88637EBC986E50F7055BC2D7D3B9D795 -00806CD4DA88637EBC986E50F7055BC2D7D3B9D795 -7849EB7588AF0E9EF49B76ED8733A898FEB6B8686F87F039B6764C93E0E248B6 -DE06342D4B956E4870C98DC63ED4C3BC2799ABC188D1C1F05026A9255140522E -DE06342D -00806CD4DA88637EBC986E50F7055BC2D7D3B9D795DE06342D -1Ci3sJCziZVp5upNMWM1YPK7w2g3hyTB6L - -9756185A95C2B8D29EC76386E12F4AB47F44013C674C604722B5F1463E940F07 -049587FA654942099FFFAE79709B773BC8A426C93309F577B9EB96C1F6084000819C8D91BE3D2CD9AFCD482FC6C214543E28F09AE48A628B32886E3E16EF442166 -4AF4ACF1AE0664F2CBC1497EAE486CD1A74A55C499776AAFA4AED03102DE55BE -A2AEE0CAA44720194D1AC0CBE8122AE2E60F2CA7 -00A2AEE0CAA44720194D1AC0CBE8122AE2E60F2CA7 -0C70FE1031A7CDC39F50B7C7AA9F1BA8210589D939337C957F404855E3B6D1A4 -5167D5CD636890FB3879C8DCCFB1DD1FD1EB43A5250D92CD78FF32AD1C879C8E -5167D5CD -00A2AEE0CAA44720194D1AC0CBE8122AE2E60F2CA75167D5CD -1FqBxpXQBzwLt653CP1iawqw8zSFmbBsW4 - -ABF24FCFDC022899AD398577C0CD2C39933814C9673B319037F25BEB6D9B17EF -04AD3A094017FE10EE39ADE8208F07CFAE77C71B5BC48A22E282B7BA947AABE7D0A2B9D65209144D272DCB30443DFA3C91392BD5BCDFB1B8E41CE4AE2785389CCD -8228C1F7CEC02F8473E33BEF060157A9FB510F7A23FB98F5F94F25F76E4334C3 -594525A547114F148B478A81799C929ED3B093F5 -00594525A547114F148B478A81799C929ED3B093F5 -76337B96505E0D21D9C3BA9D384D0C4DA85EE87FAD6B935012C831C6925EFF04 -CAE0B49405C768BDD089E50778CAEABF153C394204C67428407EA7A46D998EC6 -CAE0B494 -00594525A547114F148B478A81799C929ED3B093F5CAE0B494 -1991yVg8QC5YVZP8b9eXUEVyQK2w8Bnrjd - -F7AC4C010BF3C0BED1A7EFAF513D5C19EFEC6C07B7F88F8802D52C69076D8D9D -048AC681F21D53A04199A1EF4478BEC56900023B425AC8ADD19A80598CF8577E294363900720929155D2177B8E132F7FFE1634968608851D2F1E4C0F6FA38FE3EF -E0AB53EEB688FE6C3AEF40A0FD050ECDC1162D36CABD4D314CECCEAD136F3624 -577FF59B067A4CB8F8568A71C2854BB6A2F5401D -00577FF59B067A4CB8F8568A71C2854BB6A2F5401D -8573528698D12578162282A47DEE31D16681860CFD30E90571B00312B2336D3B -3DE90BBB40C6815D888D7724CDD4ECE047CC3E62BADE88D0098E14DC1709B6DE -3DE90BBB -00577FF59B067A4CB8F8568A71C2854BB6A2F5401D3DE90BBB -18yf5TuteMFxMQ8sL3gDL3heNw8E1BNFPY - -6BEBE972BD7A19FF7A95C43ADD179C5992681D7A66BFFBB1AD36E4838E48B3F2 -049CEDB2C5E871593EC4D729216A74E9CFB28A8E951D2E799AB69F66CDECBF1BA0C675FE79768D72486CE8838E18E9A7458594FB17DA6967788BE2EC0A5F7B8F4A -ECFF3B072AB64141FB7C9B67E6EF27086B739F49188E4455F9996D9F0E7D488F -A5ED461BA0DC730C86BED50CD2E349B75060D10D -00A5ED461BA0DC730C86BED50CD2E349B75060D10D -3DEF794AAD0803E3476D7E4D920F72565D177D1D36FBBAF49FD71A122E2B29E5 -4D35D9A02AE6EA362E67AF37494F0D7B6F9CAAA76CFBCF55E753F266798C3D19 -4D35D9A0 -00A5ED461BA0DC730C86BED50CD2E349B75060D10D4D35D9A0 -1G8LjjGaQi1af22v6w1LoshS8RU2i7BfcB - -0E8CFAFDCD5A1DABB3E625A437A534B834231336F12EDB92BF1B484EF595AF4C -046F6612C93E2F21B32ED6709E97126FD501D1E8A3FC0379B4E3FFA2209CDABADEB080CE712256600FBFC06A90187CE0DE5A3A754882CD3CB573D6A84BB7EEF915 -D9FA2BBB106955860086D929446A12ACA35DD3CA0B48AEB560FDD88B70138677 -6D3A1066DB55B3C60D9377EC06C8ADB289B17BED -006D3A1066DB55B3C60D9377EC06C8ADB289B17BED -FCE0C12F5CDCD9BF94CBFF545F091CB5FDD6665E2C3048C5B4920D002636DC6C -44221FAD278ADF33371D63C3B2C2BB6684CB32486180A927EE238D54D27A9324 -44221FAD -006D3A1066DB55B3C60D9377EC06C8ADB289B17BED44221FAD -1AxYDGmJREWVqiQ9ByFdfMMrx7Nmt5vyDn - -ADE384079A38DBDC2B95951E4115C45D12772ABCFD5F0026163AC28C5D74EC71 -041098A48B844708E3A48A3113DCE134250C4673948B6832004D7B08BAD646F8958E7B93DC5533B4885D8DAB736535FE5CFD04D08BE277807237A9FBAF262FD59A -22B150930FA1CB4EB42685D6E8576162C1AC486F2ECA7564270E254967A8DAB4 -5BC8F038248421B30E6E6623CA6B02D74240E844 -005BC8F038248421B30E6E6623CA6B02D74240E844 -3C8FE5440531101F570D3EF49B77F7BBE7FB5AB40D2586B19685A3F3164AA0E5 -45D91A32886033B5BD9AEA7B047F98C8A5B55483A1AB30699ABBE33C1D1FBA2B -45D91A32 -005BC8F038248421B30E6E6623CA6B02D74240E84445D91A32 -19NKCu73shKmkUvEn2FQiQbQm8vqX7gKXf - -7A2C3E5EF0A003EE4AB3108B74836F62964115FDA32238873C0742246421BE12 -0470324AC2E603D591AEE9EBB8EDF3326A3CB6395431E32B8C5E6FE82D9F8956A2E22A9E91BA451EB8DFA72DCBA871A609FE8888E84277351D063594233184DB4D -E543AB9DB6ACF059C225C8F4B0F1F31C4228C784D00D71C86A05D6A91739F7DC -626C03CA222E4C80C6AB17FE998AE7B1ECDC6146 -00626C03CA222E4C80C6AB17FE998AE7B1ECDC6146 -950FF7E6789A0A3E25E2F30EBE8225A6B706AE9A85D097D3614E81A009262444 -35AF1E2526861AD834D3C7D186C00DAFD85D126A7B604CEDAB7DD04E51E8C3E4 -35AF1E25 -00626C03CA222E4C80C6AB17FE998AE7B1ECDC614635AF1E25 -19yQcoNR5Qd5K9hqsttpNZGVWdDZ9qpjNc - -1FF82C5C659ACFE08A035D25E3C589E8DCB6176022F3955606CBC7AC1F6DA9C6 -0413F3EE748D3561C4380F4C65B73699B6E947298F50652E58232C7D5C1172F54513561F1B9436DA1C49BEE6F383C881DD9DA514349E5AA170B7CA1CAE1C98D12E -568E5EC5BCE45A5F43C1C96CA890B09FEBBA7173942F3BC7D9C5E3074DF84063 -169EBCCE898C48B5C00C18936176E6EC3272428C -00169EBCCE898C48B5C00C18936176E6EC3272428C -3836EBF51D90212AC9AC5770DFD97214EDBDCFD79A39C5A97C72AA7ACF7390B8 -5FEEFDA538E3B7D705C7C3D18C92408A5ED6AF679C43ACB559E8EBAC3AB9C03C -5FEEFDA5 -00169EBCCE898C48B5C00C18936176E6EC3272428C5FEEFDA5 -134c2VpoHLvP4keud1o19cDxa2o3j8HR7z - -65AF8A3CB8785916EA5269B2AA0DA92EF2E73A0F5C174466EF19AF9004FE4D5B -04DE5AF789AFD391DB652F591A2E0F31B4944DE22E5CB0DD40964058F5F68CD318B6545F1793E9F68A56D7D9C11EACEE838D18E1980D7F8678C2D28A7B3A8FA5E3 -D58A3E20A2F4C3FB8E5B43991E7E991C00DF976FFB2931FCC177F695853751AD -46D3CBA0FD26896F8F48F1BA3B9D60891B56CBE5 -0046D3CBA0FD26896F8F48F1BA3B9D60891B56CBE5 -71DD2E0FA118131991D6B2FAA81F99EBA207C6FBB127E37E02EFEB503F75B384 -82C4CE6DC3FC9A78135447E7B4111EBDFA7A263A956582F629288F16D4407937 -82C4CE6D -0046D3CBA0FD26896F8F48F1BA3B9D60891B56CBE582C4CE6D -17TW2EUKsGaFtCmH7qQ7tm9wkhwxNbJWS8 - -A68BB2049EB0064AE84B291069E20DFD4E83C7B8F9155AD2BC363CA46777A7FB -04558DBB675CA870EC03DEDD543D3EB250F077A61E086DC49C5AAB62E07DA2E7D63CEB2EC21A65D44E857AC7B5D6C57CB59E059E59616C96A31DB03B35CD075E58 -5DEF9C59E491C66E27E742C43284EC47941569CC71DC5E2B79A9FE915E7C5822 -A6CF233CAE76EFB882A61EA64C2603FD3DA09569 -00A6CF233CAE76EFB882A61EA64C2603FD3DA09569 -165CFDA4A559BC0A11EB27780822D297A8F0C78574FCDC45318F3367209C2B84 -A2E228857266F65BAC98D74DF58B40CDD07915022595B40D67B29D63A999D9D9 -A2E22885 -00A6CF233CAE76EFB882A61EA64C2603FD3DA09569A2E22885 -1GD1K29KMPJVVxgrQdk5LoojP3eS2ewuh6 - -36E0AF12CC3EB2B5C375DA8521C0647E14C1CD9945AAC661019FF5B8A94CE723 -04A87C25DC8ED8747FFD97C1FF8B910C3E56C94A5FE5A7F0B9ABC0159554AB2A4AF21172E1ACDE3B587B811EAFB645D13528AC6AADC7178017B801D32F5507BD7A -A75D8D0C54A3B06B7B2B9FA1CA563BEE07A60630C570EAC86AEDC337DAF01358 -18DAD6B70ED6A04EF95C495680A25C487C4730AE -0018DAD6B70ED6A04EF95C495680A25C487C4730AE -A389A5648CAEE7428F36A5DEEDD1542CF39588339475059C01F7642BC3C1E4F8 -60A72CCA01B67000B8D569E8D95660271D052ACCED8A54E671EE56EACF9C7C3D -60A72CCA -0018DAD6B70ED6A04EF95C495680A25C487C4730AE60A72CCA -13GRNnZSopMpRiPM5zF2zcLF3No1T3coLm - -BAC0C911AACFA3CD36466A9C3315194E647B932E295E33AE77785DDE5C151C34 -04CC675CDC49FF3F45F469FBA3058C92E3E55773E80DACA83855406B030B518DEF2FCD1E3E163B985B586B3C35C96832A3FB684A0FBE8E15268B8492A7D21AD3B0 -71DA5191A94A911B52937509BFB316FE67E5A070C7385E43438B18F5E90C84C2 -1D781AC1CE8810959A266DC9B8B7D4C827BC13B3 -001D781AC1CE8810959A266DC9B8B7D4C827BC13B3 -0FF9BD6F0F2C90838DCB11D4CF104D1636E184458877EB765E450BE3DA251C51 -3D64818A5485B13A5B8087AA6067AD9E571B6784C5B89B4CABDB13D62ACDD835 -3D64818A -001D781AC1CE8810959A266DC9B8B7D4C827BC13B33D64818A -13gpUa9EUGQ1yCqMaoMCkUT2n2RQHXjSkR - -A01560EE14666BDC12DB8109D9A589B82E9BC7816EF51484C103FFD64EAD130D -048D7C8F4CDC3C7D4706BBBAEC4A725B4961DAB28813B8FCFFA6E5A1A4B167388E7AF0ABD3F02FF0BDC359EF7A5CB0B454BCEAE6A86D3084D6B0A8B7E17DCE452B -B4580467ACC2D7ED9D6F7B3F827A581C6593BE252D3E27C5F298B9ACA22CA738 -9308239688F8207B2DE68A60E5E0E7AB0BDC4E2E -009308239688F8207B2DE68A60E5E0E7AB0BDC4E2E -C0F460D5E35ACEDA04EDA8B3E723473D1FDAA385ADCE49FC88461BA096670E6E -2310CD87182D4F4B6EF39844EAB362F663B05CFB53CD8F65CD7EE4F76425E819 -2310CD87 -009308239688F8207B2DE68A60E5E0E7AB0BDC4E2E2310CD87 -1EQS5i433M1qcLXjLfsc6QepF4m3F6UavS - -9F5EB644F335B606D600AF716FA94B8E07DFD9AF5AE5A74FC3EC1DE008828DF3 -046A020DA2F63D2C2FC3CCA22D671369B40AC2F4F96BE8A1D69FF2A3E67A21EA17E4EEB5887C42A6C3AABE3F073FC21AF8E6280DB22182916CF5A5A7C37423F673 -5FEF59F108D07B97F13DE2EDBE5863229B85C9C7C8BE36693DBB8C56FAC91EB1 -216638B2991F207396B3260850AFA09DDF735DA2 -00216638B2991F207396B3260850AFA09DDF735DA2 -35634DBCBF4125036E7A5D092E8FF2833E8185DF21C813022CE52F39BF1ED496 -D9D26B74068BF3EE05F091B68F172B4DA7C0A4E1BDF01F600CC0C8CF98468AB1 -D9D26B74 -00216638B2991F207396B3260850AFA09DDF735DA2D9D26B74 -143bkoaLqFZiYco2qq7DuQ6KdgzpktJoqd - -F51B4B065B0176B2FC7AF0C1F7096A675B602EC3977911CD1E2C69BE47CE3EF2 -04B543DDE6972AABD39E6B36738912848782122B7C4B5435DFE91C10EF49BF5B8944E5F1E2CB9AE5DDF09CAA55AC0A3C51BF99A4DF314D89DB98891143E36D2D5F -6BB29FA36DFDA4194D3DB2B3221BCAE6B3CD18E1B75A9B872025A78F335065F2 -5F0A37BFA06A585FB757BA8AC97D2E4F75F81642 -005F0A37BFA06A585FB757BA8AC97D2E4F75F81642 -4097AC1ACA82AA00205A71CD47804AF7B0DCAAAA6A9291EF6F810DB0357D05B7 -B8285738C25D5296D519C6DF7602A327BD9DDBA4ADA6F95B2C4FD4D1E82A2ECD -B8285738 -005F0A37BFA06A585FB757BA8AC97D2E4F75F81642B8285738 -19fXSAgFDFfBRKXkUfpq5KDLRAbAJHKiDD - -2F98881DA2DE77E9D76D020D90364FD28BC78421BD5D51723CBA8D0FFEC03634 -041B2D69E3E13D3A59441760CAE49F8C0D50F9128C7828022E7CDC8A45FAF83F9DC968A60F4BF2D7AC959EC918C5C02DAF079C0D5A247B674E974130055982B6A9 -989962330831865B4B7362703E0EB956E89E79517F850D906AB8CF8D8803F43B -E353C6B07DDA0F8B090528224975AEBC6731A388 -00E353C6B07DDA0F8B090528224975AEBC6731A388 -4621DAD0336FC3FA3114D027D99A0E7D16E77B2509D8BEEC314C7F5A502577D8 -137063C7DB272C3F1357A610C2B87D4E123D359426E658E9F2752B0AFAB73D8A -137063C7 -00E353C6B07DDA0F8B090528224975AEBC6731A388137063C7 -1MizkQxgEnxobrqvCapigaGTDgcHcojwFt - -4F5B93253E5E053A9D85D56DC3FDBF94048BBC0B9EF22368F9AD031B6845B09E -042141DF75D03D53B675C68E2139E7FE6FEFD84CD1498E4E64EBCE54CB4E6359AD402D42ADA511F59B54FFAD59CE3AC10655E72DD1935F59AD7964470207EC53B5 -C48ADAF449D558DCD81D8FE3E731FD876F52A385A08B1DD119E87A3064421F8A -C915743E0414524144290104B97C1A7D98622460 -00C915743E0414524144290104B97C1A7D98622460 -49865FD0140ACA247CE148F94C480EE8CC6060D9F8D68621C1627FAF9E8650D0 -4B8CCD6634D93E1DF0B45AA13192902AAA60066C2B035A7646922127E79F07C7 -4B8CCD66 -00C915743E0414524144290104B97C1A7D986224604B8CCD66 -1KLEXDMGKdGtofsgrxkKzKWZAhnbzLmFWm - -81ACBA661903137CB3A0A430AB20F58585CF49785CCF248AD26A0B53D922330F -046E6F6DB51183A85E4BB561144AC0BF6ACB793319C4F2F782F908A37D92E83CD07C0C4E627442457A938A8B2E8F56C7DBD3438A01A767AB593247F3863ADF7854 -D3F065F8AF342B2BC6BD0D024CCBE8FC3A935CF32A2280606B429F3934FD8880 -9DC1F34CE031CE342B4D9975300E584B068A78BE -009DC1F34CE031CE342B4D9975300E584B068A78BE -771E110AC6095C12BEA9EAAE10FB697B49A01948AAE0F2921F723CA8604FD9C6 -88B7DC79F01699EF943333B8FAE1AC04778204286242D7BD6779B650F473AFB8 -88B7DC79 -009DC1F34CE031CE342B4D9975300E584B068A78BE88B7DC79 -1FP9S2ZJrkH8aC8cvDCbAfdP3waRKhjwmS - -8598EE4AD9FCC94FE4FB130079444BC13C51CC5E5EAE4EF5E34F75CE2BF13F67 -04EC0E787151BCB542ACEF904973F25FB34D79CDE55D7A5B8ADAFEBC5744C3B20047D845EFE1CB2F7DFD8167E00D65F75523438FC49C5145DAF1FB269A66F112FD -A818E8FA3719E4AA40BD71952C6CF9403D6302E55AF2BFCE105B61ED323F1E08 -42DCFA01FF087324C3D8905DE2E9C861D6417B1E -0042DCFA01FF087324C3D8905DE2E9C861D6417B1E -8EB71BAEDCF70879398F934A9868FDF33B6D8269CD96FC2B3EF73DC7270F3983 -70F11248CEA5E63E84340E3EF4E269D83FA15D12AB04E227BF1E59B9D2E57F43 -70F11248 -0042DCFA01FF087324C3D8905DE2E9C861D6417B1E70F11248 -176YKPFcmkGY6yKyTVPTvDKq9QJZHm4v5u - -23E4B53ACAAF3D29677A6525379BC93B876C3D9B2FB7FD9015936DB530AE1E41 -041AA25740F911D3BC71D7C968020CE0B085C84AA3819D6E32F1C8E13D88A85C9F3FF532B2C50AA235531CC8C027CD567C8F68E1D3D48358A03948E2826B7F5660 -A9F176183A9666A85CEB950FB22F7BDEA1C1CD9DDC2B2F755A421EA212573096 -B768BE416DFD0A2C677662981D4BFBEE2FFDDBE0 -00B768BE416DFD0A2C677662981D4BFBEE2FFDDBE0 -2319578B1E62D5F8BA33D612B9CA99010723DE7236B3950F92949872E49A145A -33B2B51766B3644CD67A35C8F88639AF51FBB0F41C1810982D41335C070423CD -33B2B517 -00B768BE416DFD0A2C677662981D4BFBEE2FFDDBE033B2B517 -1Hin8nmZRVPvg8DLqUcmYyXRPC7KYZPBsC - -5F0743B5FE53A30919A9DDD6802C288AAC3B5630380A87A94779B5F399DF5530 -042FD276E57944191290DC05BB5659279FB0FC9114D1C52FEE7BBC2911D74A4292FC05CBCFD8E0DA204E4CD6CCA7CFF209F71073530E75F6C77D710C2ECE392629 -479BB9882946BDB2454B375020E6D2C15220C21A0E167C4568361C2B9DD8FF6C -FDEA19A53C34647A6D3717F8B7175F887339095A -00FDEA19A53C34647A6D3717F8B7175F887339095A -A469D48899A3B8C79DC869AA92E7DC496F769063B495C0E2C5D654D29185B695 -B388B1E0A7189E2FD5981CA00F8313EC65962E64B55BCBB87C925C6D69B8DDFA -B388B1E0 -00FDEA19A53C34647A6D3717F8B7175F887339095AB388B1E0 -1Q9aQ6ieKu6TXbY6qZBkC94FuzyHdPm8vb - -B58EBFFB5A9FACE28DF5C6F304521B6905EED179E2AA6A16557A7E195820006F -046B704FE5D21C0FB56649D041FEEF73B582F019055131DE416DE7F096C75477C8FDFEC1DB5F0E8CE006847DDF6D78D93C7AC9643528A4E6703BEF815DA6F462F6 -5B08DC48D2131D61A3682FC6425FA653C39F0024277321E1CD7289EB653D4431 -B557AF58BECDCA88E850F7FCE53F892A065C47BB -00B557AF58BECDCA88E850F7FCE53F892A065C47BB -06BC03C415418E557907C62331B1E0A653151565137DDA6DA4995FEBD1EABD8E -36F7ED93EC431E1C4A6EDA36A4C407AB146B648F574FC5FC818674795A5FE68D -36F7ED93 -00B557AF58BECDCA88E850F7FCE53F892A065C47BB36F7ED93 -1HXrMBLnFHTzzaNjzZvx4RxcWUtw4523mC - -E9449B8986AF55779213FFDAC793B07A3905D0C8DFC5FD6A231E2DC1FB080E69 -041F441CC1C5F7AD08C424FA632C75FA765347C9893FAD5CC1E0F1ACE8561D115C349CDE763B93E987426FA6EDF7EF4E7D04E083D5E713B733B2A5314DAFF385BD -1F01F748C903E65757C3A914D417B93465129522693BAC106C4A6A032D51BCC9 -4A6295042BD40907C37DF5B8D3954F8D4FF664E1 -004A6295042BD40907C37DF5B8D3954F8D4FF664E1 -2286D7720DDD76D8C42804373950E897A9BAB324CCC88C8B8660C5BF521BD0E7 -7260F13443A2C40763A9BFF4B2C49F6498FB2B6273B83E7EF03CED3ECDD9C974 -7260F134 -004A6295042BD40907C37DF5B8D3954F8D4FF664E17260F134 -17nK6oNULuoJ4JeNq6AUC8AAg3eNdu92QT - -652CAA15FA37AD0CC50B93236E0F4C0CAD4D4983E2E5DDE82EBC87E1C053B855 -04A06BD41389CBE4A72A1BCCFC499866C342CF40BBE83399BDBD30ED569B9783764138F4B7AEA52FBE017788F481ECA9E11B38FDAD130647EDAFA422DE0AD26FE3 -CF5FF14C33F2F6A78DC1D20C0C42408009FAD9FD2397A784A2B539855E550142 -EA14A277F1B153C1DCB6FE0398D0C50ECE82F4E7 -00EA14A277F1B153C1DCB6FE0398D0C50ECE82F4E7 -3CFDA7C903F1B92E74936E3E3F159ED7FD8088DB7F61A41F18FF48F3E8A64935 -7DF87D704FC8DFD4A77B965C4AFD457D43BC4D2B9D9905D59EE009D92DCBBCC5 -7DF87D70 -00EA14A277F1B153C1DCB6FE0398D0C50ECE82F4E77DF87D70 -1NLhqcHkbBSiWz46qB48LyV8uqN2ks96Mu - -672870FB60A2B77CED76D4F7FD2BB2218896B0D7CE69A8A5C300AEF1F421B15E -04A933A4171112B364D4A5D0415774A2175D4E3855C957CCC769D93C8C8CAD943D2C6CA53879C7B90ABBB9728A1B2EDEEE78A08C84AD7CE0274010D9E6C565092D -C28D2EF5658C6ACE4F20874B3A899BB9D4B7E397B1FF6C8EA7271C2AD25B9016 -D285891CFB0535BCD6C22F529C68C5CB6666B9CD -00D285891CFB0535BCD6C22F529C68C5CB6666B9CD -694DB9F10FD089BEC702580FD6158826E85967AA8C31ACC4EBC6B57E82A9EFF5 -E3668668EA68AD58DFC2A6EED327D53E6DEC53C13456609F8D16D6D7DE8BD021 -E3668668 -00D285891CFB0535BCD6C22F529C68C5CB6666B9CDE3668668 -1LC8sW2SKeAY4yEN5dSipi9s6xxcK2HYzK - -FA0DC08D046B323FB9738B48865164727A14DFC387981142FF6DAFDCC94E1B2D -0434638ACF2FC3F9B160891D64086CDBF861A66F19F866EA3761029E81A6E589C3E8A688323A31F5BC872BCE4DF93D005428A99720997D7D9DDDC68A9DF1F18229 -90B634A4B2997972D5FD857468AD577E89B366909BB307F55DD8D746698EEDBC -23A330ABCF3401FDA55FA55038CC8A83112ADFE3 -0023A330ABCF3401FDA55FA55038CC8A83112ADFE3 -EF7F3A6C3950CC053A42541208CCCA320453C8CB98DDF7E00AD2B8E85FC1A1F7 -D6DF2758D2FAD1DE294A02CB9D963ED639AD29A357E4AD4396ECC7BBA6B2C12A -D6DF2758 -0023A330ABCF3401FDA55FA55038CC8A83112ADFE3D6DF2758 -14FS9N2Rqfc3jDfZbuZ7FXBewEh8i3TGxw - -1B6FB28C3FC174B3B87395CD20ECCCCACD41D88FE945AC17695A2F8C70ADA2F3 -04BF99E8A3148DAC54449A8D549B16E5CBD60134A21446FF8F200E080808B64888EFC30DEA66FB6169468382920A6CD52565EB1696B1E58063C0382A3EA9E153C5 -990F98B98B9194CBFA07B4B0F78F8213A8554B44931F78699CDD9B21AC664B61 -4CEB9C62F7683B0C2F34174F5A72425CD0334618 -004CEB9C62F7683B0C2F34174F5A72425CD0334618 -D6055E2E3AB4C9147EDA3EAEB45E5332DE5AEDFC889909079F30ED03E86C54B2 -BB0901A8AB77E44578981D6E239D7EE901C0CA984815CF89CED3194F5561EFDF -BB0901A8 -004CEB9C62F7683B0C2F34174F5A72425CD0334618BB0901A8 -181ic7QQ87gaeHBguQVXTrV5PggL8DwhdH - -7AA2FD9D120A4E3CEC558F66BCD03EC29DDC87EB6444C42229AEBF4F3BB22D49 -04EE656C5EA538E56740063EA4B579343103C800254D21D26443323C680D9A9019B501A10A4A0E326801BA3297F38FFD2EE7CCC6C8B63BB6864000458BC4D47B13 -E0CE57DF4B01D0BAB2C6B1C84BA4508ED4EA4A0A2F3F0F81EED73EFFE745CA7B -DBDBC96E594A9971E6A9E11CAE63599970A2BE33 -00DBDBC96E594A9971E6A9E11CAE63599970A2BE33 -1132D8716444F3DBE1A2F47025BC9C398E122114EE8CAAC47B31A27BEE6E20D8 -87551C110621D0FCADE2076C8CC36C1F3BE985C1EFFB861C8D665A021FD94DB0 -87551C11 -00DBDBC96E594A9971E6A9E11CAE63599970A2BE3387551C11 -1M3WH4xWzR3wPqNiPNes2q1f8nsZabd7kU - -57F50A00591E5FF21179F89343ED1451B205DABD4EA2D2542AFD03EE80D49EF0 -04090ABAF695B0A406CF1F6F32F8789DBEF8253304EAB1304BD9D2FB0C6B963893B4DEA20E66CF28A08E58D8C1702466506310FAC7E16BA4D53A8123ED559F2C78 -D17AD68182BE63C2EB5B8DB547D58E874153E2CB1DE9C2AB6A3AB5418251925A -73F4F8FDC294A60B8221D975C6FFED352D6EF39B -0073F4F8FDC294A60B8221D975C6FFED352D6EF39B -8BB828EABEFD564FFAEBEE892F5445CB904842D6F37A1D700591D34305DA2705 -4D18681BA03DEA186BC4263285B426972E8F760B10D4DC1A81514A7F9EC3CFEF -4D18681B -0073F4F8FDC294A60B8221D975C6FFED352D6EF39B4D18681B -1Ba8B4HfYBzt9KiMqMYU9TR9Lq45yzFxzv - -35B75169CA01A915FFF6D9AF45C56A575FE9E2D84A2E2B9BEB36575D0292E53A -04C6157A4EA3DE75ABC57EF7DCC46B7F695395BD01F45EFCAB35677E60E62A718C69A2D703F648E4D15F4D2CB77B030BE12E46470970049FFBF307A671407357FB -DBB49C602CA09A429951BA82A8A1914F8AD74BB7648EB5D54FFE5E863C56CE21 -F3A2EB49A0126D627BBA601DF40CCCB64622A64F -00F3A2EB49A0126D627BBA601DF40CCCB64622A64F -1F0D4023AD5DD7F6AF8523DCB12E34167FD495F97A9E62BB7C9C7CDE134DCC33 -08697F1693E499CE2BA7963B490C9245203BBF990A0721955B95DD842B4AE730 -08697F16 -00F3A2EB49A0126D627BBA601DF40CCCB64622A64F08697F16 -1PDENS3TqMob3C74JTE38hzrTdBFgTxgxD - -780446A90B7ACA895C54CF6018D6D83ADEC17042E53797C8BE2A64AA7BC02D34 -046545AEC4918E6AF9272398F8033ED2EC58121951854EB35373766C47622709E5E035D54BB9B1D7C8C5E7EEF82950F9E1A83EC6E984C3932AE5A98CBD38DC0F0E -D93017ABFD3CD58CDE1CF712F8DD04DA3B516F053CBA9888BB81C638B0088A99 -99A07C6E98015C1A697BC77F66FD39918E73785E -0099A07C6E98015C1A697BC77F66FD39918E73785E -46C431ED3048E027D8F1CFF1C4396AF15361306DAA4B03D563762705D7F42542 -E5F8517911ABDE14E14BFF177677FE2B49EDBF9FEA9C4FCA38D4E8CF2EF27E83 -E5F85179 -0099A07C6E98015C1A697BC77F66FD39918E73785EE5F85179 -1F1Je7o9EQwWgwT9tj7TgRWQjMosrVH3uA - -E996E15D55EEBB6206636C7E79CB9270EFC0332A54AF0B7D5F8A0E72B90309A4 -0460D080CB603C64CABBAB230656140B0AC5D3D57D0CA674FAE772EC31496A32E476D7A2FCE009649485057FC5FD9085DB290FD9AF71380DFD993290FA88AECF23 -1D9713CA39AD9BB0BCF64F0862B8100B03CCA393976C417F6B04D349206EC4C9 -296E9647426DD41793F7493002E10A8FAEDE8D53 -00296E9647426DD41793F7493002E10A8FAEDE8D53 -3E547705EB19F9C9FC72CA2857AD83A985723300CEDEFC589E1FF5363FDA42FD -12FBBDFD2B0AECC2FA3313EEC7137E11D8C58AD392A81B8410CED92ACC1617E9 -12FBBDFD -00296E9647426DD41793F7493002E10A8FAEDE8D5312FBBDFD -14n5Bb16wGDbQUxwt3BLfhESWhhBkhNLmr - -18356C5E233A4E235566E266E9CE751C53CECB94792819E6FD991B8932F12CA7 -048EAAF44D2D6F3A43A4A7F1A14993468C34C5C14F2B1EB72B3235C2C7D40706A2ADAC2D7807455CF6DE6D4DE3846DA0CAFB24F3BEAF60C239515238E4664541DC -5362964B85CEDA1A020973C4661A165EC2FD1695430861B22810850833E324BA -D355A8D25F4A11B1CDC84C10CA3B1A72CEC0B334 -00D355A8D25F4A11B1CDC84C10CA3B1A72CEC0B334 -518E6A1B37262EB95901004006CF6CD0B4D39CBD3C7FC9613BBAB7E44A2846E3 -6DFF3EE9A89BC29E7E16121451F9F1552A58C10A3BC08AF16D5B0C04C5A3E3F1 -6DFF3EE9 -00D355A8D25F4A11B1CDC84C10CA3B1A72CEC0B3346DFF3EE9 -1LGSCCbGYHWigLoPvCKABMNhHaBWXWuWXS - -E02959579A5FFBD5FB66C2A4F56C822D42521B2739E5343F98C48A25028D5F96 -04892B6FCD23D26A7023D2EFC8DDBAA131D5B884F9936D6FDE38B5254C13D27A8B6AC8BAF959CFD3D78FDD62078F3F496CF7CDAC173FB407C8B1B8DA766AF7F3DF -079251A04EE8B4F9E837966A31A87321ECEDA4B6993238F32F22A90A96679D5C -9C62F60CFEAE9D3191683284580FA8C428E0AAC5 -009C62F60CFEAE9D3191683284580FA8C428E0AAC5 -D3ED6B3A5644A38D4CEDB4F50DD5CC4C5DCAAFAD477195BD072FDBDE98659637 -CA6DCFD0ACB22DBC390EA9D69960A3AF8B6C92616D178FD2A25113D81F58A5CF -CA6DCFD0 -009C62F60CFEAE9D3191683284580FA8C428E0AAC5CA6DCFD0 -1FFtxsDZbGYy81z5fTtjRp5CwpqisSSLhV - -18DEBE12E39A02917BCBFF9B26255421F53539F44C35DB06E861F713D6C5C717 -047873AFFC308A62691F6BEB6527277091B0E8A603DA0C6C665FF671AF77A1E84B7757BD6DBA2D6BAB37E0864EAC1E5012393BB362741448CE52970598070F9D6B -6C84107BCB9F9DC3D1698F6C598C5BCB8F5AB82B5F5ABE081D69A8399DD1FDB9 -DC6B63B26C091D95DD425BC4364B4675D90A57CC -00DC6B63B26C091D95DD425BC4364B4675D90A57CC -0623C77C910BE0979C59E49AF0D71A41EBAD5EB889AF54BC1C54923F581EBD11 -BEE21DFC0CF4FE03E13B9DD7462AE0A622B4DD72CEA25025CF7D0DB1BDA039E6 -BEE21DFC -00DC6B63B26C091D95DD425BC4364B4675D90A57CCBEE21DFC -1M6UJkcKtMSS2fkQStuJMK8G4FTbksNXm5 - -CF153190A27B52C190A4D31A264604EF95F41CA71E4427C38CB6C0366CB803A8 -0469038CC77322DA4C1636096090EA76B6ED2ACE7663764A81D260782323CD1370281534A9FA0DC47E565C2673E8FFF6DE70EEA8FEC272E7A95BD903CE9CD35216 -C4A6B443DCA748E85DE7CD337BFFDF2670AB32EA6C78AD84977197B47AA918B4 -481BB6F9970DF701A740B0FCB21167B69FAE5096 -00481BB6F9970DF701A740B0FCB21167B69FAE5096 -8C21445F1515278B7A75166C3B53D72DD735990E6FC4CCF27B2DDFCA98BC9A3C -C51E0FCCD09647691F8D57785A1D60772EE95F5032859C20288C6DE22D9B2B91 -C51E0FCC -00481BB6F9970DF701A740B0FCB21167B69FAE5096C51E0FCC -17aGrU2xAi1ZXxjGwCtSYMrj55RdY2VwiT - -1895A02D8B2E201E844CE5709FC76BFC1D27C2F3212C8D3A55057E99A057B974 -045E923DFA5B84382E55B385E6D05E3A6E4685C0D075124B1ABD2F0C36A03C4C602EB75A7C65B12EADAFEF5214622EC2D59C22C9835367C728B01E02B5CC0E3331 -DD6E3D70694D7BE3292E9C9ECD42EE343E662FE3B49F76C2CEB68699F0BF5DD9 -59265249A1E3EA920E4E06121CE7D8DD645B5AC6 -0059265249A1E3EA920E4E06121CE7D8DD645B5AC6 -8C2BB4BB6F077EB77F89D5C369C7422B941E4747379DC6A8F4B0E094BEA32321 -E686EF6E218600B16DCA8F90DA4D1D3DCF5ABFA0EBA46949B0B3C22F4092AE83 -E686EF6E -0059265249A1E3EA920E4E06121CE7D8DD645B5AC6E686EF6E -198P3hC8GaTYvxjLVKmkP4GeKKGVCtNH6u - -66B61E98763C07927E5B4703E9B0B392B371373B80D0F078649408F781DA6E53 -04237E1D82D8417875CA0B8A2B74201EEE65F3E0061E0359CE662AC8E653B89701471420F7C25DDF11A0AAEC177074418B445443AF05996788627CD162C1A8F069 -21405E07BEE739DE55B5B8C41F9391923F0F68D2FE68B87FEA97286874C0B8CB -EB96CE905D65F30522CD0AE781174DDEFBD814D4 -00EB96CE905D65F30522CD0AE781174DDEFBD814D4 -4672681F0FB98A32AE0FB86E9BA8B6E4B8278E17679FF81B559328A1485C555C -E8B60DF434AD4F15E3CA088B5A19A37D61F62A618F37A848593E53C137E4973B -E8B60DF4 -00EB96CE905D65F30522CD0AE781174DDEFBD814D4E8B60DF4 -1NUgTKwddyHSjCWAwdv9p6tien5LdBPohV - -3D2F49F56F6170F7B38EDA2A2A247948D45D3493F4C40298ADBBC7298F15232D -041A63BD9DF187BFFEBF155B0006AB74B75DCC160FB34CA65ABCB696E783446F0346C873320ED68069E8B2469CCD8D5CB7DD286F8A6316EC6348373A2B4BD06EB5 -8E75CE388C43A0EFF40B387D9ECDB65EBEC9111290A94D272BFB59709FEA50D0 -311693C6C8F52765561CA55F9A02F79C020C93BE -00311693C6C8F52765561CA55F9A02F79C020C93BE -28BCA93FB4D502EF3E5C095C7EA76E7512A8E3881A97E87E00CD816E0365D66B -AC42AB1A422043FFDEEB9250C22CCA4CD8E65270385BF7A444F7EC99ABD0A0D7 -AC42AB1A -00311693C6C8F52765561CA55F9A02F79C020C93BEAC42AB1A -15UZA6VRzFAL9zzWq3XDn4ffaEW1ZnnbJZ - -93B2E15CC3251658AC17AC6AAB9E7CA50CBCE098DD738825135FE88636CF56DB -04A19DBDE046C84A2A5AF1D4518EFD199517C19A11737DDCFAE3DD352FABE4561581A797E26557F0038CE96E196DEBF51CD60EAB6FEC38203ABD49D27C42390F0A -85533FB650A2DC95C7FC353AD963D4955D3C7C510C100540CFB62B45D5F27A7A -4CBD61A95BE05E28CEB6825334AF3A14B2DAF469 -004CBD61A95BE05E28CEB6825334AF3A14B2DAF469 -1C6EE5EA4AABBD0613DE6A57B947D4A06711C07FF988909AE85B90F19972304A -F386FEE5134AF323590B80CC5C367042E35E23559E82EF51D366898C82229485 -F386FEE5 -004CBD61A95BE05E28CEB6825334AF3A14B2DAF469F386FEE5 -17zmE35GixgEnee1W7cL4hYBiHfDC6FgzY - -580E4B5DD74906CCA992B0461E28F848C9107B409E6C3E9FA5DA36F1C3CDBECB -042705B60FEE796FF6A542337D22185CE58F3D016BA74D787746569005814EA8332EC889726A1B1FEFE9DC09AE59F9C19CFFE296D979DB748C4720AAC8791AE041 -CCF554DF2096CC254CB9B9D0AC66F76565EB49287FE4FF7C038EC2B4A25E80A8 -5D5055A3F9651A5CBF3BBA87FE78BE8041333AF5 -005D5055A3F9651A5CBF3BBA87FE78BE8041333AF5 -8E15AECF07E7C79CCA08277E547D6E762910FC8513E7C00464AD559E78E3A537 -10659B63970109E197A2CB3C2B0D055CA7A8B67F8B820D5F47EE978EDE7BCC5F -10659B63 -005D5055A3F9651A5CBF3BBA87FE78BE8041333AF510659B63 -19WQ5aj2FMvWPfZ1Np9HqVw5LFie8BXD6a - -5B80158B1E1DB4CF197E8370AA8351F79DD077FDD9C29237AAD9BDD02E71FCAC -040B7D1FA9A2574B19CDDD584229EF853496DAD3B48D080EBD1EF07F9FDE0FDCC83DCE4879C844EF825FF7537DBAF2C8A0275B3E77F602FE43C8CB3DBD83032E12 -A660EFFFC5BEB7A88597FB94F680FE52CC42E49CBCD34E970AADB09138914BB4 -86BA80A266D2F66E44A69EFEA5F513DCE84D2F7F -0086BA80A266D2F66E44A69EFEA5F513DCE84D2F7F -0501E54946EC66C4EF168CCBA3CF54A90342F8AC5DA3A076C393CCD33624DECA -09A3BDC57F639571CB617F5A86A129F1EAECB79A8A8DB45DFB84B3F907786BB5 -09A3BDC5 -0086BA80A266D2F66E44A69EFEA5F513DCE84D2F7F09A3BDC5 -1DHNy8EFMdTYmY4swL4ET6HsdX5S7pbQnQ - -36DF5099AF5232D7F6A5500D79C5397065CDBCE136D5BC39E09AF342CF6693BD -04FCED09F681FAC9AF7078904E9407164EA33BE843D7AC444D77B21E49B8A7D67325EC3DA263E37E5511FB74472ED2EE5DE74FFC06A117D53BA8CED575F0A37AD5 -12ED8CD460BABD1C1BDB8F919A59AD8B6AFA4EFF9D552D78C839DBDFB8C72FBC -42388BE358449C334DC2743B919ACE957068C44A -0042388BE358449C334DC2743B919ACE957068C44A -A434ECEDA6C6CD333664912E7B33F4C0A27CB197AE922A81D461EE753F3D0839 -0EBF7FCF226ABF723CE1CE8857C53338A164C3F36F7BD48DC6942AD33CD52E05 -0EBF7FCF -0042388BE358449C334DC2743B919ACE957068C44A0EBF7FCF -1739LaRGvqKCSWmmiWXjjuTKSbjRePHbv6 - -9328A705166A24E37437AD1B1D9D2F8D2C834BE9A7F35EF6E43E8541404D0289 -04FC644CCEA071BE7C090F9A1944D663AB8E2DEAB4AA6F19A09CA53048320CE71313B51CAF49D2EF7C53DBE96D1815D215418EC02B7C87AE857AEF455F69B2F8C5 -C0DA2A8BA2E81CD82B98686943D995ACAF52664FC8764507D537735956EA848C -8138F4B6D62066DE9637817D36B80C6F8D29572A -008138F4B6D62066DE9637817D36B80C6F8D29572A -B279CC734C9D232D8A48749ABCD8E9FA11044E092C56255A35510CB39326461D -723B753AF130F9AE6500B9842896BD120522684BCB9762E03011809F1142E5CF -723B753A -008138F4B6D62066DE9637817D36B80C6F8D29572A723B753A -1CnGQ7XLUtaSZ8YqMC3Go2NiMvJtatPDmK - -C542E1CB92750A4649AF13E94170FDB077CDDDC5A370DD0ADB2B7C8D8AC80CCA -049A4D5A72DEACB0C149DAB7A925F36935083E78C82E1C42960A88F89724898C193A7D4A6678756C74439353D00B16C235CC68CBDB22432DD11AC012905FDE1B7E -CD382E9959707515281815EC6F722DD43D01CF00A1166E688942C9629C3EE84F -BD21AD78AB0730F8290AE15187B42BE6D0B2BCF7 -00BD21AD78AB0730F8290AE15187B42BE6D0B2BCF7 -220382CCB1487770E98127AF5AAB5475282196FA637A2690111BC787D2B82360 -FA8D072CBD52AF17F2B8BC1D59DEC0E74ACE2C3600386C8D7B89C76BE30CEB1D -FA8D072C -00BD21AD78AB0730F8290AE15187B42BE6D0B2BCF7FA8D072C -1JF34Dey5zTQRQo3hckJnwEJKRNMs1z1j1 - -84CB4454EF19AFF3B3660A79DDF4D7CC4BD4D15E24E5C35F872E7C2EB4E1AA48 -04EAE953797AF5A81C4C17445778BA84DA2822F32BDDC433F9186B7168A18735D788581C07CF12775805F907B50C22C535B4FCA12AAA974DEDCF69F194CD6A41A0 -7FB3AB30497664EB372E13D815A332DD57AE8BCEDFA2FF5A90F64E7B8060497B -30F80BC8BBC465EB78F012AE98B5952CDCC8F5AA -0030F80BC8BBC465EB78F012AE98B5952CDCC8F5AA -5302D1AD7819E08FEBACFC879458049F2C7669D96329E39E535EF76EE0524F30 -799EB50EC552CB8FDE0CA9CFA51EE4C2A4AC9142F94F16B633946D313FB86D1D -799EB50E -0030F80BC8BBC465EB78F012AE98B5952CDCC8F5AA799EB50E -15TvakQEGf6pnvUYr5oWWCuXBYLVEPrF7K - -A66428E3D79761F099EC7D983A95EFC488E1D5BC69CB543B2CCCC3315EF75A7D -04FDCD2928BD178A37836A62362E7DD6EC5D205C5592007111991A40A1017C052161215FC087CECDC0CAD75FA9F64975D2AB584D6856B55468352FE27FB086F1C4 -6DD68774E2DDB5DE5F12EF171750133ACF6BFF20DB393CA665ECE28E38470DD1 -FDDE6A534D657DF2F9770D0E6E562D6A4754802A -00FDDE6A534D657DF2F9770D0E6E562D6A4754802A -7A8B5B4A420DA40E1513A9EEF06071E6571C940110DF9B1AC0A753EE7E074D91 -BC010026BF4529A9FC6578BFCF9103F6C7449DCB6617DF133F84AE4834E18724 -BC010026 -00FDDE6A534D657DF2F9770D0E6E562D6A4754802ABC010026 -1Q9LQDqmvmPGGxWofMFqVyKACzsrDK21zu - -A2C0830F27672C29148DBD1892245D2D0EAEC6F17835AEE89782A53E2AD0D733 -0441AB138BB7E326CFA8FD049E8DB7A4A7EBB04BEDD2F4BBAF05F3979DC31143BF41D9F16ABB9305DECB57527E2DF58209CF428B2B058E4C4767DEAF59EE328E6F -C5E30E5EE06AE193680ED2EFD19ABE6DAF7598B21B6DFD635A59A152CBD87088 -9C2E4CC5445D078A73D2DCD96C887A0AFFC818C3 -009C2E4CC5445D078A73D2DCD96C887A0AFFC818C3 -7C29500426DCFC348A916BB83B72EC5E5F00325F94F4CE3F84391EC22CD38BDD -7E3DD988D770163BBF62AA7F4764EFBBD1EE29161612AE3CFC62778EBD0B80D5 -7E3DD988 -009C2E4CC5445D078A73D2DCD96C887A0AFFC818C37E3DD988 -1FEosu5j5xnVhT2Z5UhhSDkFg4Eo73cfSo - -19471B9A61A05EFE75D0AE48AE7544CA8E3F2104D47CEA87CBCDBC997F43A0B8 -047B244FE6FEF9BDAACAEC417EF649ACD6D21EE164DC9B2980323E35DBDB7A0CC674CA7904C6491447213363535C899350F5EC8FAE34D2967C96B02A0557E942ED -D015EFDB512544609873768757BEA7DFA522943E91D23DB2A4681D30532B9740 -E6630D42BE63EB7C113C49E35AA01734696BF3B9 -00E6630D42BE63EB7C113C49E35AA01734696BF3B9 -EE357057ADEBE01A3315E44073441CDE2E6A240A38CE07065BCF19E65401ACBB -A1796BCAF49196CF3A11AE7D4044F66E1CA00A78430D1033C9EF827770E705D6 -A1796BCA -00E6630D42BE63EB7C113C49E35AA01734696BF3B9A1796BCA -1N1B5MvNKjkJoJJnnWEWUf5ZNrXnYVX1b7 - -E87D731ABAAAE7373AC47D1F43E352274F4A65E6745280CD05987B306A39786A -04115F07A0CB0A7679F5E27644A0B238BCACEC5F3404B58004F6D0351EEE9B4111F0E4D3E5DA56869259F69599CA0FFC0605B796F72F002E75AB29CA9FB51A5F18 -FBEE84D14ED4D37E56230F93E9E28831E393DE88EC1624BB3C95E9F8108C66AE -BD65A9A0334AC2D0B938D306C6E70436E68B9D2A -00BD65A9A0334AC2D0B938D306C6E70436E68B9D2A -50D43D382EBAF1FAF31F5D6C3D114AE20B6BE82FE1F0CD49BC0D66BDE371B60E -9F5AD136FC8A3DCAE938E181D5C227BD539BDE98ABA4CA17151941BBA36B49AB -9F5AD136 -00BD65A9A0334AC2D0B938D306C6E70436E68B9D2A9F5AD136 -1JGSVu3TFzG5aRHRJ42vMbXLEbsQnf7S7f - -73AAAF9E85BB6226D1EDADC2737238C2B07D712591E195C0D06AD05DD2ECF092 -046B15102DA26F57EBC89C46A7A0FA011C10C993C13FEF677C0B05AE38F317BB823EB14EA54505C7180DAC0B7377A1FD02BC2D66BDB426887C249BE212F9981CDA -27F2C81B2F775188E80B5BC7F9E169C641D340907F3CED276617C4B17F9B56EB -E23583535EED6C6357E1D75F357A32F6F7D376D6 -00E23583535EED6C6357E1D75F357A32F6F7D376D6 -51130018A6FCDB8B13921B90C47EA69B6A645C3D9DBEB2A6C9C3AEB5FCA0A0CC -E067AE8F59F5C79611BF4CDAB4A7BB0FE118B909E2EC28BA2147EF739632688B -E067AE8F -00E23583535EED6C6357E1D75F357A32F6F7D376D6E067AE8F -1Md5pW5vt8oojMzqWkNTRoA4jPtP5aTGyc - -3AF4818320139BBC1D269C9B9C258C1D851234D973E024E905744B76FF15B98E -0472A4A606247A9660ADD91986859108A45104D75D2F15543BCCB562A330D7120DC8154627742AC47D80333EE944016488B5F28172693EB40E00508790B68DF1D8 -E026D61092F915D11B424787CF1DB433722B41CF31F3A7BDC5B4ADB5CC958624 -73821DC6D8FD9674836F175C9299CD5B2992A3F3 -0073821DC6D8FD9674836F175C9299CD5B2992A3F3 -D528B66FB6E0531BC2C0E2A5CD6F65042597DF23AE63B61170B6B7BD7BFED158 -422D83E6D42EE63B3131BCD66A0DCA14B4264937EB5921CA606CAF61069B8F77 -422D83E6 -0073821DC6D8FD9674836F175C9299CD5B2992A3F3422D83E6 -1BXkahdmviiWTVCyBPFH3chVbVF3PVVXL1 - -06AF5C7E867F994BDC224440FCEC95E31F1F9638A4FEBB6C1DCE2598C9CFB1F0 -04A9AD0AA5A3C39927E6068B6BD32D84FD5DBE258C197D1E3232341611425CD9E3BF2D120EDAD84AAFC2CF3CA901771D3EE9ECE846F6D6D60136476F3B43643EAB -821F7A2E47526E0B5C2A24AF5C00C55D141B877366B9DE8B01622919CAD26305 -D98AC92610EC6ACA0B40C1546BCED67296C7D700 -00D98AC92610EC6ACA0B40C1546BCED67296C7D700 -AEEC7E6D4E5D2348959326367FC93A1BD8EAD70E02ED3DBC1DEE66D6202E9C5B -056353B21E397F69F0B669040EA5A23604FDCCDD87B4E414B734CEA5AE71FA1E -056353B2 -00D98AC92610EC6ACA0B40C1546BCED67296C7D700056353B2 -1LqFtdVrdWsqwGkr6qbh8LuX1ktnTJdXbP - -4443FA5068886BF11A4CAE07989839773520937FABC366CA2B65E42FADC3E0FB -04802138390AFB3343E74628EBE5AD0F7A9AA71E8FC457867459A5AED92D1ADB9C1694B5433B81107103123CD4A23B91606BBDB771AEFB3138EA41491708AD792E -C8BCA79D2EE356B820665A4FBEB31979E1E0ACDED1FB9150924ADE427682E084 -9C22A12FA7D0AA54AD11CCC54CC509030DA66BC6 -009C22A12FA7D0AA54AD11CCC54CC509030DA66BC6 -3DDC1A6DB90C6B6EF9A4A8213978B0909AC1C7AAD6666D52962FC5ECA753C6B0 -D79C4E234202D08DF711755DBCE4C29D44C80903706A3CEBABA57A11D5C5B592 -D79C4E23 -009C22A12FA7D0AA54AD11CCC54CC509030DA66BC6D79C4E23 -1FEZu31b22hL6e6HQFthCM6ckMw1mLj7cW - -D212CDAE419BCE79E810F37A9CDD36F119CCE9F6E06911D9AA0226D22CB09DB4 -047AA206C59B85653707025FA052EBD1885E20321286AB5CE3FF168FD7C264ADE4FFEBE79BE683A64C4D6BA5FE4AA1551FC68F3C8E34BCF848ED16EE0DDF9B1DF2 -BE03B9BE42CD44BE78C70AE42AA0D9018CE70F5F2F5A24BEC0D5644D31E2CD4D -606EC321732057A3D7C62DD8D6B8E090389F89B2 -00606EC321732057A3D7C62DD8D6B8E090389F89B2 -F686EF189A08D2CDC01B63B04DAB3C90D89947FFA12827208D852EB8CE6A4716 -5168359B2BB3857FC84FB62F8B2BFD2509DDE3DA7351BA5CB5A78736AA688026 -5168359B -00606EC321732057A3D7C62DD8D6B8E090389F89B25168359B -19ntZJzv8YvQ2KH8Kgvo2c5agmUZC6vibk - -3CC09D33716EF75D5BCCCF495F6A88DEC16C3E30B588B738D2E205EB16941394 -041AEBFF56FA5120627DDF5A4E96B5F95CCAE38176A87683BAC188CB89B36AED5FBCB8E7CFA49BCFA2A528D166C30503FE3FC3AD036FB575BB66B3062AB60D7F68 -ED1ED696FD72D2E48042A16E9F4C333F6B86656E61C6557D6B6FB2FBD7CD0000 -432AD84BBCF97A0A827A291937E7FFF21C29C10E -00432AD84BBCF97A0A827A291937E7FFF21C29C10E -FBA8AA87DAE72A5B689E809F19281A60BA63FF569EBDF4C06BE35183E4F3E7F3 -6DC192EC2DBD6EFF3015566F24718EBCB506C04A16A03094142B6A198AA3E5F9 -6DC192EC -00432AD84BBCF97A0A827A291937E7FFF21C29C10E6DC192EC -1789bmbVNaCCCXzzqsYS4ZX1EugPxU8AVh - -12529BC96C8BBC58D80D4920C7F2D101CC545993338DB30D2D95380C222D5E70 -048904E9549DEFE0033E7202781CA81B6EC53284A7AAC35CB7F5D6AC390AF342161A3D5BC306CC2247CCFA17B20DDB9CE893A650FFB169DC22A16685B3FA0532AA -DF86FD175E43C44EB486314075CA2881E6B49CCB1251ED331B63720994401391 -4012E11CA9DDCEE85CCA1411BC9CF40B555C2796 -004012E11CA9DDCEE85CCA1411BC9CF40B555C2796 -E7A13833F073CF686CEC6E1E641DDF6BFD69FB2C105E709901E16EE1D5FD4942 -7F6C1743F9DF0A17E0FEADBA850F891027AA230860A9FCCA28993BB1D17FDD0F -7F6C1743 -004012E11CA9DDCEE85CCA1411BC9CF40B555C27967F6C1743 -16qns39G7VQRq54j1nNaNsaVBq25Us38Bt - -A426ED8289019F29B6F5794E336E6E883CDD112E4349207ED8632FB4D587B352 -040920BC6953A9810F60080C02030356D275609F36C8C4E94FAAAC699B7B48EF05643C7F7694124448208251FEEDA0320D3E62F7941DF9071C8932FCC77D734C17 -26100ABFFFD5B5D80DFFC3E00A8BD6F7F59524D55B732D9AB0F48A93A9C427D0 -9204F202D1B6F50B3CA874D40BF8858E3D1BEA2E -009204F202D1B6F50B3CA874D40BF8858E3D1BEA2E -9C30F42D0C96401FD1CA286C9E1AFCECADC44B86A3A76B398CA93ABFC23390DE -ABF93C4C4E3AF1D3D2094DD3C86B40CAFCB2FF37BE114EB327AF3C49E0C765DD -ABF93C4C -009204F202D1B6F50B3CA874D40BF8858E3D1BEA2EABF93C4C -1EK5acm8XMa9F79tNPt2TbLeNuDV1bDHPH - -B4360AF6965254C6FE15A065BBB8441FAFF57E4DC1BFE2C3CB9FF6367CDC23F1 -045731C1DE34C418C5D759CCA1F5AFC3C9CA81E9D0362CAF34BB80C69D19028052350267B0B7B69CFF94BDA17AFF07057D7B06CB56992BFC56EBF92288908D72FC -F78C375D6F8EA899B7BAC6582697226CC414840B6586777DD15277C9531228B8 -C5B11821216BE3A9AABE7797229FEFF417F684DE -00C5B11821216BE3A9AABE7797229FEFF417F684DE -07F55BD7B97EBEBB5B8181322EFB142E179F4EAAF16D2F4760D8D7D1B6821147 -A066F1B1F7D93A782C26403F69981D1A8683975888C1EBB68783CFF5BACBFA89 -A066F1B1 -00C5B11821216BE3A9AABE7797229FEFF417F684DEA066F1B1 -1K2JGWt5TLppCTtzksQgovDBDWukcBr84Y - -DDA3537C0984D747A5A2407592C0AC9D57E0046A3132A6990E051A1683852033 -04942D22863C63A86B96533F52C92615C104B3A0862B24E0586435A1493AE1E68C6451AC2BABA667F19C154E22A46990546FD179A24C67DF21B3458F08E7343EE6 -22E90A25D81631D0A7A97A6A08C99F14ABD4BF13A6305DA4C2F9459B3F617741 -7180D1411FF9794A82AB30A858CADAAE3149FDCA -007180D1411FF9794A82AB30A858CADAAE3149FDCA -D31C47FB4A92400D3BB680494DA16424D701D251569CE645E7714B7BFD6ABD08 -07063C00E91071AF556652BCEF6C7297F25913C06C262D57AC501C9466578F42 -07063C00 -007180D1411FF9794A82AB30A858CADAAE3149FDCA07063C00 -1BM9g4sNicWp6ZARz3kLFvX7bVYoxwt4pw - -E2A689968A5F074D66B4E94860E48B2BE3FDC22B66B98CD92BE85A8803BC3784 -0431C19C0BECDD2EE3E61CB5EC66C61AFAE089FA478E842CEAE60C16B8CDCB45FF3615E331F2D8ADEC757BE9F5A72B797E6E959AE25FD41030FC45DA4015F32882 -D55589219087715B12275ED7E11279C16B27165DCD4651B6CE38BE09A0A6F9CF -F974296D3BC2F71852DCA4B920B18DECAA814531 -00F974296D3BC2F71852DCA4B920B18DECAA814531 -7559C0E7A6BB4F524F0932A7FF53B188A14BBCD4EE5F1A06F0A24EB2607B37EC -87AFB6F15C3314678263CDEE2D469935667C0585D02599728FF7FA9BDA540D65 -87AFB6F1 -00F974296D3BC2F71852DCA4B920B18DECAA81453187AFB6F1 -1PjzQqBb1ugxoZXXgMqPfVuwjfcC3NmWYg - -CB4A3B1631B0B00C6843EA8E9E566A3A8B963914602059254DE06710019FD5A7 -045EF0CBA9C70145045096974BD427B6612438FC7DCA426A14870D28E37A94DB8C586A0E817EECCEC39830D87C6EAD5D7FA45FB3BC0DBF0450FFF6280EBE1D885E -F023AAAEFD383C2916DF68CF704127C949D692DCCAA67327FBE070960E19E2C8 -2DD5937F1B024013D67E25EF7468107B5D0F621A -002DD5937F1B024013D67E25EF7468107B5D0F621A -E5C169C35589736357B6965FDBF53EC1083697428D377D64C6485C71C4B81074 -95E3C86094B4BB457C02807CC73D770E4613C1E4FEEE5AC9D789EFD682A9897A -95E3C860 -002DD5937F1B024013D67E25EF7468107B5D0F621A95E3C860 -15BMGAWgmDA1BKXzGVzz57R9sX7GeCRErb - -D0ACED80F496F9581B15315E900ECF8B871988175414E138E5CA1878F65176D8 -045F981FEAFB355688F4B355F018E815B1FF79BA214B5D0F222C8005D0EE4875DB10C59F07159DA188774286C22E6F5AFB31B74A47733197B3311CA230295C06F4 -5EB93B5B29449823029732077186F01F453B319000C5D040D8860CE23E350862 -E86AC97AF8BBDBFEA78E3C42D7203962415B4F0C -00E86AC97AF8BBDBFEA78E3C42D7203962415B4F0C -13E80E416E4527309C1DEEF6F221F94052B9D4EBB42DDC2FBB17599E5825AF51 -0E568046FA057DA26A892129F66277FB8D50D6379D59B592DF351E0693CFB335 -0E568046 -00E86AC97AF8BBDBFEA78E3C42D7203962415B4F0C0E568046 -1NBuhCUGgQtPJveBEJ8UjiEKPbq6gvkRrd - -A4A1BBC18FE67F4E082BD9515717A9649DD4BE0550882352CE4744FC1DEEB660 -046E9DA1B8473F4E297C26A3DAD8802802501B71851EFCB0DB4341D20EED7A3E10CB07BE33DE3C31FEADA400C3498D3C1BA0B5AFD3F821F57E4702340B0945D5BE -41CCA0EF49FC0DAB72968052D78551B2CE33C4B8878521F0BB9EC8B6177CACFD -744B4B83A9C07194DCA464A2654D0B5FD9E8B205 -00744B4B83A9C07194DCA464A2654D0B5FD9E8B205 -348960272C0D77ECDC636FA2FA28C1C49CBEDB5EC52BC53F1505ACF94CFB7B9B -F0188AF5FDC980BA4C046B64E6D69025738CDC74D245C4CBFE36DC2D90E2BF03 -F0188AF5 -00744B4B83A9C07194DCA464A2654D0B5FD9E8B205F0188AF5 -1BbuaqfjUTDSPNMXQKg2BWWiL2ZxqqMZaU - -E765687C4B77ECEE3A62D4FF4DFE0CC4D4755BB8C1207F29C7CF2C7169EBA789 -0423C729A5EDEB8C79591D101803140EF3FB48662167D10DE83CF42D697CEE4D757BB9005920A69869FA6376317BE70BAFD677DAF54A92EBAF22CB61D51A837E26 -3EE6A5351C225896EE690CC50AB0CAF472372FC4B141B2F6D6F6EBE1AEB2BF21 -38017F2CE3CB04F94F552D6361034A60B86E88AC -0038017F2CE3CB04F94F552D6361034A60B86E88AC -902F830ADDB18DAA98B47324146C827ED0CA2DFC00EE1B5DA8F5A477DBA95794 -4901F9FF03FC3F6CF09A72E0885B3638876DCCEEA74F083527C12668523C66AF -4901F9FF -0038017F2CE3CB04F94F552D6361034A60B86E88AC4901F9FF -1678djx5jWoV5mBiJjUKcTTxyDfGFA18Nr - -0EAF8F3C89D578211C39EEFA93B6E16DFA0383678AC54808ED8117DDE5F72F37 -04A6A9EC9FDE89FC34CE9FB7E7C9DD192CB78A9A732731D3555DE94B5BF281FAEE99EA9A6EA836FAF02F46ADC61EB23F6D415BADE4389BB2CB395045FFDED3BEC7 -A7814F07C20DD05E7AD99A0EBC24F73CCD1B315C99E13E383B0A9C8B37ECC865 -5E6E2C40D9B24B89186B38970DB98E6650116AFB -005E6E2C40D9B24B89186B38970DB98E6650116AFB -71404B14A4EB686863F8CDB1AE78B00E259B3DC2924F6EA2B6FD9060D0847D1A -C20AF6F4810298498EBD0BF9E2A202242A5F338E80F4727A847F2779FA47310B -C20AF6F4 -005E6E2C40D9B24B89186B38970DB98E6650116AFBC20AF6F4 -19cJVyfFXR8YmLUCaGxBSMy7AVPua94JzF - -0BA7DDC613C2BA78B43F5EDC467C0889309A4D02C577012D83561D10699DADDE -049D01CBB060E2630939D41BD3B9141EB41901B5E3D5B7CACF9DD25886EAAF52B722C043578BCE454275156672FB65D5EA19E9BCACF076E5D76C878F6A829D631E -EDBC1908E11F010FC69B58EA88276F41236EB25609C3EF53AC1BA85BB83D3E51 -5520E1E2BBE0B2103D44293793B81BE55893E760 -005520E1E2BBE0B2103D44293793B81BE55893E760 -5355CCA0019B3A44DBF4FE32342013F086ED88B3C52DC4F96B8EEB0ED8B85553 -6E8CC51AD59FC1E02EE746AED45300D1DB0D0DE7DDD6072EC1C6A64EB123E673 -6E8CC51A -005520E1E2BBE0B2103D44293793B81BE55893E7606E8CC51A -18m7q1io9qRX6zM2663gTsDhNnfiLGEsE9 - -B3600AD154B2B78B47A14A648E26813777D639982351EC3E86B998CB980726AC -04F449B9137ABC84DB62C7628F53B225DEE4E7C7EDFA092F2A0228D2F29C4622172EA977BE01CE14D3F32147A3B16E92E375EE62456A5F2E4DCE6F5B7EDAA0642F -60AFE23C4F6B3AF31EB2F376828AFC7CBFBA347601017A50D90CDE78C369BE30 -B2143A1A63E11B6F676D9DA9B2F2A38A0EBA5253 -00B2143A1A63E11B6F676D9DA9B2F2A38A0EBA5253 -F3AF0223740DC2C2D001FCE19C7F38C73084B0743A48F1731B241117A6D090A0 -6E3C9B1965A32B13B20D5685798996C5F42FE48B489C9FE3B7254CD90B374361 -6E3C9B19 -00B2143A1A63E11B6F676D9DA9B2F2A38A0EBA52536E3C9B19 -1HEbWYKYG1R1XbwhCV3KST1DWMSQSLSPqi - -CDFE342136A8E01DE360640B87E77372C16D3706C49AAB2E44059A3D4793C4F2 -04081355FCAAD124812366C3F98647743AE441EB24E8F8858C2BCA5EBFA5E0A28878262E14C2A883BFF74402377069F39FE3FE5819E8EA3C73BE8005FB7809ED82 -AADF6651C5D05C102213E69AC349EB899E3C5B62D7BBDB2B19F3DFA3693AA197 -91FF610A0133B8EF154A224FFABF5B1D85D5265E -0091FF610A0133B8EF154A224FFABF5B1D85D5265E -89303496E3841924DF1E10BA2E13B397D811D59EACDABBA8D21CF5BC31044999 -6D44CE5A62B44EC460A6516B53D806E173A28527B055BAC5A450AA3BA753FF64 -6D44CE5A -0091FF610A0133B8EF154A224FFABF5B1D85D5265E6D44CE5A -1EJxus5oozeZZ6KatBhQ9a1fmUM57Us95K - -15C0F60E26FAEB0160B070CC52731CED4C0BD75F8A98745C11F1DB2A23C05CA0 -043410B859D575D2FDD729BD835159FAFFE9E33B41C9AFB887B2CB554808CF3B481BDAD6AA70AF41B9748B9B86CF9BEA3CD45A15C21F9F733978C0A212393F14FB -C0030294F9664B316480A514775725570ED5BE26267F76BC39AF862ED90EA416 -498D652344FD760A86853CB75F2AB9A592406A78 -00498D652344FD760A86853CB75F2AB9A592406A78 -9D6688DFFD1ACE3E1C9645377DA8189F7181B84394F64B31BD7F87CB9D41B4E8 -E28768D714675FB75E3365ABAF5623ED939FE12ABD1C011C6E8707D003FB6184 -E28768D7 -00498D652344FD760A86853CB75F2AB9A592406A78E28768D7 -17huiJhwuvADPyXQ9zchokjdp7ch48w64v - -F6C4A15C6F2E148CDEB0C8A6D8BBF47E6349FA3AB86AA6CB9E3D23CE19857FC5 -0470935CED71571668507C4C37389A2155A6BDCC57EFF5175DE072660BEFDAA622512F8D9BD4A07D8276D01C8D960C4901648D4044BE721F5BE439A8ED17B795FE -65784326F2A2EB1FF21253892B0139B9F85FDD6CFAB45D92191F54CA8408C133 -AD6997CFD7A9679266926836B26D30C6B6679EEE -00AD6997CFD7A9679266926836B26D30C6B6679EEE -3F0E619877B19CB03DADF33E3B3E45842973C38FB17C571DF17F65A8D0CEEF66 -FA0873B9D09D7B4F254886C5A768414D38464298F270A3ECFBF6A7FCCEF57C63 -FA0873B9 -00AD6997CFD7A9679266926836B26D30C6B6679EEEFA0873B9 -1GovPvF5c1vpYJcFx8LmydHKeT5viUXewA - -E60E2E12F7FBCD6D2C0F4F537099D61881460EAEDEDA17BBAB5BC65700202A74 -043B7EE10321C152E6221D352FE316589A63DF939790BBAD7091EBF7E1CBC63405D40A56DF160AE8A42E0713985AE6B40D9024CBE1BB50AC13E22F6915C97E1795 -D54F392F9E6D8A9242B7F4E11738DFBE6DCB54713BE6C8E098B6B0D95C53DCAC -EF7CA4B03BA1400CEC173A3F3B6918AFDE950562 -00EF7CA4B03BA1400CEC173A3F3B6918AFDE950562 -A8D762015778E5BC6866669E5C405B29079D47EC00CEFB0C8C63D27145C3D3C2 -262F4AC9539C2F3DAEBE8A2F071AE931379A70E204E746CEC667B97F179FDB2B -262F4AC9 -00EF7CA4B03BA1400CEC173A3F3B6918AFDE950562262F4AC9 -1NqHpDaBaSKTpxUbYPbT8nqgcnX7HY83E8 - -6827397E8069C2025E4EFDE83ED0418ACE0EA7A2DF37BBC09F5FEB4CB01E295A -04E0E57B65D285395C43583D8506AB3382C3D46CA941C5BCC33FFC5C4FEDB5A17AD9D7AB786365C31BFF9A7038F82533D76D9200C9E5165693E0C77549B81F55E2 -24095052704BF9AA2AE265F7D922BA82B36DF953822E1C2021BDFD7EADD64101 -4002133980DFF9E3BB4FF6F96A43294BC501F35D -004002133980DFF9E3BB4FF6F96A43294BC501F35D -FB1058CF10498204A1B02238A776D457D0630475C774FB99FF7C447F99C4269D -25ED96E80454385ED83D8A225CD807C51F1E27C138ED17101352C69956706749 -25ED96E8 -004002133980DFF9E3BB4FF6F96A43294BC501F35D25ED96E8 -16qSjTXYtgcGQYefbBJhzhk9Xskhvfy5tB \ No newline at end of file diff --git a/external/libwally-core/src/data/aes-cbc-pkcs7.txt b/external/libwally-core/src/data/aes-cbc-pkcs7.txt deleted file mode 100644 index 33ad309e4..000000000 --- a/external/libwally-core/src/data/aes-cbc-pkcs7.txt +++ /dev/null @@ -1,237 +0,0 @@ -# AES/CBC/PKCS7 test vectors -# Taken from https://raw.githubusercontent.com/geertj/bluepass/master/tests/vectors/aes-cbc-pkcs7.txt - -# The following are taken from: http://code.google.com/p/crypto-gwt/source/browse/crypto-gwt/src/test/java/com/googlecode/cryptogwt/tests/CipherTestVectors.java?r=20 -# LICENSE: ASL2.0 - -PT=f6cee5ff28fd -KEY=ac5800ac3cb59c7c14f36019e43b44fe -IV=f013ce1ec901b5b60a85a986b3b72eba -CT=e8a846fd9718507371604504d4ca1ac7 - -PT=76cdfdf52a9753 -KEY=24c4328aeffc0ca354a3215a3da23a38 -IV=c43c6269bb8c1dbba3bc22b7ba7e24b1 -CT=009e935f3fe4d57b57fc3127a8873d8c - -PT=b103c928531d8875 -KEY=4035227440a779dbd1ed75c6ae78cef5 -IV=8faff161a5ec06e051066a571d1729d9 -CT=b3d8df2c3147b0752a7e6bbbcc9d5758 - -PT=590b10224087872724 -KEY=507008732ea559915e5e45d9710e3ed2 -IV=342b22c1cbf1c92b8e63a38de99ffb09 -CT=c11a034ed324aeae9cd5857ae4cd776f - -PT=ccecfa22708b6d06439c -KEY=a060441b1b7cc2af405be4f6f5c58e22 -IV=429d3240207e77e9b9dade05426fe3cb -CT=b61ff0a956b420347daa25bb76964b51 - -PT=8ff539940bae985f2f88f3 -KEY=721888e260b8925fe51183b88d65fb17 -IV=5308c58068cbc05a5461a43bf744b61e -CT=3ee8bdb21b00e0103ccbf9afb9b5bd9a - -PT=4c84974b5b2109d5bc90e1f0 -KEY=80ba985c93763f99ff4be6cdee6ab977 -IV=ca8e99719be2e842e81bf15c606bb916 -CT=3e087f92a998ad531e0ff8e996098382 - -PT=13eb26baf2b688574cadac6dba -KEY=1fe107d14dd8b152580f3dea8591fc3b -IV=7b6070a896d41d227cc0cebbd92d797e -CT=a4bfd6586344bcdef94f09d871ca8a16 - -PT=5fcb46a197ddf80a40f94dc21531 -KEY=4d3dae5d9e19950f278b0dd4314e3768 -IV=80190b58666f15dbaf892cf0bceb2a50 -CT=2b166eae7a2edfea7a482e5f7377069e - -PT=6842455a2992c2e5193056a5524075 -KEY=0784fa652e733cb699f250b0df2c4b41 -IV=106519760fb3ef97e1ccea073b27122d -CT=56a8e0c3ee3315f913693c0ca781e917 - -PT=c9a44f6f75e98ddbca7332167f5c45e3 -KEY=04952c3fcf497a4d449c41e8730c5d9a -IV=53549bf7d5553b727458c1abaf0ba167 -CT=7fa290322ca7a1a04b61a1147ff20fe66fde58510a1d0289d11c0ddf6f4decfd - -PT=1ba93ee6f83752df47909585b3f28e56693f89e169d3093eee85175ea3a46cd3 -KEY=2ae7081caebe54909820620a44a60a0f -IV=fc5e783fbe7be12f58b1f025d82ada50 -CT=7944957a99e473e2c07eb496a83ec4e55db2fb44ebdd42bb611e0def29b23a73ac37eb0f4f5d86f090f3ddce3980425a - -PT=0397f4f6820b1f9386f14403be5ac16e50213bd473b4874b9bcbf5f318ee686b1d -KEY=898be9cc5004ed0fa6e117c9a3099d31 -IV=9dea7621945988f96491083849b068df -CT=e232cd6ef50047801ee681ec30f61d53cfd6b0bca02fd03c1b234baa10ea82ac9dab8b960926433a19ce6dea08677e34 - -# Generated by: ./aesvect.py on Thu Mar 15 18:39:57 2012 - -PT= -KEY=be0d465f8004d636d90e3f9f6a9063d2 -IV=748869ca52f219b4764c9ae986fa821b -CT=790511b7776b98be3d0a4861b7f1c8bb - -PT=44afb9a64ac896c2 -KEY=893123f2d57b6e2c39e2f10d3ff818d1 -IV=64be1b06ea7453ed2df9a79319d5edc5 -CT=7067c4cb6dfc69df949c2f39903c9310 - -PT=212c4fab8ad5a7de2361ebe033cb -KEY=b6bb953ba709b450bfba14f8e8c6b423 -IV=1d3793f6b9ceb8d1c70726bc890f1f10 -CT=9a8a46a2e63518933dd3ad846b04dc08 - -PT=e6252a8da5ec441b98ff6dd7176b15 -KEY=4756800b308b81dd66545da527b38efb -IV=530d608c46c3232e7d4b8e81a273c5aa -CT=ef08cbfd9f710e27b1a08ea4d1535311 - -PT=7cce30c186cb13d400c5a61d887763cd -KEY=5e9ccbe75ff87a1f99e2dbc8c570cb36 -IV=0176a5b8d2303c7af2dc492de3dcd56d -CT=f1690baca211fb942dcc30eb1519913e5087f514e12379b8b0189fe6f03dcfee - -PT=9c28d6511c78b09ba0b5a08ef785d0e9eb85f4dd155a9f -KEY=cffb6a9f7f93346af5318a86e8d969b2 -IV=236329b93906e7a0c6a104cea1a27eef -CT=062449c89ba46851d0abf5821077ee80185991186a7e0d949e074d70d7d58a89 - -PT=99d186e261ead6548d65c49f1c14d9bfecebc3c12b763cf2222f72c7a5a773 -KEY=6e297667cde9774762290137239b3010 -IV=6b8cfb33fc855ee679e35adb001623a6 -CT=fbe833fc39dc95d0732451b3e5bdd7ffa7867a5cba88708f5dfb0fe1170debc0 - -PT=2f483fb7f6bf6fa222e45b954885976fe4b4138d2fb4c9f08596c22c62d5a09e -KEY=cab12964a25b8fd43a24b34135a400ec -IV=b3e3385ecf30b6414dae2a1c85ba0b47 -CT=04ad09e78cef9a51b4e4e7fdd72d2c56683dd45d7b7dffcd9a12a012a3307827c97b1a080d01d425ca96f77cd743a46a - -PT=0b820a2524946a48f2a4fd421c3aeadc7c884729a207e8310d589b61382b77beac5f32a1c219bb81d08b -KEY=a567bed68a2068b3a6b96cc201ee1cbb -IV=5f96beb39d4b51c337556c070263de34 -CT=3a730af992be52197f2053ec72297cdba4b0d101f4903750bceafbd3c6ac3ab8663922dbb484e3e4b13efd810bef0dd5 - -PT=4ba8050dba83ec85ceda5a271a119e2c62168f6b50057b8e18ccd62b15db59bdf358f336536be87e85c5091732024e3b -KEY=ce2090cb6c0aca6cb7984377f287b937 -IV=66d7b40f8132608d69c8063583e4f2a1 -CT=bc5b8261ba674e54a2c7fcc76111c464b84376818201fcefc64e6dd02b987078bf90a947814ce4a3fa853fde720295fbdf2ce73fbf96ffc6204af11099db32e6 - -PT=d4da67293f41a37dcd10e8a1699c2916588dfe1177037271da810280259417b4b21aca8ab7e245fcc568edcfa2871f00273b182fcc678d9a5451c4c93b01f9b9 -KEY=c327b6d89dfa6efe9227ea702442bd67 -IV=d3f765bd7c264bd66692db2ed25e667b -CT=9197f802c3ddd0c2b4507b974e4bda3812e5db2d5b58b84ecc37417c11db5fe1867cd46d1457bb2aec4fccc72299642a811fd9abdce8c10ba6a5771b84051f2e2586a3190423298ea285b831872f417e - -PT= -KEY=403e125612a3c864df25d33fd2e115a92b9a5ecabb7e718b -IV=6c52759b95cabfbcd760a818fff1695b -CT=6f1554eaec6b80485360ab40c98a29c9 - -PT=d380e2b6e4a20e50 -KEY=d9eac31f62be3f315dc69cbe509e186351b9a0c45d88d52f -IV=3fda414f2567f3cbadb740df6eaa0ec3 -CT=cafdd53c8c429ccc2e734a0a887447c5 - -PT=e0f103609527e4ac5e0fa875043e -KEY=90c4bcd8837c5f9d4ff1fb4ab0f684db72a547707362c394 -IV=f7cf9319b2e3ea1bcda55f36c81c6ffd -CT=5d5634478a032e80105de73422060555 - -PT=a1a85afa52e22563d250bdc6aa4cd3 -KEY=32fc53388361106b7c0d4f0c06c51b945be7c32a1ae865d4 -IV=443deba1121ffca6233cfe8cfb91586c -CT=d23d7971920a5a482aeb63fbc7013469 - -PT=3611fc42b1dd98b0d139a0d08e479115 -KEY=b4f4092845e12845c6e5546785daeb3fe8249305d286c03b -IV=42f17081fb9cf98db1d51ba2d3b23f1e -CT=3ae0c17c38265486a71953ba9e6129117b9f449d5ca3b544bd65ea85160a33eb - -PT=492b3266db3ae0860ced5e6e3a17bba7839f87ab9ca16c -KEY=36612e6d517e30513ce960682c49c39f71ce6f3733559614 -IV=ed244721b60346b3fcca1b78f2661a0c -CT=616c55c54e67612d2f15f3b3e2b885787bace57045fbd732dde53484f024c915 - -PT=6b80576fd97e848e1368bf3de5ecad7652b695571e1678333ab181dd64fe3a -KEY=1b6fb0dde88526ebda0bd2aa8294b84df9683572a24bd1d0 -IV=249fe074cef7f56bd2c0341ca5e0f3d2 -CT=27cf460f9787316d6f8ebc90c55d2c3f0c074862bc159c89c7c8360f3468ac23 - -PT=0d8fd5d98151e4683f848457e12378bb371667530a3ad401ca292c986fd4071b -KEY=21f0ce40b83c6ca5cd596c9dbcbbb1b1b476a91395062082 -IV=fa339b9b0a8689afcfeb80854f5e4676 -CT=989af942391051c3bfb39aa400a0d2f1996fa012fdef6499796ea77a44fb8c7cdc68fba85b305d35ef7223f4539c64b3 - -PT=e2d090969e72e05b71d934b0f5bb4f0a031ff5bc57114dfc8a0e3fff0ce3e960df5154229e6f03233c4b -KEY=f47237fa70940d9fd7fc0b8ef17a8894e91fd15f6711a962 -IV=a1275bbda866600f891f0f29a9e36639 -CT=9dfc78972a9923eb438f52ad613e600fb26de19db05b320d2f90249758815fd3814ec280801d1400a0fe011505f77a6e - -PT=b41e73401331d1e4e56f07f3321a0daefa7af52a58aac41fbf98e5fc0c7e2fdee0abc48a776a5e260f433c1fc38b9850 -KEY=688ec39a357cb13d3b72b20274c3c987671404dfa528abb0 -IV=8e3a404030538b30982aa2fb8a58a041 -CT=7ea303e19e7ab8ff2b1673c030f2d5f36befe88cbc4bca7cf078e659bbe6007b600abce5a5f7d8b5eb472bad849cadfacf2a1fb464e17c208561893ded8b33a4 - -PT=fa50c902f0ed402d23729a929ab30118d9dee19236f675bdd8d1e6b56b460b8f970195da9adcc847127461f425dec9f89077c640df19cd8705d481389be09d2e -KEY=f14735d4d1f41506ea7b018349b65c0e50d4658589a8373a -IV=faa8954426d6607f13405e6b6ff86583 -CT=141ad5032c2ad7b7b965a8c2ccb99fc4a4761ad6c23f97eb80d57c0a8c582688d605ad754d438d6dc7c90c610a4ad3853f3f7bf782993dcd45a2fbe101375523d5b67274d11f9ddfde7a5cc9178a27af - -PT= -KEY=fbd98e65d01236a3a09598253049e3d0248b3757393b1bf575db732f13824bf6 -IV=7b791370a438a952535d6f3696f0e0ee -CT=b532c481e8ed22df514f2933b30b6565 - -PT=8eaed001e15a75db -KEY=d92c083d5ad52e608ca0d75b9d283f94876091047c0e9e056717b02882629e20 -IV=259835befce40391f02141a44429b758 -CT=e0e9f4101a77b332faea82d34449f8d5 - -PT=024ec54cd280caed6b622498de94 -KEY=ec248aaf11ad59096b5f598e90f02d3d5e65e8b7b46e07cee6056926587f4e78 -IV=c46a2325ae023c3235ab5b71c63e4e72 -CT=2c1f977ce30e95c9ccfa07ee0624ead0 - -PT=8789ea41baeb52bc3ea878bfe54d5d -KEY=93fbb06277227e6cfbc0e7447757987e11b538d38fb6947c9b400f63d5115b52 -IV=f8be3b7d9e9f2a45477facca587dadb8 -CT=790869b63f34cbefa121b058f770dc0c - -PT=d1c0e7e2ee8457db33cef82f7f9d8e68 -KEY=7401cc0d21589de61d1000fedf94a73fc019b1a6c14f7ba0cf13b5e44b7ef40a -IV=bb853eafa6959f82297db301fbec8423 -CT=81b30fbc89616ed499a0e33e3e9e9ea45f1b4139945ad971a89953593b632c16 - -PT=8ae8686ff817493c6838e9a480af1dcfbb03d0ac6d9e9e -KEY=efbd1b62164761727ec5d0339d4c28251626abd69899048d90afdc688fd1072f -IV=354d774268703acdd34764428e469799 -CT=b37175256f657a2ea04513d01adaa9c314833ca8db52ca95c4fa5b795f912bf7 - -PT=99f73de229c53712db4a0e1a5cccb66408827e53a099f89eb4dbd35cfbd16a -KEY=30a67dfb0ab4fd61a18e80f9b297c14b404dfe9dd8feef3a0d4c530ea17b360a -IV=afe7687b9efe7f9b67d575ab8b7a1a0f -CT=59831b5037fac8e98ca34da74b64221eedb8b5772c98e6bae950fa6bbf0410b3 - -PT=c8fe3100623b97a5706d5fe59ad65331258b849dc3d7129fa9b77a256de2e9f6 -KEY=0e7106af780fb866fe5c52a0cb113836d2231fd98bf08dbc02e45d097a5196c6 -IV=1bbae33fe77c2e8e657b9ebd97ffd053 -CT=5c18ad0d264407c760f278db61b4afd2645799bdeeca21f9eab50c3795745bf4e8ffe0f0958899936a1786029b455d90 - -PT=5e8967007831e3560bb4adf62f2a97751c61b05141430c0e8bf558d3aebe872a93637098d0b27a3376ca -KEY=578a76c341b40b04af587635f8129ae9d44470ce7a0d6075a303a0a6f37fd94c -IV=e159c60c1a36a871d977ebf543181372 -CT=c7cb819c4b0cf313d89535cdd96d35e23f524e005ec8cd2911737ff59deed4d899fe12ff3df6ec995f50a754ef1ef692 - -PT=c0e0e9a0730db0c6173a1c6a9cdebd8dd6de8e62ef44f497ed4e26bd09526df16f6f3ab2409a1a96408a4cc85484d19e -KEY=f8df85a16d46188dc75946eeb394c1c9df85f547d9ed8132d7ba0c344f54b76b -IV=b1b3c65347045c5eb960b3537084eadd -CT=d6042d65b723b10cf8bc2a5102059bd147213821513f61abb58c42fdf670c8cab69b072485dcfb91abbdabd4b58fef8a422a93ba05f6fccc567b198a5d2c591b - -PT=0d0e15d6d437c26e54dd789286545d05bb667c08cc04b48d29634fd8c90bf0ab86ff2dd31a7eead3cec8823222c0ec88a3e4736a234e1ed7d4ea2d5e85a1b5f9 -KEY=6760d0528040ed2feb176a7a2d698a8fc50d680ad246fd83e3d0e99a58da96d5 -IV=3f8ca4b356810325c9eb284cbbd3d7ea -CT=61ae619fef482df170d00fe52c10f0f57b859bd3fe1951313f2f62959b3373fa40263770fa2899e96d9d53c47d396fed8f33eaa44daa53a6298b5ccfa51657190d88d7fd166954c742d163b94b92fa6a diff --git a/external/libwally-core/src/data/ecdsa_secp256k1_vectors.txt b/external/libwally-core/src/data/ecdsa_secp256k1_vectors.txt deleted file mode 100644 index dbe7679b3..000000000 --- a/external/libwally-core/src/data/ecdsa_secp256k1_vectors.txt +++ /dev/null @@ -1,535 +0,0 @@ -# Test vectors for ecdsa using secp256k1 - -# PRIVATE_KEY,MESSAGE HASH,NONCE,R,S - -# Vectors from https://github.com/nayuki/bitcoin-cryptography-library -# The message hashes have been re-reversed to fit with other vectors -# and the Wally expected input format. - -## bitcoin-cryptography-library: Hand-crafted cases - -0000000000000000000000000000000000000000000000000000000000000123,0000000000000000000000000000000000000000000000000000000000000089,0000000000000000000000000000000000000000000000000000000000000457,28b7f3a019749cce6fc677afa8fae72ec10e811ed4b04e1963143cef87654b75,04719f34fe9a47f2c9a22045485f3654dc3ac4a910a7b0b4c7a318f41db65c9b -8b46893e711c8948b28e7637bfbed61666e0118ed4d361bed1f18058214c69b8,ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,d9063703d9f719739ff645c77ba2f9d1dd2b4254dc7b001f8fc77c3b05aef5b1,b4508af745210f6702c687682fd5e8c8d99cd1c6a7ad450ab4640458e14474ba,421ed1256c6056d50a481d76b77cf5aa74a692556682e584a4872e8d8bbbceac -fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140,7f0fe901a21b204797dae2cc6400b6b3c25eb60e26ff666152bdfb40464eefb8,e2ef043987542cd685482e71e57d01a93b701c2610fb03253871dc2958ad3d73,38c2ab97f778d0e1e468b3a7ebebd2fb1c45678b62dd01587cf54e298c71ec43,7a6d055110f4296a85e8122b32f87ad32a58cf9bb73435088102638d7dece1f2 - -## bitcoin-cryptography-library: Random cases with bit density 0.03,0.20,0.50,0.80,or 0.97 - -001201008010802052e810181019014029a50400110020004840808481002400,fdcfb77fdbbdfff3fffbeffe5fef7bd5fff5fef7fe7d9ffeb3fd37cff77bf7f6,6ff1fdebfefb76febdee737fbffbfde677ebfdb736fe773cfffcfbfffff95afc,f4a36c209d0ce07e465000b78b2cb2926c6ca3a81733e41b1d7689c9ef5cbeca,6ffd7fefc46be80c425054544cd0319d31082344065feb719f7ae8766615a510 -10000000000c80007c0090804204001005922008006050400866004000002100,211022080086844040260048011001120002040805b100000524020c00000888,4813a423c001a0081400a11082000042401865000190102b1403008090020500,a0356ca71c2963d61c52fe9481ff968cbd3601a53a4b01d86844c3ea693d80a3,4c8a491953db7630203b67e84c94d16dd336477bec98c8b2f3524bceae5ac27e -841809d88359140c061400800a11553002000000104442081000010401520819,eeccffff7b76fffbffedfef9de675ff4e9faffbf9f2ab6fec5fffbffe0febfeb,80000504b95146424f22010009000200085ed80100840016010004581004c008,32f29fabb1ff6d9fd2ac9c2656c1c9f8a8d08bd02156323c32a9a2231f9c5323,66c7a5bc1cf71c7e3f940b5dcdbbb49e57f2863b523b7c45e67d2a0c63ca1780 -41fafe9b8aed4955413045f361506cc58c335da64450788676844e8267179624,002220942e00411b0481800008004821a480524040d0e601080002020490a890,dffeffffeffdf7dfffffffffffffffff7fefffbfffffffffffffffffbbffffff,3f702736bad513fc7fa555a134ea9a06ac9cb45cfb528f976315f0f6cbdc8eeb,31cd1941849f05b5b93cf3e4da520904aaaccf4e6c9a0ca77d7e693b78c0953c -41f2a151e80b66a970ef7f1f1270efed453d445ccc7b637963303ed25cb49dda,1108012000101290420114028c020831210680880341d35a0411003088004140,b1403b66f532102faed410f01cfadac147420fced4423e3f67e06fec6be019e6,8c85c0d884486fbbf4022b121271d422b973a6a4552f4ceaf76d1310dea2456c,17b55d2407f2ab3abefa684a97f40e5c0a1810fb024d793f2d906170fc12c4b8 -100020805348042222288002860004a241020802500110010081020988010003,08a00100080100526a00008025488804050004214c4005604c00030282001102,bcb1d8373a8aa50a16eebcd40ce56cd174b189a5fffaeb508a1dae403492302f,de228e575f334371621571b1ab55150d9cd5920468a43388d4feee0ead7428d9,33c2c6c69f15c704d9d3a291483d6e6a2695567d2aab5d9709e2a7f8b4ac554b -3bfefffefe9097f95e7faedb5fbfed5ebc78ddf8dfffebefdff9fedfbf8fff5b,e2d2408aaa71354acb6762b9a55b19d8beecbc7db623824e39c616a2a6311399,efffbfefcfeff97ed0def7fff7fb7ff9e7fd3ff7ffede6fff476fe76b6ffffff,eee1f90fe668335ffb4b984b26ba652fda99caad35b7e36933d56e38f1a9b047,7ac52797d71cf478750223308bb020bf56972dca5c90f08729ea869c13e58396 -64184008040308141020700100d0800100e18180960841801804036010131680,cbc41b29eaf96a8deb6cc7c45f4a357be167286dd35a9fc39d3a728177f824c5,1f234be100a5633ef199b7547430ff05b02d8eb8a020650589afec0a3dbea98e,78787e2527c145a7872bacf7009a71e03b7d12faef1a0e64f5ad1bc20338a6e5,6f1e3f0bf8f8d462a70b7eda5d5a50219c4e34769d2709f1beb979f95e98e2d1 -e5e7fffd8d77f5fedeecfffffddf6b77dbe0ff79cefdf7bfff6bfb7bcbff8eff,810000a100221117002a00a41080806094048008108c2b05e604011804002140,f4d79ed00372cc9ee412d683a8b8a16932e6b0b57b3a50088e5074679a28db2a,eed43173be5b55cf9fcddbcb28c0250098cda5a31398c830878a1ee0392772e2,57ffbbc16a08d9e549bec44b466512dccc328ac839d6e87a43a8517bdbe224e7 -8a0104c1800818a014408010100002001201242002002084800280902a002080,8c25014220020e0d1c01800043009008c00000024001101901e0052108000000,9ce9a263c86b8aa77130b0a0bc120636a73c7622a58f1ee77a149f415240320b,404df5d1488875b2e77cff926bcf27144055af958cddbb723e0d91ba572ba1fc,18d24f1be145db9f949cdc56c792c5b1034a5590cb2c77bd62b3a973a4647ef1 -300481c01005a080000a44044042043108110238040040000028aa4004229101,bffffbf79eb98ff55befeadf735feffb3ff7fedb4eee3f1ffefffdfefdfebfff,bfdbff7cdcd7ff7ffdc3bee77aabefff8fffafcdf7ff7ffffd7fefffeffed57f,9c11d60ef10054fbd6f74ec5baebb9f5386fa47bde2c33f49c9bfa3446971ee4,623e138536f793b5e653feb63cb7f3345623fdf6cc69afdd3d7bcec47d709078 -efffff6ffdf2ffeff7f1efdfffdf6ff7ffe27bdfeb97effbfdfebbbdbfdfdffb,a2d38fb7533ba95a3015eba07a3247b562f34ee78c17afafe424028b7728f70d,942082880e410c638c20101200d002900294402200564030040409404500e621,78704f0db5c44f7b92cf354bd0dfad270becb461ed494db2dfc81f728db08dd3,5c0868c05a9db47e7261dd5da78da8d461ca6199f61e010a9fe17d85dcf14531 -fcf9beffdfff3f7b73f77f5ec7ffff77bf3fab67f6d7c7f5ff7ebddbdff3bea9,0ade4527bfac743b40bffa56683bc463ef69f48b6ece67738d5ad3db194e735e,001b9000e8a00a60500000001042819062116d002910443100c3614906804020,c6777c4b2f6c90dfcbf94a46b27c31d5b8055a3fa2353ede771d55f1109c6cf8,67110c133e50f33fe5cceadeed6228cf62755494c1e3eabc1de560ccc67fe8fb -0000000900000000000100000000000200000008000000000000000000004000,14e9acdc8a9a70ea8188a6aee4eaa49a8666027ac7bb33da61a146bf0fec74d2,e095795de203979c6b6e145a6ff99fc843adaeba8eb54fb856e4ef719f8507b4,16d9f4696df004fe3ce7f6bb5f68202748d7c7df7b2702bf098bb6c600eed666,16d04ca0516dea1b56830a3844092cc350be5121cdb3c9321b661a390d963957 -7ff5ffaafffc7f1104ffffffa7fffbfffbef7bebdffdbfffffefe3ffff7cff7f,9c71d0cc68eae1166dcbc977fac93fe61f45d9c777db3569bf2d7a6ddfdab11a,0000000044008280040000400000100010100401022009840000000000000010,41fcc5dd1c54a07dfd06b13752b2a3786f025249edc9e9f1be7153519575f861,1be704e2c379b1bb7dc2a050f375ea90ba1c19b03481a9528b6b47c230052248 -f5ffeb73f1fdfeb3ffefbf7bdfdfabfbdffdffffbedbdaa5ffffc7fff7a9dd27,04bf73e35ea87b27ecf635a66cea12d014ad4b76ad73f15462f94cdee407370e,9d162be73fddcb7ff26f8943dc8c65d2fc6e50ac0aec872a7780c642f0c9c22d,c60c7a14980ac0fcf9e1afd04c014777c1cb9ad3a59dd6a2fc999f96b55fba06,1679dba2c1dabbc40ebf06a28540ad1c981104713885fb521ba51660f17480f6 -283cbe1ee3cb7a5230f1454b03c57929ff66b7d8a7c1181487e1bc6488cb5af2,7e9bf5ff76e70f7ffefe7fdf5d5f7bfdf77fe79baffe5defff7bff73abbe74c2,fa93f6f3b17b9ffbfcf6e1fbbffbffcdb9defbffff5695d77fefdebfff7fecff,0a8d9ce4d311b1ea50f1a2c9c439914ecd9a1d4c2d573f2a2afd5d81229b3eeb,120fb22f0d187e48f7216ff8bb0be0a62dc5c73b35e39187d10817035e319247 -6f5efffbbbfef7fedaa6bf7e5bfb7ffd7efdb776dfd6e4ffbefcfef6b6d5eff3,0000000400400000000000000000200000000000400080028001000080020000,ad5515d6a76339503b9c37253430276806f82181dd3d753395210c75483d2227,a6c26802b17357dcd81f1dd5431b4cb80dc245fdde78d2d782ae77f005886058,63e263286e3d66ae6fb23222c8a5933aa6df076b0902ab7761501a6ce9656d33 -4461050a32afc92024e384c023fec8fcbfeaebcd532cb19ece87e6e177e5af24,befeeeed77edffff13bfc76fbf73f1bff7ef7fffe9f5fefa9ff2ff6f7effbeb6,9ade3242fedb12abf0d8c9967aeeb67c2ac22091becef57d022d276cca9af42b,796ca71d99dfb6077f500841e161c9cb85227f28944e68d4700c3aa9b072ac61,68be8cff32983a7f0148545d0048c8d13ccbdb093d86fa522f50c9aef9a880cd -feff7fdffff1ffbefbaf7fcedfe9b6e77fecffcbf5e5d3fefefafcafef47fef7,3cd46c7ea049bfbf061896c7b8b915da12d8b5c01ec56ad5b11658ead88ee042,32d36b3ba93a65bda7348045e4acd46892686efcfb6ed631e2ed66db5161aa8a,5c11906ded5404015a441fe98ceaf258bab7e1b8596fdb016f60cfba6b44c9bf,4f43a30a834bc3a6f24d7ad170879b983d7ad5676eece74e6ecc5765c21a2b64 -5008808c4202046583026604142001410400008c9304282500c40c14c4622108,04084001800a100d0030c1600532a2143800a014608001008309000030012020,fdffbfe7fdbffefe3dbe3a9bbbfffbffe3b5e8dfe9bf7ff5e7e37efefffdebde,94af37be2aac753b7c16e44b9f283048fd18811c7ea9525ff875309f20c8ced2,3e644654d7b45c680573f8ea11c7c910b802359d019789a13fbc8ba5905a4fb6 -609014024674020c040242002028140001080080050441480000c000a8110009,6ff7ee9ff95edfff6fbbfbfff6f7dfd4fff9fb5effbfeefbeeff7bf7ff9fdfee,500c002a3000221c000c42089008014419410cc3803000210081c04000c00100,cafddf56d27521d1485751015eb501302afe77bd1f39a34a1ac8069b46644134,6fa78225ab7ecc7c412ea82e53ac8114103105fdc97a6d43f2486a3b6bc5c72d -5e58033162a656ab6fe6ab2c1f2ed9f4512d909a04ffadc6d1f80bd97b7ba1c9,a1ef64ef3860ee9fcb998828b606279f14d6c24bedef879fc10fd5ad30733a81,1ff05ebbe255fe29248061d96e22b7a54031f86611dc23017f7e32994a4da6d0,c2616d53191c3d9fceb6c76c13f01c8fd4287f375c776c8ce703f0e822e66a94,7c9f3f3a261a63ca8fd9ee7c9913af8a5d7d993338b32ea1e530f509773267b3 -eb7f25139d2a31744a8608877cbdec993c28973d00bca2b0b6b20e6b66e51d97,dedbfffff33f84feff7fedfbff7ffbf5eeffd9dcffee24fdfbcfff7fafbb7fed,0b3ca97bace085d48ca988dc4eda0db9364055c2b2f42604c034b38c4bdeb3cf,3e2b778c728a3008a4db1631b90fcfe57107fc14da0785864b764001545d2a82,020f9cf58d429fc6b6362c75fc2aff46b37c8b2bac7d381abfce62e53b0a213d -0800001000000000000000010004000000020000080000000000000000000080,42179db98b0f783c14a9ad7ff49ab6ca6a002b49c3bb4ac95627a3955cafad7a,46b9eae3e32bf400d937715b2eae75e33390df25b8a54119c04e4bddd6a4cb67,0a9fc66e53b7ace72bf0ea94a681e3f61dd0a3ea74a0d0242b7dd3cdac0594ef,3025d3773a7a0e629a046da15f9dfbe51516ce5d9636621d20d01968b684ad29 -04008010408a1300000001000943b004040081410a6809509080060800008004,0420620090308c8a1300183022000010da0bc11c0010014291c826c004b06080,ffffffffffffffffffefff7fffefffffffbffff7ffdfffffffeffffffffffeff,420f40642f476bea4c060c6525a6e00d3623e9efd505a27b0feca73deed08fb2,4107b66094e89a5ce85e55bfdbff2e621d0fc1a142ec30fdada30de9e2f30ca7 -101243110001a00080628001a22101000008000000101549b02002484d034804,9b6ccb58e5be4e98000bc9865766c553974ecab20f0ea970aab475466d8bf2ce,bffff7febcbfd7fdffffedffdfddf5fddfc5fbbfdffeedff71fffffebfbecfdf,967dfdaa4ef1c7ae8e47b77f7e2d83ff5aa32a6d53c1e411ddfbdbb2ccb6c66d,7f30e44daf7fa0b6e7b9aa5cc93643a18d640ad1a65272eb3918171d538a73ad -1142000d42402506010040012060800c30800a412010420042d0842088408886,50001012042a1008002472060002021804420006041102804080c0188403a064,64f29c1e3e8981ed7a9e7283af64ddce3be8c39ea15b75335d10ef8c6321a9ac,a78266c29fd92df422c0025bae425132b59e986167e369c7882405bebaa998b4,55f32bf2c3bbaa78992e0307f0e161b45ad36909a2375f993bb18d2c2f5d92e7 -0c250fe0fa74dea0cc48f26953d8e48cfd1fec02f9b8d61bd77ace2571568ff5,7f79e7d6ac77f3fa7f7fdf7fbd7a917fffcebfff3affffff77fbdffb7fff7ef3,586cb228321dcdff0c88c4f9afdc5b495e76a750a4616a008e4890209333813f,db053dbe3f6c06353a06dae53253eae59f0468ea517ec274a2be334997f894f9,588124fb06c1f61f63a7084db79c3e71648c664657de1ab3f736f6218b4994c6 -d067dcfa3f7cb343cae3b485cef1d2a4036ac32c9533cae1d2d960e1a0a4c788,ff5fff7df2ef6fdcfdffff77efb1fffafdfffd7dfd7ec6cedbf3dff7d7fdffdf,76e1bd2c4402a0ce56396585472f7ea88af956d481f7c4877a5d5f66f1b2c72a,f0f29cb126556148b75ee5aa75c648f7d5b2feda56d53f0ae351d4c57d1fd3b8,460f0ee6ebbc03d2e1277de9eb321b01d7f91ec0b7eef809c68da24e5f91cbd4 -8485a05e39edb21c2f61b9661b48edbc80307515f8a41d4a0f9eb971b790ab1a,7dff5afbf6fffffedbf83aff7f5ffbbe9fae8a8ffff7e8ffa6ffddcfdfefbf7a,2dfefef7ff5ffffcf8f7edffd6aa77ffeefe7dff7ffbffefaff167bfafffb77a,8b9ee3f2c2284ef3b53d612aa77b193739905377f780416bc28d4b2d19bba532,3bb383d3c03158ac0d8075b84ca2a5c5dc72f2bdd989fd37bfbfe08570827e45 -fdff7afdfdd9fcbfffdfaff5b37fffeedffad399dfbfffdbffaf7ed6df97f7ee,0080000000020000000001000002000800000004000000200000100002002020,b313fe9effbeedbfffddffffffffffff7cff5fff56ff9fffe77febb7fccef7bf,c2df4de1faa73abd548b420c21e5c5df9c2814c75ed57ccdb00aa32cfb0e25d5,5a89c9bb5f26d029eed80eb8b53123297674281f8fab0bd3879d8e2e4b9f3d66 -40100236083641008200080a440200100a010020a09528820549004004480001,e7eedfbeeedfdfdf93d7f9dd6e7bbfbfffffbb17afeefddf7f5d9deff9fffffb,cceeb8b4f339efb766fc1920d2d2a30d22b16687e8095032780856de556be2e5,d51dc48ffdc6a6e1b0171cc313de7817087561d3368b3acdc5625ad6e7b92890,651bb4851af04e083bdf0823257c5c28ae79661f3dde9d3f13ab1de4f5d875b8 -4045890082490889430a01082011002020082c3000814010198a880806811109,ffffddbefff6fff75bfffdeff7bffffbaffdff33efefe6b7ffffe79fefffef7f,08220222212000000e89244850200084830d0004240411880a1103221200824c,62dfa56c04969c360ab6a33052c6536726c1ea08e0191fb9f6a4fd05d48b4c5e,40bfb7307ac46c87d9c71f09d63e1fb7d8ebb446d84cca08d8add433a5f614ce -fff7ffbd3bebf7dff13bfffd3fa7efdbfb7cbddffff7fdfb1fe1ff7773fecbbb,dfeffff7eddbfadf7bdff07fb3fe7ef76e7eff9d68fede47fefdc5feeefeaffb,6e0de3a2b4591ea98b3b193374fabf6a8f8ac2b1738e08966834c0ea835aa20c,59ddec3ae450114442a651fcdd0f495b640b4a22bac8401536f5ecc1b62c2c7c,07b823b1221c3ab156a3a6de88e528e78ec2d059576122313c62f767e983d447 -17b3520a6fa995f5f870eba05d3537d546c626a54f131c27688b3e34e9fa0171,0000344618206040000b002040005590840a84a0086108001584b38110289202,fa957d9fc247dd308fb4734120384f75e905e8caed13cec50cb23cf387605935,f67863f04e3c642831bd89aa583d71c5d689172e044b3826b353e095d79f890c,46472b986e61a2a4a98d117e9e6fb19b0cb1b5da93fefa804dacd3916398c179 -0003040488a28011440c0000023901010120400208128202012822000010033c,afa8ffef73f93ffbffefbe79def6dffe3dffffeeffdfbbeffeffb7ffdfb7fdff,78000000054909010d80161a20340400211000810d0414a00212120402400028,6b4034fcf207e465170b3bc7c1f06c0a329455e8945f4e7ab013c64d41527e1c,02149314feb69abfa122d093271606aa5ab25737fd9b122f36ad848b44df4558 -3a00a1450040207098402002280062300000a014801058080034554920284800,3d9904677d909731f262936cd18624eebb0a84adcdc9c3b6360e02847d9824a6,ebd7affbf5dfedf393fb3dff7ffcf7beaf87ffff73ecbf7bdfeffefeaba6f57b,acded71943ed97845adde494d67de35ab92fa3d36be835f9a8053bb4293d05e6,562fe5f00b87899eb26cb9e06062629a7e2ddcc1c5e3562fd025a925d9a929a3 -ce7dfefffddebfa43bff6fffff95df77fb79ff53bffbffbfaff7ff5b3bcbfbfb,9a0f20225a65df0df1e380eecb90e43e2007b9a0c7aca27b1629e1841312d2c0,b5b61aa397cacd2367830db76055cf90789148e7304f8905093ccbdd3cc9fdc1,318b5fb1feebac3d61ea7c9ead2ded4509de316c9885395ca64e4602c29318e8,299bfe0cb4a60419125e5fde42c868ecdd16f5c61fa06c0dac5c3642d55dce20 -d4e8a77f6e94f4a426d4131d4ab6bf91605648c7ea1b070bdb98d0621330d8f4,ef7ed7f7fcee152e7ff673ffa7c7ff7fffdb1dbffeebffffbbdf9b7a2bfd2bee,fefbfefffd7fb36b6fb7fdd3bd3fff5ffabde73fdbffffdae9ddf67fb75db7fb,3766548ecba1ac8d5d4190293b8efa4fa4acc8ab1bc2f9238da705bcad15db0c,19066fa91b681aa033aeea225d5d8f15d41417d69a3cbf83ffc7d4a56aac72de -0034002000200e000c21041cda080304a000863000024210000a194211030208,0814800000610008400b048064001500000a40680c01280032c4800247402000,08801081008010400d1200e0c000a0530011100c000824a900a18440402240a5,0359f41594d589f10466574f82cd72707adf0d37c7e32e102d2821bbd7819f3e,5ba072d6e71076f86568ac9a8004fc7e8ad621520d8639ef591a634657577f25 -e949fbfda63e13a97bec70b93c95ff450a85cc838b7c7c07f7427f32a2cdb8ab,fffffbfffefffffffffffffffffffffffffff7fffffffdfffffffbffffffffff,3809d00420c2a466020002490861414823201068000000098000401014341800,224bcf63a1aad5f423607984f1260819940c289b85319bf64c078697e0abb891,55601fc8a9d83f28d4aea208b4bdd13332882da8a676b97beeec02654f869f1b -9ddb3a53deb2ead7f325df8c666c491a8bb72084e19b55d5b631c6dc38af3266,0002000010000000000000000000010000200000200000000000000201008000,77bf6a3f667c517e4c74bcd511973a97cdbfd75cd4ace1a3d09f53c10ddb8851,ac440d0a1c2971c950be3bf0079f5c37212364775dde44b29f49e6e1872c04f5,5c062e8a55c8c386ec6af116f5229c1a2b5f9fee19be0971752f85cb06173b6f -08024233024001090141400308e031204640001010402880c180082066062104,446d793590d707c1e85fa3ea5728cbac1cdd95c7f801ceb539c79305822d5c7f,f3e5ff7ffbcfe763b8fbfef79b4ffbf779ef7ef5fe3fdf7ffdbbbbd7df5ff5f9,e983df64ed6490929983a9d8ebb3bad964826dbf19886397de44fb8419adde48,3aea433432b284f210c0482521bcd5f558447c99188ac0427ad7e5aeb37ddcf9 -fbb4fffeffffff6bbffeff5fe7ff7fffdfbfbbfcf7efffb6ef7bf7ffd7fafbfb,0000000000000000000108000000000000000000000000000004000000000040,f7b7ffbf7ddfdbfe6ff7fe9cdb4ffffe597b7ff9dcc77ff2fff6bdbafcbdfcf6,fbf392c938588ae5e81b2f6f5435a1d7a8be8308bee289f52265f4f06011e40d,116d143f6312183267c4fee847d73c658de09b770382cebd15b31285f6f1f0fe -2fef7f7fcdfc71e7bff673ffd7ff6fbffdefbffbff7bdffbaf3debbf7fbfefdd,150109f05180b2004684300022200082c484480210880a524a0107a12c00c602,71309044011403000e594000e9120888001208d821000a8446015201188004a1,68c07e995ba21e4ed05852b837e68b421069d790e643ef9ff08260cec7fd6848,535bde5ea8c69f96131bafa55309c8b6084b1146b1cd1c4d0b45d0dcae64376e -f5fff7ff7dfafdef77ff7b77ffefbfb7bb3dbbf9eb9fbff9e7fbfdc5ffbfffef,e75cfdbded9e3f7f9ef3df7ffafbefff7edb5ee7fda7dffdff9ffdfffbefbbec,2092005801400099810000a1128800846012b828050800081281040020441640,b92e00f54ea7b8478710a3ded28d36912dc0081ef0a5823b45ebb7188478907f,2b57200755810d2e557d93c0cf4b29bf9fa5b15d42cb308aca15916697cfda19 -240a4121f0a574538ff30a622918b814874c658151e53840c7bccace1c694829,ffffffffffffffffeffffffffffffffffffffff77fffbfbfffffffdfffbfffff,f4ada16fac2400d6daeb627d14c2640181c5ca13edbd0c0f766286d3571a837e,1350d44e87f76e8de1a53fcb2433dd8d568ad5ae9693fe29a02e6d3738b9410d,3082a4abbc21ef94310eaf916f5226ab91c7e856f46449a1e7a07573ee3aa599 -91324ddd92dac412d16d974341c0608edc983fec24f6b54823046e46a84f94b2,00020900058824110b0180018193245804b00040492300841040110a06400001,034454380004738060101a10001a000482080b41c10105100311200090842110,0dc083174f7f7e9a4d077e7f95369c5f657b4e67379ceeb2b1b0b375257c23b7,597fecda494a3e535e858ec0940ea80840b845d508cdd08c091d30cf73efac8a -d0b08257db15cdb776c98667fcd6d8aa3d16f1cca2702ed895bc27f9170cd17e,9020004120000900020000a00200160410c010d1400205400a00010008820050,6458929d1fce3afc721a3a6e0fa69ff7366aa19f81fc6077ad68d93f9b544c1c,9738a01c4cc88ac9e6f5cfdd1dfc31ef5643fe54a194ba85195f5506ad54a728,2b1580e671d71b3b677e54847d5bd32b83e914cc59bfc077c39da3dbdee78e9a -005a2c59c00a2041400420802049c026011011010021640244a820000180884c,da79ac73f6d0921f893dd44a741fb7d60c020efdbe158d06d8d3bd22d666bdb7,ef9feefff5fdfef3e4f78df7ffedfffb7eef7bfad2f0ed7ffff3effe9dfbe7bb,20b738374e13b4ef09bc8a23d55c99a29c1b8b1e117754732e73728c5df2e31d,23281023db4c02101f75be9b32f9f37feee2fbcd096fa9ba08f1f7cf725bb3f4 -03062808080c8801090101101290500884000980d0602000071640024054040c,2e812d0c96d61ab5cb6cc9116b3e575ba07d93ed6b29142e91add3f0e40b6b68,040804008286008201d01531008040020088404a100600520020210288879a21,a9eefb464b4705b1aa492cb01f3a3cfac3da4a8adc0dfa082efdec8d64a6a3b3,4dae79a3cc261eb4d077fd493ba6924d5ae2a64662fc9d2346e704e6ed97f62f -8d84b7778e60ee6bed2ca6bde7c6e8d7f6c9889a9aecef334e53468f0ada1fac,cdffbf785eff97bb4fdaffdfbefdfeeefff7fd9f6ffffdfdffbfeffbfdfbf9ff,efddeff6e6dfd5b4ff7fffdbddfaeef65efff39bffbfebbeedfdfdef8fbfefea,c4f84a193c294520c67d1c8f3957a5b9c2cde0564b88c77629a052b4ae3c6307,26e65498b837f89bb65eba0cc52a5db522284a32175177f8b8f9461ebb749b66 -615cb2b932e496ca9369b1f0b95aa7428225013b47e7124c7ddecd61bdc4d6d1,effffebbefbbffbdf6fecefffde7df3fffafddef5ff3fff7277bbfcdf7ffbffb,20a0360800804842049048004805c10c0100000101404d020049502036900210,a8fef74459bffe425e674502625dc0efbee1e0553470ca5746545be4bc141fdb,40afdb57c6c8d2d94d222f5ebdf872f8470a98a479715a6087b3b2b15a9aca4b -2dda30693ce59f362ad374196e143ba0c452e969d1e6397d2648defb3c72b7d9,5769a1fd51218ff6c9ac78742680e8d747a85e36a93797a50eaa6f34b318cc01,7ffddd7bfefedec3ffff677f9fffe3ebfedffffff7fff55f4dddfbf7f3ffef3f,80e91253b9f25e8c56a7101a2cafcf990cca63828dbfcfe3c0471936b5dd2263,59bf2a45031e0b5f00b75d4567e96b1a4d0d149734118bbdc9d7fe24e6145e11 -0f9ad750e07293070c237730590a29ce28466cfe08de2d8e62bb31fd66513a4d,9bbf67f9ffbea6ffffd706da6df77ff77f7fefff9f8fddfecfffbffe3fef95e7,fb5155e7b7defdffffde7e97df79d77ed2fcfd567ada9fffef9feffbffebefbd,36ca17164a2fff7bcc8cdccd35004173941ab2e32e32fb42452c48ad482b5476,2bb50003ff53e0d9f4553fc584402e18cb72ba633695388c6988250cf0896cff -79fafffff5bfbfe7df5b9d7fadcf7fff7dff3ffe5eefbf7dedeebc9efffffbff,ddffcdf4bfffafe7c1f7e9f77e7fcfbff6fb97ffbfcbbad57dfebbf5bfbfdfee,47ca2e42e84e960cfae622e72bacd48674dad1d1c3365cf3869341a583084bc4,188b80edfb329b9f2cfdbda8dca5afdfe7764bd226d97f24b850ff69368f7ac1,2fad6aeaf6ed30b22701f93bdc67e75b5ad77be9d4e5528929fa91e9f20549c4 -092400100544c1223880a95802000041460b0413422002920014500500001440,75a2e3920f2445fc321c231ffe9f93ff692e19bde55a389e98cda21b30681a14,fce3d8fbbfffb7f7eedffbbe2ecfbffffbff6fe3ffb5f3b55fe7b75e7ff7df9b,41139cd2d574d538ea93773f8cc56a6aaa9e9a071d0d5408c95db28c4674b186,03c6d40ff08a461fbffffc22bd878a4f6236907321ef279d12059532f19bd461 -8efdbeef1eddbfffd7ffbf967bebefffbebabfdae7c9f3ff9eff7cf8ffff6b77,223fd541d7754509070e82de03d86a1976e3c62a023d4a00181caf76f994a7e3,7b915338278e85fcf773995d7e7d97e8c55fe034f13b994936990720f7ef791c,99ead8653accbf6791903834f45eb8c13731d3f82086a4ef67403712cfecddac,45f27cebc0f77fe35a83162369b3809239dfa4408bade2aab3f68c9f0bc851ae -b9f1ffb6ffbb5fff9cdeffdfdf9e56f55af75bffe7d5ded9fef95ffccdfefdff,974afdbff7b79f7cfffbff7f771fed75f7ef6deffeffef7ffa6bbfdddffffdff,02820308c188282c04a0a0880008004002c8a6810823e0b440a30c42b0320200,c6def593180335f013bbc6edf324a051e434e4947ff218757130a20eb4fde47c,75cbe050e4282a6c1d7b6b07a67369e4b8405f925e64720b3de47ff1492d8362 -05de87564ffc37c1f5404106d8e5b8c2ebc57c10331fb69ed467031a50c6c89e,0000000000020000000004008000021000010000000400000000200100000080,4eff777ff73fdd7b7febf3ce3b77bdae7fffeffdffd6ebdffd5bbfeeefd7f7f8,bf4ff48eaa8f3668f3b8d1df0eca9eb1b4ca5f2265e9cdd473cd137366b8291b,4774ff959959647e1152abafef7d12162d66f9257d89e5902d7c061fb00dd0cb -01007000408200200401404002402220c142a0007620800000843004268c1542,eedec779f7df5edb34d3df7dbfbbffbfbffffbb2ad778f77d3bdbf779ffffadd,81f3bfffefffd7ff9dafdd7fe3fec7776cff3b77efc56f7f6fcfff2ddbffff9f,dcbedfbde9a35324f5f8874ba23df193327597080775d25927af0c45df86174c,436a7a87a4a9bd7aea5757b778c80b12c38324b8b057a74206fda9e2f1faa1f1 -bf7dfdecfbfdf7ffebdf1ffffffdedbeffff75efdfdfeffbcffbfbfffb7ffffd,9fffeff6fffff9fdb6ffffd7fffbb8e7eeffa8fbdee3ffcbeff4edffafbfdffb,c0f97ead8294fdcfe6a3edb6c9e342786716335dbb72956207c73ee700f69b1b,7e224e35a8cacaf191ddbc9e7f42e42f8061d003669abc73e3d19c883929d4a9,2314306286146ab0ae13b2899931f66609b4e35ff4f04162bbde71c216e5d48b -5b124d3b42be0e0ae2631c4e72166f6444d985d9e9e77126a92c45a2a1f7d550,bfff671feed97fdfdaf57fff7ac7fffff7ebffffcfebe1dfd7fbbefdadfefffc,020000c400020002604415c02001030001625b0088000e019400078a04050311,3837dbc605a980c51ac965cd0e258343cac591cd06aec6a7325aa73d8c1bea91,4dee9666f8a6b429af018dfa3663054d6e13125a5fdc6f8ec6f86785e99ae80c -c7718502444b526a508b1e96acec6865b5a074ed3930aa6ce2aea20e82796eb0,9544d6a515a80e08b10c0c976188a9dc67e68be14dff8e4c15fa6e1b626d8f9f,008c000405044a081880c20308004140288001106c02000a002c00c420528844,e44c5b5952eb69cdcab135b20af9982465491fea2f535920b1dc31ac4c83cf9d,61b56fdc23311047ed23029d0b1e84a7dc15eb3ed7eceb37b167df79eba9c98a -deffddbfefe5d7fddad7c6fe7fefbddb36dfeeefe7f3efbd8fbdcaffefb3fff7,febbbbdbf7ffd96bafff7377efff07f9ffffbfbbffffd6dddf7d9fffacbeff3b,53091a400080300480600601210004c0000798082200201000404cac01484010,cef0b8db048ab57563429a237510e5c1c748411cba1fb10259cd40b56255dbad,33e82f9df5e658858b46ca2340f194e7299c8eab72f730b7de523243353fab65 -265d572c2585e99e7619d322289a0eea967adaa5379f3c2ea6fae1c132cd4f88,080a03128028140a040040b88080123d0618200c100000c010802a0048783040,d87f7dbbdfdbdebffeeeffffeefffbffb7cf7f7f7dfdffbdffdfbdfbfbfffbff,4cf2cdf55676a98a9a3fd8e44d1c9248d860ec6aeb1a04223536ecc8939f4765,701cea932159ca069f56b164c1223dde796eb27293c5a2cb9700f76e2c6a8dc4 -dffdbffa7f7bfddffefdbfffffeffdb5fdfff778f7ff1f7f8bcffe7d4fffbf79,16d7bb7ff2ebddf7f689bf7bfdfa7f7fffff7bafaffffc7ff7ff7be7f57b37ff,07018024530a11041a94080438058158844a818006092490cd0a420038004001,09f4165d4b81c7869828f005d07ac2b236b86f0b66e9e1986f9cb63a9f02818b,1ec21626a40a60276deb015d4969f9c233fe1348409073b0c5c7441b6ea7958c -1030118d11888011a8030b63005110c08c004089c000030001a1090518000c20,8c162a7f1a09991f5db2f4307e1fb41e899459260581b6df1fbd802f4dcb614c,feff6fade7fefef73fffd7bcbddf5dff48e5fabbfbfeb649ffffffcdf7bf797f,44a41ec47d7c19500662fd86eaabc942d0e582e6c387cf3eee2c0caf98c3fcba,6ddd79823fad6b2425dde5df23b73503ffccae375e54d83a6c4b1ca97e4cb21f -800040200000021400000000000000004000000000000000000000000000a000,deffdffffaffdf5fdfc4fcfef7d7ffed7f6ff3bf3ba7fe4b7affdeadffffb7ff,fb7ffc7ffdfd6da9efff7fbfbfff7fbfd67dfdffffffcfb7efc7fefff5bffb4f,768bf43114744c0bb377ccddd588cb7fa44ebc2b13f0b13b81e1c7ea194e4a90,7e8982cd2dce52ca7a0eb2421efbdc6ed58d9be212e2e34e92abb1e4904eb3f0 -9cbaa93d15155313e014b0c1ad07dde350ce2f6bc1f4ea641be1717a70a2527c,bbfbdfdfafb379aefff3dffdff9fffed7fbf1bcbf9bf57d3ffe736ef73ffefdf,5b23b1b11b1dd70ffe93c601b15b2d135e958bb5a0c2c6685dccf5cefc5158cc,7a2aa1824129667a3265bfeb87fbae5f9bbdc27b23f740b334ff17f102dc14d8,1c86e49968d526cabf72dd927809843f2dc69032ff2848bac78f56f6aed15634 -a34825f0084e22d6f1af1e59dda468b224af44b61a1a7d676cf0f5b6e1d1084e,1501080130c2024a80c180880076a06000000060081006001004008200092000,0000002000000000001000000001000000000000004000000000000000000000,278d8a81a59a1a4c72b59b33adbf140401239a5c1e7afbd46b31c913bdc6beb9,599d64dee9ed6d76f3f2ad2b3a720c941e122c69bb1f89736471a45bf34cb1d4 -080040800910024010001600608020000502480288904a12400285800c000600,6773bfe7fedefdfdbe6dffef6ffeffd75fdffcf7ebfb3e6bdffbfdf9efa7f7ef,d63e5d9c21d4c5a9cd0abc65e63a2b1e5abda34ee981fe07c52bf648cdba5699,d4019db24f7896c7152e90091f10ba5f125ae5056b517485e6d67eb7fcb21022,7368d2ac9ae319b0bbbfbc72891a4a5184f3081cc7322b363f6dd2cb5ef35440 -1fffadc3bca48d01226ae36a0544fccd652d42ed8523819ed4b873f4062c4366,220829833108000009150c60014800550008004000012098020058a0144a8201,0e0281222a0110008014204a0006008443291000c42040002050000080218002,21dcee15ce5204eac49ed83638986b51d21943ab91fb28638d8396719291e0c3,1d7086215118d7668935e211929312160af0ca7bea7ff8c647565328e58f3ad2 -0620c4004400020444221900087545020000e1200a8029841821000850c02010,0000002000400000008200002000200000008400000002000000000040000000,777e24fffff9cffe5a7dfbddfbef3bb7e7bffffeffbfff3f9fe7d7fff7fa0cea,680fbf09946dc43a6aedb12c245a4e90c2e788a3e2ef8c75abe965566341503f,17c3f728a4d8c74c11890622e2daed44d83380b036170f90bce28917ae18c9a8 -57b14ebac37d2baa54938ffee9dfcbd69c7bb96c12f2f2b3b7d76d02f605c6b5,bf2fb9bc7be33ed6c87fbfff7d1e2ff7f7fbfbdd78f1a6fbff7ffcffbcb5bfff,ffffffffffffffffffffffffffffffeefbfeffffffefbfffffffffdfb7fffdff,b983960721d337b869209af52bf1b626ea3da1351aae3ff0b28f465c58e267c8,5361f7121679aa18ad52df07b73a567ca24fc5599ccd68a611e3c4df8f011f36 -e5bff54bff7ebd6ffdef7df7fadfdfffee3fddffbfffdfa3f6f5eed637f377ff,0000000084002000000000000480000010008000220000000080000000000000,f779f7fef9d95fbbfbe5dfbfffaf5dc7f8f7fff9a07f3ef7ffff3dd7f97ff67f,5a102dabdfb7a4481c5fc541f4ae5048419027a85928d2d2fe73cd35639ffb18,7abf5471517859c9444d71cfaca2f816b90e48513a957aa8f4e2bd7d7371cdff -1da9b189c0618431028a3db83a4b5863e0099c9c2ac355893f7d37c814ba8e7a,f80b535c4b0518368c2b1ee8688b5c05b4ccf880d04c8fde6dad78b08f0ffb1e,fedfcfffeddf6f2adffedffbff7feeefdeb7fdfeeffb97c65efed7febbffcbf7,567d2fd26a761ce17edd698fe8e737ecb5fe04ee6cffeb4da2117bbe14d9ce4b,4ec87ba466219983c7d555b612fbdb5c9776bc16429e9dda2e9f678d6bab8c15 -97ed3f9816e62e72dc51ea26a841e5811ba754b3ef0887f949fcc132f92d86ae,ce41ef1939b09545f777498823caaeb96f43553f30e44fae6a9276be4e3c7e7a,f52b9e7dc0d8988d78ac27f5ad26c8237c05a44ae7d0ec9b34e89a50199b05a9,b363d83db9c668a129ed7dbe69d5fd723d7381077ac6edaf633002ddc6343f36,768b18d72119e65bbc066b880f8be08a461cde21adc7db854ff2de31ad345011 -72e11856bc8ac3d2b931065087fcdadca4b6714e1092a863df6c2f09556c9b0f,230040005320486280008c111042800142405098a0004081200011188901a44e,102020048148841120044148101040008b083c81800800811400a00500160154,595a49facd7eecf8f966852c22a0f51928696ffb907be8378201fe382c867d27,6c0932ebeda51d11cc04e340b6b5748b5ed6b74306c82ba8daf4d438070fb9c7 -093b02d9e8e778d2876e41c321135388fd3617f1a8dd99f5bbcc928ae3ef4d4c,7efff7f9cf6fdcff6e76bf77cfff9eebfffdf5d53e37ffafbebfbfefffb7ffcf,860020640410012000002465400025c40200808018d0000000416c80ea048830,afa809a96a82defc5508da355aaef0c8f60ea4b9cdb7549ffe87ce348c89aa25,2b217bf7c177d209e0102e29abcdf0ce1a65e28b317762a8031a2e4e90f47a06 -fefddedfff94bedfe7dbfbedffbeffdbfffffbcefffffffffff873ef3fff7b31,bb39ddf7fffbd0def7fbe37db7bffedffffffbf14eb6f5e98affffdcff4c1739,aa2ccad620037b769fa7218629fa1db139e920bece633cef71ade76b5bafc4d3,a15c5d12a97cb3eafe627987e1076753fefc8ab268b0cea49ee78895ed60976f,53fa2f93073190d22b71b634fb972ee73f2bcad25c90fb43bdb1b94f03cb9e63 -bafff97bffdef9d17ffffdffff1bf5d55fdf7ef7cfd9cdcf6eaeddffeffcafff,9e795e585d977abf2bf30d6393050772f4748ac5bbded21628d413c9b18d9409,010010a000000100000010000000000000200000000008000000000000000000,cdbe5fa3aba77657300d12c9132c128170de3df7f558270d52b0f2cdfd30dcd4,3037d14f7291704d2727ac279976068797b4268eea502cf008d39de7be4ba5f8 -65f3181fa465545d8604cf916ee8c1e904bf0641a6abac0fc4c8ea2a36fcbc28,fdfdfedfff3f7b7efbffefbfdffeedf7bfff7b7ff7eff7fdcdefeffe3ef1fffe,202404e0482001448051050840a022024206004082d00006202080412451051e,bccb4d3c61fcfe698be3d7512959f6def1b2708cfef2d2e475fa31a8747beb80,3611c8ffb9aad725e95e48ce98d412004197774c2ac48bc331b8ebd1069cc177 -eafcf6750f9b043c6a3dc029d4fbc817c24beaf7da277fcda1eca5dda11bebf3,75926910978aadcd034b15298e8faf70cc243d711a69a4647b55bbd48444139f,1572ca8a8d40ed7d6f5e4069871fa7e24f1002cc9a84cf84e303b1266058bc15,18f2e81f0216a0f15d8070d81685970195eb0d922dccd3f52e9a2640bb625a88,1ecb6a62ee41c6bcde1cdd5954dfb6926f3f33d620ac2ac3a2dc41bc101366aa -0800000000000000010000000100000000200000002000200000020000000000,7ffe6ffffff7f75f5e2effb9defe57df3ddaef77e7fffdbfbddbdf7bfdd7faff,7bf5f1f2fb7bfffffdd3ecbf7fefccfdf56bf77ffbfdbefeffebeffcb77be557,145e1dd1a080cb06ed05d28326075683101a5b4993bd38c6fabf66b70525cf2e,0cbbbc5410c525031dad8c25b28bad1e04ba1bb58b6531c0297b6207757c3acb -dfb7fff9fabdfaff3dff7ffffdffbffffdfeb3ff7e5f79dffff6af9ff7dfcf59,cf3f4ea22099c1588a2f48075db2a39db27a6c2a943671ddda6b78a9e4f1dfb6,d7fdbffdf7bf7fddb1fde5ff7f4bfbff5fdfbffef7fcfefdff7cffef7ebf87ff,904ed68bc2cc9648db6a09e6a224fdf4c0d058485f5603d071d012bd8ccfa4ce,61ac2cb7157fb39a8b69457382684cf299568234780a80d733ccab72014183c7 -47d178318239c438d0dd3b2039983b01170829348bf742cfb04e2e56f2791c5c,ae777fff8fbdffdffffbfa3c7ff9fe7f2fdf3bfef7fcfddfb1873f5b5da9fef9,76e7dfed36ff33dbffffde3ef3eacfff67ce9ffdf6e9defadfe37df6ff7febff,6bf88d305acf4b44651478c10552b6b681fb8613f891a76452402ef5cacf68a8,0ace2d1a567a66c1fd8b13e79d393d1508a79c234b2069304a3377bd8340607e -000c400030001a28500104000209001c805010048204418ec00920429c009001,3d1b6ff61558f100df61d063213b857547e30656fd52be153b7c3f25c544f1e7,fe7fbfdbff7fdbf73baf6fbfbebfff5ebfffd9f7ffbe79bfbdfdfefcffbff7aa,542c85c8edf70f4e783a11b16d2a4b698af6826d69e0d4d2dd32da9ab014fc29,7c70c3b9863a9d261083e5cf305b24827bba168c8d2d291c53c701b9d408579a -0400003980c20144805dc10c200d111425800101000200820103010b8004ca15,fef39fff7ff6addadfddfeffffbfbfff7fbefefcffdb7fe7ebbcf1bef7cb2f7d,4fe7edffffefff7fdffbfbffbfffbfd7afe7dfaffe3fcdfffd7a7be7fefefffd,412773de5fad4415a26dd9dc8c5d66790dd3c683ea6f916acffdea82bcd37e37,36bd30333822885aba3b7ff3ceef34f5c0970e80c03148308b4f492309def316 -0000000000000000420008000000000400000000000000000000000000000000,94111285086101300802d140610241222205200022899710100200a804319404,ff67007c199c20fcbc2ad2a1862e2d9061985238f0aa49599fb59a8d8c3e792d,09924a00375c7de2b40383df641c51cb237cc6a69a0860268cd28e2707dfb98d,3d98f9dbbd15bc671f208839c26bce49a1d16911b2d3859ca826010883dc0d96 -9fe57fdffef2febffbecff8fcfbc14efbfedbeffc77fffe777db3f3ffff73fff,07400400640302002000bc0030000c08390328040425c28822c138dc21856a10,8044894a1c8d970011ad0449c9706929159a7a251502ddccd90368c4e008e535,278a5a58ff6222e4ccec7ea91c8854063d16c17b22884aa8dcd3762d481bc8d8,6bd5a89baa140d962c02578d2b28b9ea92a34910d741a93cc3e8c14e1e5465e0 -8158108a20000800a84230290e08404200400000890840625550014011801000,a6950f260d0f72a6fee9e833583ecad2272a2947f6eef6d510db09abd539c235,dae33fff7e9afffbffdfaf57ddfce7dfedfdfff8ffeffff7dfbdff3fd8be37ff,1a1a8bcd1e7fa3a5e5cc65e0eaf6a10243f5375a1faa89415eb051279907d89d,2c8867e79959e2abdde15e89473bc49fa3258d1d62f9c009f93588fea1dc0668 -fffffbfbfffbbffffbffffffbffff7dffffffffffffefffffffffffffff5ffff,cf65f223e954d70068bf51f948f865cc6571dfadf690967db52f18f38e6c26af,f75e4f65ff7f7f6ffdf4df77f8beffbbff7b67fdfb7bfffe5bf9edfb7b7efad4,d63186efbea1cbd18e5177018cf8f954a9f98e4a120cb7cd6d110f22e123b63a,42b148e278ab5c2159eb0c8b96ee4b562000e38ddbb1562bb5038c1e491e100c -755656f6c81a40dc76915d89967a813da4c9c46446a90af1022cdf5732ff1708,abff3dfffffdefbffeb57d9b6ffefd9efeffbffff7d37fdefef7f4fbf7f9fffa,66d8927731358c43c7d215ec8294942595b7b0da341b055c8dac914761309c05,0e98af3fafd1a23a8448e9eca2fc09760047378e69fbf68d370f8b3194aca61e,5aa4539d49205c430f9f16156fcb851bb1105de68ec44aae99fe1548d45fc2e3 -0040000000000000000408000001000000010002000000040020208000000000,fd34fbfbffff3fdefefedeff7fbfdfbb3f7ad5defbff7f7cfbeb7fff6edfffdf,58ddd8242e8de78d4009b2a63d9bccfdbcfbe728e382780e2ef5d2584ee2dd8b,506f93da1a9383cb2a2c328c40fb2fc86a656b715057442a350331c56101113c,672ba0f6d62e4743cd89197e8663e13488547ae5628c5a83423a87bb94beb82e -a504ad91e8346201f4151111d8888c22ae62e1ab9016f41b8e52e651b6b363c9,df5bb67fffecff9f6fef7e7dee9def775dffbffd2ffd53fbf77efebbcef9eb97,ef5e965dffbf7af6fff46dbffc7dfffef4dfffffdff1dffefdeefffb87ff9f5f,f684d6f4be0430086a46ffab4917ce450f74f795ce2ca9ff1ab1f0719ccac34a,5bdc069a1cddcf1a8e077e3e1c4400fa40ab7a7cd3de09c079f1e2ae09f6a81c -6175fe3b882a07388e2af94eb1ff1035a61e5ec28e4abb663571dcbaea6ac740,0000006000000001000400000000000080008000000000020000000001000000,f7ffffffffffffffbffffffbfffffffffbfffffffffefffffffffffffffddfff,93fac632ec2797a9235e1782f047ff5add23510c892a492ee78cf19f989ac3c0,03b9dbc188e248ec485c79f525f9cb3a17dd4bf556b4d58d37ecd4d9cfb2f6fa -7d5ddfbffefbeaffefeb5cf7df6ee78fdfffcf9de2aefff7bf6ffffbc4ffeb5f,02200090a60000009d10424431020204084080580404214001c01410c0540021,10802890095280200800004040c0048020280500281482270004216108602806,5205e626f280b317a0f09716793fdaf18bca18cf37f0f73764d89f77e4418dcb,069f86a1d5bf0c6a49e6a9e10fedcf4b765d28b6862362c3d39ae62e435eb84a -f7ab47b68a4f8988da1b141b726ab36bc584a36a08b98e9ec1bf6416e9c7c12a,a040d37d95e81c90299da29b69e1eb308cedfa54b21a33ab0b6046743fb436d3,844100c538044811010a02802022051900410010442a08000040aa0182480480,88fb4fb0b3ed67b7bbb73cb44e1566e5d14ed6c8fbccf57a056697a37d791558,0d880777b6883774c26c5b002aea34c26a88467cef741cc5b0ee0922cfe7c45e -bcac8ee03dcd6ab79a9f149c8697e32ec6171e41d850a0c11516b714dc391fe9,bbf7fdfff79fffbfbbdfed3effdffbffbf5fffffff3bbff7fec5a77fd77f7fff,a75466de52972bf35a6a30288016bfd121d4496f0aedac17fa70c3567aa9adda,b18752a7e75f7b18573a5a8c058b1f5e8335c1c974711d5fc65299bb69577b40,1e6c27fc63379121e55326e47c6bdf93511cca7aee9b86f6a4f408a866587777 -6dd1534b3796067d33321b324d9b218215f9006f7bbc80051070efd156200dd4,02332500200ec4054008422c080090428308000005040409e000001100c80810,04c8820201400a00240000a00510610000015140804811884405120000885008,4cd3113e1966e383c545a093c7519df0f9e39694327048b9a802e11243ba2263,039e4ba21cfcdbebd7eebb75d89d07c4c3d85dade9ef233abb5371c3f66f69f3 -fffffffffffefaffffffffffffffffffffffff7fffffffffffffffffffffffbf,fffff7dffffbdfffffffffffffffffefffffffffffffffffffffbffffffbfff7,0000100008000000000000020000000000000400000000000000024000006000,d1faf36145d23e3d9d7bb9a99dc38e823fe796c7a88fd6a518ec57fdd1ba41c0,2e5b1767e0e0ea0965a19eca1688b991a146694e298423822ee5ce65c3f6bf7b -601f792926bfde9044216942c42b04ff874c52cc68a809b2822ded6a02ae3ca5,c4c01401431209881825042a0024122041040828000013179440918202224500,97a0404030a028024ac92a01120248010110400280a000812880344288003020,c4bef900c87f3731d63b70fdb5ea0c84560ded23aebe1fd98d92900ec23fa1ab,701c1f99d0d2c189e9cd2b011c16830597aa377345f389b30171d5c65dc202b4 -2000418d0000010890248422008031421c800985088884a201010100002731a1,ff5dfffeeffbfe7b37ffdefbfefafb6a3dd7cdfe9debeff7ff753fffff4ffebe,0000000080400000000000000000001400000000000000000000c00800000800,8ab8e407e93cf686e5ddfa0f171b0869ca37e9a65c5a8a6db120177f3d7279fe,6d74e26d5e5160234564a80f87d4646f76ffef2d481ed20721169345e54c1c81 -d277b630e4927ea39e204a195ad34c7873ed5a9a49140b9f7da3c87e6df83080,17a7cf2c5c4ffe2ad879063105a06983fca57d86a63260414e0643f5b96de8fd,8006ff7ba3ff833731b8c5fbf8477d47eb671a8fbce8399ae356b89dfb8f98a8,6753085e214122ba58edf53b73541d06b62c4f52803afac4fb104ab03cd20245,3199307c33cbdb385c3adf2c6349002bd72537dc358a0acdde0b66fe51490d52 -94402020081710c001c2001906040246a098020c12104300c001c10090c22002,00cc040138000080226080042080108c52000180024040020101006022090950,ffffffffdffffffffffffffffffffffff7fffbffffffffffffffffefffffffff,8e6f959696d3de788d9dd24e4ad39a002e024746ac611765db5ffe3878011dc6,17e623f5624d4119033d3290d02a11ae53d7b7d43f8bf4cfcc2dd7b23ea46fc9 -fff9dfebedff8f7b7ff73ffffff7fe977affdbdbbffeebafffdfefdb9ffb9bf5,0000000000000000000000000001021201000000000000008000000000000000,304801204903aaa8128a81101080420130285250001440580100200028110a00,b3b28a63b30d17aaaad4c8b256535dc8acb0e1fb32a829872df821c64e27d95a,73a570684646a2f3d6a2266f7d5d9aaaee04682933a38d80f59776cbab3b4ea9 -bd6efdfef2f7dc767f77ff7ff5f7f79fffdeffffbffbffdfd7e7dd83bd3ff9ef,527f0fede5ed4e115bedd5ff10cc89b22f7f417f8852e8af907789695b470ab2,38c5f347e99d3f05b42314466fa38f890b7dca2e17536bbb001d6665fa43322b,90ecfe0689f2efa3e1676baf88a644594bf77a27255aa0d66030e3339a93b88f,4dc2e8120726e07dde0cd1efc48f438a731f6d53d3eefb97c807df636e0d27ec -2c4a4583af78a9227899e632fac6e7252162a16414e7008ffb15cf80ba3d11f8,3d07d72b9b4d3f0a28900118018e40825c036d55a9d44d6641fdc79bb8dde8e4,c05b92f0d90b9731670b8e30eb750022bec7f6f49873ec0d5556fe24f991ac0a,99ec05bb753ec9ab72461a6b9163d422238439b9d18062850bc90fc23c54b565,63748346ea7e02b3665ae51c401b50c00c9670040bd729ffae7c0be1c7fd7a18 -f9ee6fffffffafdf77dfffff9fb7d533ffedffdfff9f7d77dffe7fbd7b73dfbf,0002044110408080a408000180043a012c000812382000904900808108000aa4,0c25b0d9f777c459619093bb5291a5e2edc9a48c07a6adc190dd75254b3a3e2e,a64e9f0719507a8b88e1492666300598bb455a9c32ef9a57c16074d6ffcaeac7,000015b9c3efbb6dd6c4ca2e93a3f2d5d4e1316609916c4427e50e19e47ba168 -1000000000000008000000000000000002000000000000000000001200001000,0000001001010000000000000200000000000000004040000000000000000000,88038000208a00208082810052b100000402322860a110312101300440202304,9b6e8747be39376a46f248e830d007f4fb6f31f10dd62bc61d9a585a358e0a42,0ce31f71afe8c495f1d7cce79fa2772679f81c1e76e3bd1179220643d5d27b8d -60020064000a003002ac860020004c2828c40043a8810300020460220a244600,c7ff9fabf3fefafb3ffffb37f9bff7faffffffffffffdfe7b7ff7eafbdff7b4f,101010308102321120010140100c810080900340400500c00006402820404052,59f94415c3ca83d4e58ad7a7000dc967d790d2034bc2f87db614a555ed61f797,176f104b887a81db00e721cf16abaa69e80c02a3188ccc4ccb9429b8a4664845 -6183084004408000000c001c320140c21108824004104e0010508950d8001010,4d691b4d010c5a0a129577cf0c6dc3d84b61f9dff45c566800fa02bdcd5bad25,806488020041088000a71628000410211508a0a410e811c25003160018004400,d1ea761d7733c279398feb5bef5c4e5c7f43335990fa4562b5a1e35f64c1d0ea,049cae26a16c625cc535608fdf8c33d7b87e633f16e065a2ba6e6bffa17939b2 -ffff7fff7fffffffbfffffffffffbfffffefbfffdffffffdfbfffffffffdfff7,1acddba9c7993cd0208468c2d846d2288318fb8ae61739f04293a3307623d888,f5bfd7aff75f4d7ffa7f7fbf7cfdd9fd7a6fd139d7b3cddfbebdfbf74efefaf3,f231d93c78e2b0441adb70c5cc180e14da7fdf0d906871df7fa334aec32a2d80,745f324a038919324ed40897e8c599d5284f0afe96fe6ea73d89aac3bd3d5c33 -002000008001000002000002000000000001000c000000000000000004000000,5f67bbfedc7effefd9fcabe837e7fcfffffe777f9eff77dcff7fffff18fe7fef,fffd3fff9fff3bdbf7bf5f7ffbff7fbf665f75fb2fdcfffeffe9ff27c7bef2fd,ad4cf7fcd7f5da9cafe82723007ddfb6f786037e902eb091defac3a9a437bc46,1bf59825ac9b056e8ebcd89a2ee4a4575b5f6d5a6634920f4165210c17f02ed6 -034fe0d9afc4af600f40a4d9cb91c7244e95d2c37e16491106c1b0944cd9456f,f6dfffedf3dfbd5ce7f7dbffbfaef67b73efff6770fa9ffbb68ffcd1fbdeec5d,d1134a8033008486410280413900024024520154a01000080014500014204041,b3f7b4fe3c0565cb939064869a6f795b5fb5683ad50c9031c2a162533e64b6e7,512fa4e4e06f5600382888ced12836ec0a905e2651321dda7e7e6c5db37503d5 -b80402880000412b00d001028031802180c00017c000a01100a05405000311c0,0a01041115020000486440020802005000101710800206028280488016494022,c038200140280a200ae00024000010800214040006002049104040a1b2900132,1baaef8903eaa118102f9ad81f765f366909d5726d077d2590a62c741b30cc13,030a1b7b7136492c5995e5393112a2e3a487ed1825a06d98af296e38630a8c90 -9bd912564987f650e31b39f1e59280ab4ff45a71fc8c1cb0352678cf9837b1f1,bceb33dbb66408f874110eba2f1a8ca277cd0d75287ccc03274a2c7ba4e35c6d,6a80ea917780ffe5d8c17e3ff25dbe7a28e8b112f344d01368f05a86559b707e,ce6485e5074f309351390c6efeb7882d9cac8da10827d6ad21be59116fd551a4,089249c351e834cccb3345a68990576d6e23e7ccd475bbf8bcf3809d8d3a8859 -0c0280220020102040014102092938c40004000502018100001468c400100028,f5feacfdfbdfbbfd7afffbfeeaf77edefdfab5fcee5dfeff7d3fbbfb7fff6373,2032089c002d24500ec2c85002924102a01020c9c8121012001068140128400c,79cab046af353b54ed5f6ccb816018b16bafa5011e33a5af95e2f5074dc40c40,13401f307b4a82c5c7de656f495111d1f9b22e3c66d962ce33f002d41e7910b3 -eec71aceb8ccab885b579c7996b29ab71b730377487c809d76df99ceb718edda,20480042016144e0a90560001040020000e20d2200402800040841029070430b,0011084400a84000522681d80442208800005011e1000082820825911204e804,603de5262c4d70c1f6d92ff3ce2bd6e11a12d4f81e46acfed4a97545aa973f1b,0e7342dc85312f6dc152085138aa5a410480098de0a4a1110fd2587a6256b044 -f3ff7dd77fefffe7ff74ee6bffdeb6dfda79fdfffbf7fb3f7fff5fff7f7b7ff8,ce7372b3790031f2758f1102dd2967d5e48fba7ef79cee8797528f27c33063bf,a4f5553555910a1f4212bfd18615d8c20e4558151c0873c05c68f64a6808b0ec,90fdf555fd986fd2038d23d79adacf331261d1ddecbb73aff3ee9dbcff193987,3e10ddd1632cc8d7511ec87ee04d588c57f9d1541995a4305ba09e8d6ebf89af -e66820e0cb68c336dd51dd7d412c6990fdd29230ae59d89a99b97d192b14bc89,bf5f55effbecdff26f9bbfbfffff1cfffffffdffeff7e5ffcebffa8b79517faf,e68404846b145000408c014003100100819412200e8002e025000000c4140080,7255ae91a5227bfb2dce25852612e24666c7573d6e609a7c86178630cfdaf38c,505e71b12b5a271deb3e034524d0ed8790b51dca0de2e109709abc06314decce -a3f2e2a4fb346b977aacca18bba87826a188ad5fdf1ea06ac067ead5a63ccee3,e50fb92bcb04103e6f9d97ec1f797c58e676f6879b42bb4e0738f493efdec692,e64e645bb969fff3651eab7fd2042af846eda70f98c6913348a650cecc96604d,ccbde4d2b00be8a2e6572a9ec89629a3119ae3e592d861e763ca541285d48f61,63fe2ac847d51de6da8f3de7f2e04ba60c0fb649c0df7c67e8b23b8999f914ac -002200040091f004409c1100202690300040401400081010005090020d408017,34847f6ed58df4ee3abea372b445ad8447365daaadc8e11edabf548a73beabb7,24a9909c00008005c20069c00019000b00004004400010049300000208002280,f6afdddb44757857b97114d8730d8b242bae22b9620e802da4e38577b24bfae4,29f3c29a4e7129d611f535f1c44f2e0a0d5e11cf162faadf4a205efa69128e1e -f9bdd88fb92d216d801f5f201bd563fb661f04f087d0f778dd5951ef6bc4ff04,901101150b171012a004814008721413040082008100085e02c49120904a40b0,812010014004600100e589289020022890302d58001a212000044022c801861a,bf910dd8e0d39075a5423c0a7c5c119490fb7d080b818ad1831eef736c5cb4c8,50d853e50e0698a8f9ecb91d2d8b1bfe79ec16e2072b8ba58e11cfd855278bca -2809184201a702080000501010808c0000005002221c106085a4e1aac5022068,4e57829891eca027bf1b90b9eed03bfb8a628573fe110e7f3491d0129f516b07,bcfffb7f14efdf6bfffff737dfeff6fef3fd5fdfffebfff7feff3b97e5bf7f3b,b6206ebecf53971107b12e97deb50c2a16aec7e79be3477998e658543de7f9ac,001b8cddacbe49ab98e838e64dea54340b686351211dd45715f2a56ee8e71d85 -bcbfffafac3fc2ffbfbe5ffcf7ff7d6ff9fbfafbef3f75ff7ebeef35fffffeff,601841068078070d0040094080801c000100089090c2005810088000a0880000,7731f9ce1b1f1d042e4093d3b98c10fb8142e76e93aa329d30f48fe441d5a2e5,0ecab22274dab41a6ff9437257d45bd339e400c820224c0cea3c148f6a22d332,13024b7a37c825c07ecdde92dbb7984f7bcc34d3c2bc41b2ba4070b94bebe6b1 -fbcff7feeb7fbcefbfcf5fe9feb6faf97fdff7d9ff7e3bd5effb7dd7ffef7cdf,a1822c7d328651f4156ced92ff5076fc4819f10b3887828348ae062c8aab6245,4bd18802c55b4d1aeb1ca4364c62282d61d45ec1297fb1f316d1bd4f87be3715,40613a449d04b822e1b2682597163a09ed7eb1c25f2c68219e0bde7d7c3d4234,116d606c3f63b120c26e3f31d51ebba2dfa72e7800bb612ce2ddcaca6ada4938 -de0872a7522d08aa1b01d5c046b74463ae69cf0afd2e92a91401aaee37c78029,dc1caa863be64cce40069787379b02efcee84c0643e953c9b23474c7b1e7d466,ffffffdffffffeffffffffffffdfffffffffffffffffffffffffffffffffffff,9cfc895bcab7774bbb5dec80b273ef60327468edf40b4d95760e8dc515d2d4a6,7f1bb7eff9669b0e994811c0bd7196135c4bf0b2e09e95cc39fed071a5241734 -d84bcaedbe9d97fa80b7095781398780fba1b269bc89dc500a0dc8c7bb48cc22,100012f051d04014624c80430e101000882000202010440000880404150010a6,0000000000000000000000000080120040400000000000000001080000000000,5e0563db9176a9879f20182b2f4d868b3862d731104cf7b5920ae51c9a3a9980,1e362110b53b6617b11f111712958b6c7f1f2f500dc1112ce95c7e69cf089679 -8d97270b1f9d7f0df4cecc0fff292377aecbc1ebaa796b6d75dc247e3bb35c50,340b0204101008512a088810c08001c80400052804c604c4120909204192a002,feffffffe7e76ffbf7a5ffeecfff5f7dbedfdfbfe776ffbffffffdfdf77dfdfa,10fee66929e859918152ae95f231a4868f4b35034b197324cc747eb72ea338e9,4ed4adcefcf9a150832cd05b54923f4bd773192c5cd5f7669c746276870222dc -fdefcbc6d3e2deb7fbf8b3ffdfddf6d7f97bf4f2fefefeff3edcf5fbef7fbeff,effefff94ff97becfeebfdf5ffaafefefffd9f8ccd4ffdfdf1faeffb779dfd6b,fbdf6f7bffe7dbfefc9e717bedbeddeff7fd5f37d4fd7dcfbeffff9ffefeefff,8f6b3d3ac8ef6624b53b1d3dd9c07d1db94b0f48c7c434c0754b02ddef1cc6c4,6d4198e37ff7b5f3f89ededcf5d77198ca21a51d08c055361fa0b75a77d7cd4f -bfeeffffdef7ce66f8f77bbbbffdfffffcefe9dafffe7dfefffef1fb6bd775f7,eefffb3fd1fffabffffffbf6fdfd6fffbfaffffff529fdbefffbb5f9efadeafb,675c7bfeed3ccff2ffad6fffff7fefdffb7ef1bff97f77fbffdf7f3d7fbb4db5,dac4fc511c7050d73950ce3b3aff95c0f695653fd348ddd599abce519db71291,161b668fc52ee13e0460d830f2b1451699d7fce4fcfdf8fd029ab7973d6bce36 -ffffffffdfff7fffff7ffffffffffeffbffffffffeffff7ffffffcffffffffff,7bfa7d6afffe9fbdffbfff5bcfffeb1ff9fd8f6febffc6f7edbdee5a5dfff9bf,3104a0040000004d24201158202b0841042268208674214e8683828020449844,d3204513b1c46eb4e45dca12a52b62a99683131007b73a4a9b1c240ab83661e8,3a386544740ba0e7935d690e27a51d82efc7fe230cfcf57ffbc567ce39253ab4 -bfffd7d7df4fffffffe99fef7bff9b7f6f6fffeefbbf3557daef2febf1bfffff,002006046402c02000880b10a40840080045400b924241090400706885000208,0403600c00014060800808254080001004034100050888202044024c80000810,da7e6c26fcee30dd60a0bdfc5653b56b56b1fe177cf6f8d58596b3f580e8ce5b,77ba06622463b61b400e96d86537ae785dc84a32b03af28cf05cd0c95c40be99 -e7965bbf15394036d427f43e826b8555e8889f21e49b820a004ae271c811ed83,fbfffdfba97eddefceeffdefdbfffbf67f7defffbff7fefbfbb65ffab7ff5ebe,002bfe275a4ad4f7c65241bd64fe8f73160fa672340b7f8849ba98575f2e7db4,83aa4f33f190e791004e0376a51ba9bec19d55b36833f133f64560b5a23fcaf4,5a481c4ba2141bea005ea35ed0536e25c473328d02a056a66ffa8aed83256f8c -f7f9bffb6dd9bedbbbfff573f6ed9fdddffffbb7b7fdbffe7df7ff7fded7ff75,c7c81d083cb2cc66e58c1eb63eefe01fd5e26e13b6402bcca61a4594b8a6e933,0053800c00c862000604001084002109000212a0460900465240442108a10814,332a3af0bb95f17e6c8309b023881977498498615a034ca058df4069655e7f10,4e922facde6a1fea107c4c9b8c472a1bc1bd004b07c74c8ba2926423403469d3 -500288831241210268c040000800100802a520180d2120a5a10d008a61020510,345149fd94942a5c53cfd98d96b979002b667d3f63a1c6f979861dba0a39572b,df53c9ffbf5eb7f7577fc9c4e7df7b8ffff7dfffa77dbdb5f2efa5bfbf7febdf,90d202225bd1bbdea8568e8736069ebb24e02624c693994a08e4c7e5a6bd955c,5037550a4d592101550afe0028c9be2780ec97e02dfe76a0d1d7c307d41f7c79 -f7affbbf758cffb7deeeffeffe1f7f6fcf7beef5777fffdb5ffdfddbfaf3fbbb,00180c00402000400a0000c0108001600012104910149050041002021000804a,fbb7cdf90cd54807cdab49f3a6ba9eb7ca733e4ec1f0ad839617c89231b4113c,289c1e4aa4edba10853a0217eb6e5403599d42dbedf23d6fd9a3aa148c6c2fa6,3990eb51c068bdfb9e2bdb7d7f18d909a368791a19d1a3868974a45233e222d6 -34ad4aa44c8d2e66e75f943c9183eb77f32ff787c6f5de8513dbd0a98ba9e226,0000400000000002000200000000000000000000000008000000000080000000,7dcff7fff0fbfeef8edf9fbc7fd7efbca7f7ffdfedceb3d8fffbf7bdfffff9ff,5d8a7426697f2b06fda5600df922f0c3a445db85a4c60c4dcdc98182c404dc1f,3ed3b08a7c5c11b7ac86e55b448ff3cfee46e5c65d4119769c80a9d6021b018a -fff9ffebfbdcfefffb9f36fbedb6fcffd375fdafbcdf7f2bf7edbdffbffdffe9,c41229ef4559a25e37e404201b67e7402a5ccf3581c30bceb1df95dee5b03561,0c08020151400a00100411036008016000800040181005074001000600104000,37ae61dc3c36cfc83bc849cf773b10e44bde1a060b24f6e3580bfad58cb1df1d,0926d0073bb417f1bef8fac1d84ade38884b0606b403d6ed876d32189b521cfb -3fbefdfb95f7c7fff3eef9ebdf7ffdb6e7bb7bc8fefffdded977ef4f57d3ff6e,dffff7ff766f7f77fffffddcbfffffb7dffefe3f6bddfbe5effffff7effb9ff9,ffefdbfdfdfe1bfe6ffbfefbdedfb195fdbfdbcec7d7ffefd71e7dd749bfdef7,a64d37cad643855926ec937bb49fb3cffa9cd2c2c4097c01eb3f62dc4976cfe9,0618cc973706f9722128e4b80eb9bbcf6be714595cb56ee338a03947938e40eb -fbfffffff7fffffffffffefffffffeef7fdfffffffffffffffffffffffffffff,006982b0022100800218410500142668c00094000010412261c01800c848140a,66d00192503933e68db9306d09b994da3d0e68ba3bbf90311968845adba9a4c4,6fff5e59f2554e46ed97a60f0ac22883dea04852de0108e7cde112246bbef68d,521e69efa1de7d70f428208634e3c9160d29ac9a04c831f263bf669a6a02e633 -cffff77ffbbdebefe7d5ffcba77fbfe7e5dedf6fddffef3f3dfbbfbeffefe7ff,f7fd7fdf3ff8dfbaffebfffb7dbf7e0ff9fff53fadfffebfbffffbf5edff7bf9,832ad2636f3b818a4c0b97e2333a04db26b3873698d0e4fd8a001464cf36f400,43d9d14cfcd48411f494a105fa2d703bee3cd0622c21ba0edaec1b32791e0399,44db5abfc108d0edff514536f7d495c6f0cba335d52b6622e32dcb0beda95870 -ffffffffffffdffffffe7ffffffefdffffff7fffffffffffffefffffffffffff,77bffaffa7fbfb7feffbfcfff27ffefdf27ff7fefffef7bdfd3fcf6fd5affe7f,8946fb79edb11d2d41ce4ea35d0cbbe451482e99c7062f952bf79dac9f68fa9d,6e8fdb66f5b77669c91fb15503c54122ac07f7e4bf891ca3bb5f049f324244ef,3f0a9f82324aafcabdc1fc0be965d6cad4642290f0cefe666e4d26ea966f8a6d -ddcf9c52abf25005d74ad34a9740079c39a9ffb470b21ca591e8e8febf32a66f,ffffefffff7ffffffffffffffffffffeffffffff7fffffffff77fffffff6ffff,d7f57f2cb7fafda7dffb9ebffdefb5fff766fc7bf7f7ddfeda6ffffffaf7f4db,5ebdc082822e27718da19e53e13cfd72d98d13558d5de34867403161d89e6f62,78056fd5fc1879f95f234dca7fd1e46393df361505f6764bb5a55362f905c068 -ffe77fff7bffef7e5ef7fedf4ffdfefaf35f9eb7dbf7fdff9fbfcedf6ffde7eb,ebbfff4fbdfffbf6f5f7fff367f7fe8f79fffdffdfbb57ff3fbbbffbfadfffff,010004000080200200090020d94202800044cc80940001004411010402006000,06a0766ac9e80d3d7d878edbb0e537596a36fc727b6944c9b80d62d787638ce3,4a9c10d59e0ad28ba68de76dc79e3410ac3c95a53fde6b14228419bced5677fe -ceef6eb6ffaffff7f6bb7ffefe7fe7e7fdfe57ab7feeb2fd63ffb97efe7f7bef,0041400038c8864061205000281902b306008bc21000620040008001009800e0,299cc2b5d4fd26489b962ec557df18062e4c47f34f7cd1804ea6c509c6135523,2d9c45b1a52dde5f7cf61bc276656854108037c30e4b6240f4cff9dabad1064f,02d0daded9ad716ae8616c59090f2516912e339018e83b570063849ad6b862da -f7fbfcacfbbefffe9d977a7fefbfdefdf19bfefbfb7eff77d7ffbf6feff7d7dd,000002000a000002004000000202000000202000020000000000000002000000,8021088104000400000040a4d00729219008104008600801080200c800805800,cb9389590ad2227fc703b2e3094c5e2c3c2f5758520583d958d4551a72272bb4,4a0ec2fa665a3923ef764939b58b8c32b2bea313c375935dcc17c80e4d5e6e13 -5240010880180a48b07003ea2030280404206009200004808124004288810810,081480004024a0208508800000151e2093210400204071020c41228008804508,bbaeeb7feef9eebefbff7f5bdf9ffff2ef7fddfefa397fefefff7ffffffef1f5,d522d9fd3315be40a36be5518d7a9fdf2a652a1739005ff2e245cd36e0a4d3d7,68daf5ca8b0649315857a055e474310719344b6575dbf6fd6e11a56a25bf566e -65e794acb0a8a1e4afa76e8c27000fb31344b6971f7ea5b0e8542ec7c8843821,87d034b2d38e8e0610d9fbabc159be0118ed657b2c6ebbc3e34337761799f796,a9d609c81017e9ca87b918ea363744d6ae715216a06da96ff7797314d9bbd649,4c0ccf88ac3f801d91fc81c9f3428cf458c3ef7ba9dfa4094fcdfca7508407a3,60c2fb38d0ed20c30e105abf376464c8acbe97b64267b221d23791adfa296055 -fafe7f5dfbffa3f9f7f3d3ff567fffffffd3bfbfdffedefee7df7f4bfffef6f7,0000000000000000004000000001000018000000000000000000000000101000,6b44a4acd9af0cdf59191f3cec4ff877321d3f978f109a2d773a22bf3473ea71,757d7ec73409052da8ff33d55351b2dea44a90e45be62d3028c22f75aaef5153,6662b3c54af35cfedabd8d0dffc9a4921952e5380141e0799e62b4f3eb18dd80 -fdffefffdfffeffefffffffffffefffffffffffffbfffffffffbfffffffeffff,a96515541f3ecbf37f565e5da5000244acee4d0c798940d6eeb6a81c270b54ea,ccfd43ffdfffecbffef7fdeb7eedbaeff77f5fdfbdfaf8f6ffdbf7eff5fffff7,631c20e0d2c3b0fe3192b8e39218acb4f37b46c7b5e42a7690e099ee60567d55,00bb54a17c868d93c889a4ba389a8e4b5623ad613d86ed1290b31321d5059581 -fce76b47b74257d8dc62b4aed6a741d661d5b3fa84d1135c2e6332e79685fc62,76753c89ca3102509f2f45806a1f6ad7b555f72fa1683354ef55b2f9f3e7f525,bfff7fafbfd6fddce7edf5fcfd553f55af9a73e6fcf0bff675effbd79ff7b7f7,f1aa5eb430563b923609879b5be80e205658280da4ef8774c5fcace5a674a822,4af7977f984de72b0d1f3c848b5a737d24c8239f8295115361fe793fc6ff6bb2 -004040053c042210040931110080a0408011e8018010240080000c0000022100,fff5fbdedd4db77df7dbd67fffff77ff1f9bffd3fffefeb7f7fcbf7ff6feacee,5dbfcd9debfdeffff7eb17ddbfffddff7a1d3b9dd37a35bd6ffff97ffd1ae4f6,02db9a81c4d31fa17225fc9deccf8ca37d3d256094e561d05443b9bd332b4ab8,1781d98c72339bb185e2fea3219b0830004c0886abc0e6d1d19ee76b548534b5 -020408400085c004004400007060b00a32c00a4a2a80b2048000a91206022108,effcfe7f45bfeddddffe99f7cfff9fd0db7d7f5fddb5ddfdd7ffbdd77bffdfcb,a84224000000c00110245044096000a18400002220104901614801001a086101,6e001a8d6a970e2330e526024b0930de6a9b7b88ef574ddd08a329eed960ec1c,640408b2a36331e48d3733a0cbd4be47e64294e8eb784f0ba0f77b5142b99177 -9907c3da1a25c49cbaf2386d3f02f19722097ac02934777c031e7eebc24c97b5,54b3e023d6f2267bfceb19bc178a52b8c03f96c5e5e6f1423e6df1c805dfcdf0,0046270a01902180104903400030503600004a10bc000110002160462060002c,3930de52da3cdbb1596324f25b2995f124d5744f82473e5db4f8e1ec441a2438,41b3c13c7953cb243a09703c956d29dc217fbe313ed0367497e500e67a44c1db -0000000000100000000000100000000000004080400080008000000000020000,73a7df95198778e898b80dbfcec4289b001ddcfa9b48f8e40414747109fbdfad,96f5bc4b2ba228eaae26524543f145965a773041b6acac6b109c7bb4ff28b4d3,860771007ee5609cbe283025fe6b087bf2ff5c14cf8ec71393a4d3fc42233abc,7da1170746471c8e7ad647d064604565911e4d1458f8fe0b5f8a5e9de141c622 -00920c9a2c5202602831c0400a08101200018a004d1020b800000181e010892c,fffebf6fafdef7b5ddfddbfcfdf7f77dcfffefbe4fcfdf3fffe9fdfbffbffff7,0d47be71bbe3741c14120c9ab063d0e1c52c0210a43a713f4ebcb1f115ab82cd,b82eb62e0903beef7941be598f8bd08621420184642aa3c1e1589012cb6f4434,5d5d2af18f4eaa072bfb2dd2c5e3459edf521c772aa4084ae778fe2a426edfcd -e9340e90d43d7fa0985e4122470f32bfc8099b2ee3afc0ce0ff58dc7a5ac4639,11001a18048000a0000044000000000060400800445008201840182500480000,600e8335044461014000000000064040800f1206812c040120400400457608a6,f4ce98cf0ced2e80519ac833ecc9e6a002da1d52b389038f8d27c6c58a9925a6,6dc598c72a7f722692b9862b2556da632680579e3754f97905e147efbd565132 -41a84af68001b0fbfd6866a474ec833175f9956cf523dcc8ccb1c2844f5b142f,000100088501c2024d100894820204008011a0000a15c3a12a81102220000022,fb7fc7227fdfffefcb5ffee7bfee7de7fa7f77fd76ffcffdfdb7f7fffb6bccbf,0cf8850d1fb39b990267e727b91f6ed0c6138f26cbbf6cabf55f65e7adb7b200,6dac3edc5c29e614302aa1c4ef829ac22cf08ab6ee7d7e27d13752ed7070b7ef -122640285080a4504100a20504104c060120a0401600020c3200110689000280,ffffdffffbdfffff5ffffffffffffdfffffffffffefff7effffffffffffffff6,ffb9f5bfebfbff935bbdfeffff5fe1b8fdf5de6df3edff3fffe6af7ee7fefbff,78d3bf6ef9a29ab494c49b88f0c80711a2b1df29a4347242872fd0a81cd91800,22dd2007ed4f8f9a254a4337d840d58bb2c95573391d36e36c0e20bdfc2efc79 -020880001100122000896100c8810003440122020203301c8900a02002600a6d,8bd8819ce4e6aa18401b90b6c31b6c5d44c2f68b657ccb1e680c6528d4e6aaeb,140001109914180040c40a00001a5c081401380584004002000402048e6021c8,f124846c1bbe88a5962df418c88cf16413fc855088d6c7a8c098902b76dbfef0,6fa939de77a8d00efc594ba8a36ba4c77daec6733af50e51a34acf14b90b0f62 -144174e56901d067c173b208144f6f3c5e7df1697878da329bcee4622e4d87b9,ddfa57fcedfbbf43eb5f30ebfbde7ffffeffd77e7b7e77ffefe5fccfbfdf7f3c,fffffffffffffbf7ffffffffffffbeffffffffffffffffffdfffffffffffffff,ce0d5497b441d1b09d4cab94e1614dd086fdf50a9c88b3844baeb8ba72a17b83,03aedc917a048cdbb159722527f268be91d62bee6401a86631666e1a2064eb87 -1fb11f1cb09ef24942273bc091a8226c37fa92fc22bd3495cac8f5ceb24021e2,012300441431800080811063184502090008855302e000a02028e81408080084,e4dffbdfff1cdfd7deff7fde7ef17cf78fffbef5bfefffebbdfffbbfafa527fd,c7afa0158d7ce075fdc9ddfa292b8ce384e61ecd7cfb8fc50624ac693a36bbeb,63926771af4938945643ea67720e312e01913b75981fcc495069396e1f7b1693 -8ffaffc6f6fafe7dcff7eafdfefbf9bdfdff7fff7f6e67dd7bf7faf3f8d2f979,0000010000000004004000080000000000000000000000000000000000000000,9540044cd0000921402101204080164026444101542c146054c209c02d02822c,5efacc6e1e88c67b03313641d4371d80d85dec8342144dd44bbb5eb2f1dde8ce,057022b8528c217d790dd89695265c35c7c980396035e128e475d91b90864d11 -8fbfff7f7fc19fbff7fefbfef3ffe7fdecbf5f57cdffd27bffcfe77f7dff9375,beff3feefd7f6ffff7fffdfff7fcf4bdcffddebeddfdaedfdfc6fde5effcffd7,6bf6a7fdefbe74e6fffbbeff7f7ccfe5ff597fdfffe2fffe5effbf6cfdbffeff,4035aa62bce8bc6e3f660544ee4c965f7306add8bac408b6bcd5a5adbdd36edd,3390e411d554184a4fe3ef477b96a6a03b539a1b256e5484917e3cb8653c960e -6b046b437f02a07bfdb28c5f90d2330334b46b744f952397cf2533dcd366911e,dfeffdfd7fbbfd6fbbff6ffcdd5cb7fbf777dafeff7fbf7ebffffdf6d6b6cddf,52ee0e548e10c1c8d07413e25264381bbb6f6be3c3965ca0796077a3f52c454d,c578cdfe9f15254fea5689e23ccab0907399e24110c43057d6f2af3b8a2cdca3,446f0ea8fb531d630b29c4981a648185f843d4fbb5969b082ceb2af398ec9d57 -00a66c79f3a1b5901781c2b7e820358a689e1e450a36f26f5cb3e9271034b318,0040320a020480442100923000245820c8d99000004204080100180850b41018,a0844004880044445080082a08000020288806140840020050400210140800a8,dab8dc477617ce6358308414b0d6b8b51cd259308831cb8765ba1cf8b13a6ce8,285cd92c15183225403e82af415a3d041f66cdcc898490a3771e53ad9b2b1993 -ba89eb3408b8547cc94b3302bbee0c642c8f4ef489273d0bee1137b2866be927,fffffeff7fffffffffbffff7ffffffffffffbfffffffffffffffffffffffffff,f34ff7ff7df77ff7fffabcdab1f7f9b9fe7fdffbfffdbb4fffedbf4fffff3bf9,ed05bf224dffeb95581d3eb50b0d5afbb627d3bd14e461706bd5d17bdf2d8bc3,1a82a5d4e030c5c393404ab9284bc0a8ea8063011bef5c523b705fab93276aec -2050888010142001a0a00200014712688020049276013000200000189534a016,bffdfeff7f8fff797bf77ffb99dbfb4fffd3ffbf76ffffde7bfd68cdffffeff3,ffffffffeffffffffffffffffbfeffffffffffffffffffffdffffffffeffffff,9ba15cc108e0ced2708064d04ab1f0c76b04091cad9c0cd1331dcab7cb28383b,7687b3fcdba6e33187fb5bbf3939319419c706db1c65c2b42302e19b4f46bcfd -9dfddd7fd77d7fb6dfefffdf6ffcfe1ff6e9ffdd7fffef7fefef5faf7fade67f,aa5c18044cf57ed948d27859b87a75087353d771d89c89ec3aa8a5e11c78e6ba,02108025a0d00302020470401631dd844a40a21830100a20800021023118181a,4297750f583e63b6010074388ac5bdb64cf0514b0fba57b56cb6af58ddcf4f47,07ffca469d008898cc87c21a2307c84e571a003c6fba90c04d45312a841fa8d1 -4cd7e3542d83175c2b30e9b615feb25bb35e523eba346e819d8ec834f59d31dd,10000a014480c04800134188852034a4a00800014110aa2050800d23080a03c0,02011000023600014404e082103022008002439850020860890100d408c10014,56fdcce5e13b85b8487ba60bb91f112a9b4b5411379cce730cd00b60d5b5c7f7,19c59770c8188952d6f4e7975eaaa23faeeb79a307cb40b946bae40aac1f3128 -42008000040281a0080882040800010a8106098c8c84090000300004000c0832,00041a40207408400201000000100026042c881800120000c411811808ae8403,fafddff0beb5eff9dfdbf7d7fdbffffc7fab7feff7797cdfdfc7fddefebedfff,f76703b5b95ff00a225c6f6c42cc3bb5320856d8810249a4064890d17b315def,699febf334c32da618b59acadfa62f814eb54cfb38d36d7952d5884ef03f323e -0440051020805412212090c800128001901234511080020406044300202e9020,49fb33917fd230f0edd0accad2cfe3d150a4fd8f635687236565b415734b2be6,036012004a21000100001a1800049480140005410e583281083a010d02156200,10106291754d71aa6fcd24efb9a3ce4fd779b4affe4a14eb47f66e7ed0c0570b,7c5a01545f6875c34a127f2cdde5fc939de8926435994cbe10efdd34d857e843 -e9a7326b5eee6d8fcfe0f34580ebbe687dbe1b553e0d35aafb6e99764231e270,f6ffd7ffefb7f7f7f9ea7f7effbff4cafefde8af8fff77d79ffffbe3f7ffa6fe,800000010881000020001000c01000400090419bc80081202c804a408c0a4204,287022128363f911a3f90259e05b17cf8c302dc6bdd56df5a7a60dab889378fe,03347e7ac9e06bf4ce6122249706b38970f1d3ac0df5e8dc2423297bdcd2b75f -303802a21801b000003040004640100302009202180af0200c08090001085a00,d02000241980800001000646b042014000001000a03086300000080201022204,9d6fdf5bf7bbebbdeaff7fb3ffbddfef3af7ffdfffa6fffff6ffdffedea57b9b,cf41451ab9e1f81bd493a39ff4b503fce68c1ffda8dec891fecc9d65537e71d9,27a862bb253fbd6bced21934f333aa0afbe993dc058854b8a88fa66486416f65 -31124030003822110800c8271000410080200cc50c05420802c0a28340108280,7655fef77bbad73beff4bfff7f8ddf7e7dfdeafffffbff1cfefff6ec7ef9f7f7,fdfefdffe8affe77ffffffdfdbbfefdea74ffceff1bbceebbf37fbcff717f6b7,52b71297b8b01afc408bd13b92b78e75f06ea4e5b2a3134fb8b292ffaec36ede,54387d0a78f08ff9c8e9c8bd513e1f3a6a77099e3ca6b9b5a2b11249ff6905bf -01100000000000020000000008000040008800028000000080c0800000001100,103c0840484000c201b00c622800800120425810201010409119030b26c4214b,c7e1347dcfc8f070abf547f2640b18553bb4a37106fbf88c9f2a3d6496ad2027,b40913514174b63857d980d9251dd0b62e8546f41e729c82c75d4efa4e25ef13,715a6070541313a88af4c179c8404ba0ce19b44556ac3d5079aefbc27a414a9d -60881e200000089040d90409128866500880c4b05020e0852c0c640150000110,3ceafff9deedffbeffffeefe73fffdfdffeffff7df9ffff76ffafffdeff1cff6,ff7777fcdffdd9f7efff77ffbfffede66beffffcefbefeedf62a8bdf7e77ffef,2cf2ef4c1d31728bf116694c731763a2cf6957d600572626794ac787ec8a89bd,471e3075b9b5f259c3654688bc7c765c4c51f5b1f5f97f27f09f52b93ec70dae -fd3ffeff7feeffdef7bfbeb7b57fbcffdbf7fda9ccfff57dfff95ffbed7f9677,50b1cb493ef9728b75e80c74520e5c0a34a1b8a4d1d2ad37f75eda09850cbaf5,ffffffffffffffffffffffffeff7ffffffff7ffffffffdfffffffffffff7ffff,c08836c608fce7344728be5fe349f47bbe5b658be57b6ed03843f344804cd772,7ce52e4727c1cd67d4be37ee779ed6e2fb4fc24e0618e3bb2c20251ae745517f -0000000000000040000400000004000000000000000400000080000000000800,7cdf6afff9fe777b8f7ff77bbefffc9bdfddf7bbebb6fd6ffdffefbffd7935d2,9120000040080920080480090125040000400000011002018981020040050101,b065ce5042ccf25bd4d74eed4672f67b8c0504f2835744aecb17558863f5a080,43aeb1e53da356265425e3d00196b4af11d5cfad52504cef02b84b7780f2e760 -475df7aefefa6f6eeffd7ffde7fbbffffdff5fd9ffff7adf65ffed7ff7f73679,202a40020122c10480244618c180002128300242016804410088400660002902,de5ffafddfbf5557fedf7fbfdbfbfd3ffddcefbdcf7f678eabddffbfc5bffdb5,1658fb713e72698813e790c5f2afaa3dd8f5abd3c546ba9bb3cef8d931de0faa,0cb69723bb8364fc28ab848d0dfbf8436aa1cc5544eec4e621afa79601ad5d0c -000020008020000000001000000100100080004000000000000022040000000a,767ff6effedf7f79f7fd62fff3377d3ff7fffd96fbfffbffbfdffbddf3efdf23,ff733ddf5df7f87eefdfe7dfebdecbedf6fee7ff7ff7fff7efdfbfe1dfbfed7f,d940ad3e80848da359058fab95524d7f19e3f404d9bb0dab4a3ec281fca9b8f5,7f7f4152f76799c34822a9e05deb0cb1dacdf427030a732fcead4a4c39e4ee6d -ff5fffdfff9feff2fb7ef6f7f3dbfa7efbfddffd9ffb1eabffff3ffffbf7f7ff,7315b60965288e29a481cc3bbb6e13491e296b74ce6c1813653733a30e6f79f1,754eba88e3a6c21eea5272ddc1f7ccd9ae4ea0669126e48d29aba2aa44dae574,80b9927aa5ef03125e969769206541e32c16d411a02bafd209f84e4ac2ab5ce5,7ab687245c2920b1922bcf3718d7a3ef4e29c6ba2205196360268169704a2298 -25698b036627974a1db6322f6ae1b460c9aa4d3fcf77662fae5ee0f54c89ca25,fefdffffbfbddfffde3dedf5f1ffe7bf77effffdf767f4bf77ffd7ff8ff7f7f7,efaffdffdfdbfdcbfbeefdf77f9ef7eef5eb5fbfbddfbafdfbffbffffffb7f7b,42293c0c408d64b88eb8825e24d6a3c937a926eaa527c2338f145f19e50a57b4,0a876f771cdfb026b845c6e34188ff17c3cef01e1ec9a1ec2b2a391af8115d6c -d86ce9a33da3e3ce23619a5996b102c5b7aa8cce303b57445365b31e8a60624d,0228608981084b4201100124084049e6060a0821440000000744104805920280,0008059552002010411010a84100840000303a444400089b4000002000c88400,bd003be98a87d048300e3594fb132db5a6bbb61d51e75f7938bf8e6f35403d29,59f5ac09f2805973506f705df75a081e43d661f1ad806c0dbf25a30ce6052c8d -0c10404094280d160281644218c1081002080414940214a00008040704280010,0048110082102508000041a88003128804802040c01470001214211001000021,fffffffffeff7fdbfffe7fbfdffdffff7ffffffffffffeffffffffffffffffff,325713545db3be791c51d9d327e2970db5dace2d93774aa251827389468b3690,30f103bca4bca954c80d0eea52f9503009475ac755128e3bf1758a083471436a -008c020011800262c00e380169101640000b00218430001e020e301610080200,080e8102000022080a00000c040046000002120120400088404040201c9d1286,a7c50bc19d928b3188ec316e5df83bf92d9cb71ef1288e466b8653150d688452,a76f2b0f08f7d3bd5fc5b288e7d614b39a26f429e6011ddf309fb7d8d6d817e5,293f9323a9673e33bf48b797391d83d4d52df46d097bd38fbfb3a48f7dc09a56 -4011002a11500204002000012114408400000020118001060231008044004930,0104000000005000200020000001028000000000000000000000900000000008,ef07f3f6dc77d0f6fdffbddfffbfe5fedff77fbaeffcf5feb9bfff7c4de7fe7e,79fefcbb39fe503fc1af74d6e8e4087996dd41faf1bc18a94741a202d8deb98e,4671eb4baaf7d1558d4e309b23cc4a964936bb09659f1b770b3b941047105943 -ea7fdaafb767bbfaf6e67fffff7eafffff1afb7f5effbfd6d7ceab77dfb76ff7,7348f7e786e42a4335b528277587d1ea21892be046bc22f29f6fd4f36f335f3a,11e138e83ec92c1d516622e87a133629314f489cc538314621da431f384b18f3,49f040c873fec6ab299d8cc6e88ff231dd415cf03f99c68a4dedbc32eff0f413,7b460d42b694768fdac24a08cd8252ff7304d25c4d17a287b81fd1708c771002 -efffffffffffbffffffffffffbfffbf7fffffeffffffffffffffffffffffffff,000806048231341080825000190021020021011100408080218828506a40e016,f6390695d67e602d82913d7158205fcc6daa24130548710fe0725a8edafbd2d7,f735d41dc4db7152d13b6556d04251866b2e47b4fe41fa5e8e2f4d6d20bc0560,1df38bdf8ca539f62f13d78a44b42f8f4d52728053ceedd2c768c864cd2d2d48 -9ad7dd2036fd52ad13a7cdaae1bc2025dcbb1e9701b12c888e9ee8aa9b9b81fc,ffdee7fe77dc3de63fdf7fcbbf7bff7f7f3ddffb6b7bf73ffffed3ffefdef7fe,08114e7a4885126b6eea74e6e31eb51f7aaebaab3b5c3e225517c73968599fd5,a9fa33d598c574d155dd8bc128a906e7acedd9b4b3e50018d9d107095cef4aaf,41b19df8ea173714d0a088c5a194ad34f8f7d57758ab878ede2ddd59cf219d0a -eabf9ff7cffeff7fdff6ddedeed9bfe2fef6e7dfffded3bef77ffbfffebfffcf,c6b110a52ccd72c28369841d693eab8c98e55ed5a11fbfd0857a0b62019866f5,00000a1008000000000200008002000000000000004000000000000000100004,eb0e8bf77d7886aa67c5ec55d8f29030f8c6293a45322f87897b5bc7c3dfcc33,6355d349bc149ee568206475a2b727fa1ee6ffe19974222ed5ee61390996bf44 -92011180002100d18440010240442202044000034740524204280089880a8110,200000c008a200d1440201221005a0010938042200e820400000002c2a008260,f7f7bb7ff76ddfc3fffbf9fbe67ef7ffbf475dec5fbf7df4be75ffff7eebff7f,442a67e914d88d8f28ad895f1fac61769a3febe38cefa28675f76afcc5325941,377be267cbb4f6773cf34e60984afd1539843a9d779f4f5cc7c207b70407bbf8 -ffdff5fff5ffd6f63ffbff6bd7dbde7fdf3f1defeefffbddffedffffe9fdf7f7,24380610000330015401242588403104441208604380108000a200061bb40c00,f7577f6dd1b603cd715edc24ecc2ac227be93f84a3d06e975508a7023d82517f,db96618a4c464d87c055f0072d5df2a5c67c05799f5408cebe8b45dd83963340,1d56f2adbde6fc7f715df16bf2ffd998d4158f33eba58bb04bb379d95e3f41bf -0000000000000000040080000000000000002000000000200040020000000000,8a000cc40c28161040210000e904140604420802093d80080056106385040040,010002400001a112008210200700302524003023200100080400040000008010,daa66d015d75947374ae922199d20e8b14e1fc25f42ea1b49338e1b2c5896435,2dcf91dd61f54a4570aedc2fbceb7eff2a229f8c2cc6b4f44898c0cd520954b3 -b07ff7e7deffef5dbfafef77eaffdf9fdfeddd7dfd7fab37fe5ffaaffdddbefd,bf7ffbcefffbfff6f70efeee7ebffddbdffffd74effff3bbff6fd777e7beb3fb,020002040800309008548500000400000c00b089080800032241001200a13122,3f2802473138d6e36c3002799e77c65e3d9a77b9bba00f42ec2cbe421b3aed73,623f18b185059e483aaf3933effe9ffb3e8083ea757edffdfe0b9f2704006f37 -3000604800002838800800002a0072083004044150080a3382200506010826ac,79ddfeffb49fffdfcdfe9f6eeff1d6b7ff8fbbffffffb3ffdf7edffceffc5db6,0e41df624dcb4fc27d7a254a776c695fc9dbea8048699c1ffaffd52d1c67869c,d0aea70dc048f877eb0a2c52d315e670902624c00ed27c167e72b321cf0fc2c5,7079888bc59e9f3a78d75d97b3c1e183f99353506a918892b07a53f87be24b05 -ebfffdfdfedfdff3ffe5e5ffffffffe39fdb7bdf5cbaf5f57de1fc76f3fefbff,7d77f77fb7fcc17fe7fe7fff7ffdfda5fefffe7f7affbe33ffafecdfd9fff7ff,fadfffddffadbdbfffd77dedbffe7fdffbf9eee4d7fffbdefebfffef5acfbfdf,ca82a85208410f5226ac7e17f6c8fb600387307e2f76167dfad9fe9badb51bd8,0cbbc66409ce9992682f223cafd23474455421fa1863ccdae043eadf150fed51 -01ce000420184901000002204a000001012c004c49844880a0043000024604c0,2dd60e2e589ee6ec9c00e7c94ea4206a5321a80bd2fa3f1d9f25703d823b34f5,af36ccdba450f81e54aff3b11f491a311c8ac8f5eea6d68e8f481109b11a7ec9,6dc49ea09fec1bc7956be72684b7bbfd3ea682c6b4746e4aaef1f7f5c55403c8,13cdfbe80a003ee0382bda1041520f78d7d1b21f324c793647c955a5e3b1e6ce -2858040048009080110481000210208506420308223042004000600010006800,04042d040c301002182c00213aa008111018400800a420506400420220020010,0000001000010000000080000000000010000120008000401000100000000080,028f66e9f0e99410e41402776e7cfd331fdfc8b8d1e256005f1b253645435c1e,06bb28100f95fad41b90d2dedcc661e4a996e56bf0693a90b32c289918f852e0 -fb5d1675dabd8c03b1a46f1b63dcc279730af4c6dc2ec86d7dda92b30c994937,fffffffffffffffffffffbffeffffffeffffffffffffffdffeffffffffdfffff,d3ff5ffcfddd7ee6d6fbfe9e7dbf9df9f9fffcb7fdfbfeffdfdfff0d7fbe75bf,5d82ac240c8174085504f28a88966c3f0a416ce36579df3a0ed86c99885eff6a,741ff2c05c628c72a1c7622210a1c990093714be741c14c90dbb574c37985e9d -6afffb3f7e5e2f3afbe7e7ddbf2edffefbdd5bf197efcfefde3fffbbfffbaffd,fff7badb7fd7ffdf5ffbd576d777eec0efaf6a734f9def7ffbf57f6ef2dee5ee,ffffffffefffefffbffffff5ffefffffdffffffffffffffffffff7fffffffeff,5ab2d0a2b3685dfe256c514a182b47040e95bf27703257cda02d53b0587ab423,12954313f9d5ba1c9f92ca741470615a9ffb45ffb7084d67341efd90484f1ffb -8018e002800000c200000804b1000410200005880400540222a040906604a104,2605818a802045062002013a8218280a4188000018629600103800200115c205,fffbbeff1f3dfdbf63ffb2fb176fe7dfff5fdffff67f8d7fbfff7dfd3f5ffd0e,26dfe0a6227ce2165e798bd57ef155778ea7113387cd8a74229402bc1a4c03a2,34df7c7bc807272d40e8e96be67e688658fff269a84e73847d0f19745264db88 -0106008004511980000198a1000002200400980b940880688051182c00409089,3beea8695b65b5a652d01d51848a7bb2d4b09480d479503e1efa1a9db571fbfa,10d0c094280100001048c20011022908a42260895022803a6100000400602600,fe0443760fce14f2a2cf395846b900bc92a48c9d82356bdd14f67c769263a628,12e981832f56f2b4b06e668cd19042709354fda5393e6e1c186b61ce864346f2 -5fb27bfffbb7edffffffe5feb3fbffeffeef9dfbeebffcffff37ffe579bb36f7,0200004000000000080000000000402000000000000020000000000080000080,1b5ce38e8fdfabbf7bb9b27490378e718a2ddc915e41ebe6b58e23160db0b5ac,601690d18c9ca3e6935d05e74e2a0360e4f4f9f5b18a101dc70fe47509c5c9c5,6aff823e0afa2535480f808391e46622bc5e7c756d6d17a9493383508b9d0d02 -815f1d3ec709e3039231694f4fe22dddeea129ba20e3210251849775408d3761,d7b253d7b5ba6c36f7155557e8d947cf31745125f8ca14262b5f204f3ca8e970,fb6bffbb71cbffedb77af1b7cfefdebf753edddaffeef5f9df7dfef6bfffddfb,9226e347fad851784407ed24a09cbd59558eb4553700eb8e9b23a73b5582fce6,00ee12a6a5ab0e866d3dd246deda5f2e5c875605f7ce9b4c92edaa5347862a27 -41c76167d0d4049b88d89ab4d959ffaca35e116967b6a5711e165acc44754750,012004200d0640056c0008026083202003c0a100005016a708204000e0000090,edd93e79cafd7effbf63bdb7ffff77fefedf7f6fefff1bffef7fdfffffee7eff,a5f4abc47b6329ae1feb19a2d69e41cfe764844bc83b5fcdeb2b9f3d4d2fed2f,04f7669e362a367236ca1facc6de9c6080d12c49d2407d29354961aa7b3905a8 -0000000000080000000000021000800000000002000400000004040000002000,4000000000000800000000000000000080000000004000000001000000001000,883af62ee9b2537d42dba0e85739143c537d69abae2b36a38ff078ad95732cff,a367c1374265e763013ece6c989d3daec2ad3806707726fea55a651eeb19e904,7561559e50d5635a0b01dc6a6833c02358714883fda5cf2535fc31ed7542ff63 -ffffeffffffffeffbff7fffffffefeffffffffffffffdff7ffffffffffffdffd,001b31002145200021820000981785810c0488009016dc024800040112502800,9e1bbf08a2956bda30f2b3d2bc67cae990bd19234480b0d07a53c864c67942c0,c5b5050ed7d195ad70e199098a7281a2a4584af777f2407c74b75711ef3cdbbd,34012fedbae15713d27279125fa20d27374a8cbee8fa0cf1330318efb84c09d8 -fe9ff3d7fff7ffb7fffb7ffbdfffffff6ceaffffbfffef4ff6f7fdefafbfeeff,4b464ed735bd6c06ca4ec0ec65918ac97b57cd8ff1a7d112c08cc2e1a64aade6,80120429110b88000080a000a1c22a805000110520a834451810419193490000,1e6fb84b28c8a95ec09a060ca9a18e8130738c5d021b38ed5e6bffa276b832af,6736119f2ef7572de2ad39e16d05120aad1bdaca6a85141061ffa383f800b434 -ffaf6efffd35debbdfff7dfedec7ffeeff7bffd7e5feffebff67f373df6f6f7b,20080b818000010822829080043060880048008004301002040a400a202c0100,0232800010003462000a18115015204541082600000120201040601200868044,f2ab86de0dc19609cada9556514892472d6048012e9e8276409257b4dcca67ba,6ee90f728de36159a354d4bf4419fe5daf81c28d49018369d4a22f58a36993a9 -fddef7debfb7fcbfbbee7bf3ff6bfdb2c76ff6effe6edecffc7ffd53dffdeff3,15001e006080000c001d00008000400040288e480020800a218025308c8020e0,ffbeefbffffffcfcffcdfbffe7dfebffd4ff7dd37fbfffefbfe7bdf7ffff7bbb,30d230f1a8e61000b2a29c20b4c3294c876f3a38de0307e29521274c8c54209b,2ed50bb3c949575896de87f25263ba815972cbb679681255655341d14f35810c -fbffffffffffffdffdffffffffffff7fffffffffffffffffffdfffeff7ffffff,fbf7ff3dabfe7f7fbfddf9bfffdff7fbbfed9b7bed7fbaef79ffd55fb3f33f43,fffffdffffffffbffffffffffffffffbffffffffffffffffffffffffffffffff,2660b2b1359745e63b8741fb6d99e30103c0191df142c971429809f172ce78ef,681dcbaf7a6320191edb4ad9f161522b4a71b58be387519a23f7b7de60d71926 -0a000610000280234730084028a10150a488010060020d0e8340a1c842891102,629efbdd7fdbf9fff6ed7ff7ff7df7fb87fffdeabfbfef7bf97ff3615f3faded,9031908802401b0601100c8047002880802832003021000020000400281000ec,c7c36e9c4019c6324b71905dd148d657868496d26f8f0590714349066261dbbe,3daff6a1b1a45342503956ff9e9e41bfb8f623cd35b6cfa231077a60543ba143 -1c00120cba208c008150a04140000340204860032523044060104c2000224004,32284283304684003100322100104101500200b00121920010400b6213006080,62561843152b5e1ad82fc55c593db1325b8f08769241a89084172c183f8894ac,d90f193496321c7c7e29b9fed50e115b4229175247f688e8537aa9676684c64a,04b9a37124d8d4ab20035162bd0da7285f4e560db9d32cb5f77791a28e2e80f8 -117c956154dafd8720478f910964fd5d362a3ef9529505a940e147353c71704b,010c20009390510000081480431408000121045c0821028000042424c0c32220,931ca744988ffbbb03b5b7c50fb8accf329d2319a17b919baf3f453e2bc68976,d151c0203e440417d56c7f05df2cd0663d32adea9d81e66b202b098dd8774100,42f5ec84efd154ef4cd31a6527bd0f645a0c8aa318977ae003822a7b37a32e71 -9fedb7fffe9be9f3fffbffd77bffffb7b37f79676ffbffffffffffbbfbddbe7c,dede5ebffefff99b7f9ffffffd96cedb7bf7fcf62ffea5fffeedf7ebfafe4bff,ffffffffffffffeffffbfffffbfffffffffffffefbffffffffffffffffffffbf,2e644d0c6c5591d68c1816c80774ce6244ad76ba681bc741f638844156fe8b44,232a961f311a26423daf4f2789d88effa87e4b04ef661f8e1804f3712de6d935 -ca0f50dde4acc3395ae80fb9f2eb6fb04d0e7964b9ba1902a9a6ce1ba8be8e4a,0c15400022d4800c6000484310008100643800208c1d29082040804402203020,f7efffeffffffffffeffffffffffefdfffffffffffffffffffffffffffffbfff,0dd30fb8d3ac1325e7c552a2d45c73772fb6858a89bca5a41cabc6b463ea7676,20572432554671918d0fcba027be6019eba4234573a1467879574aba58c643c6 -efedfbfcf7faafedfbfbfff7bdbabdfb7cefef376fec9ddbeefff7fff73d77ef,02800544208008000214496a20310242c0202088680e01610809230080204180,685f352951375b8838f78175da376c318a434ab2c40a15f98767e377289c1e5f,707c3483fa4db383709cae18978dafdd3e98d132567905ad4c0dfbcd7a7dd092,46fb1b0eeff4adb7191eb634eb1aa002bcf5b648cc882da593c5183bddf1432f -edd5fb97ffed6fffffff5f6cfe77dbf6ffbdefffc6dafbfbf6fdb7be7ed6fbdb,340511900020c3d00202c582161500080102080100809012a101200a10000070,e678e27a707354c0a1dd07f6146daab94b8e1905b81e2411c967ca743e598c4b,97a584157b3e54c7076862ab6d4f70d78006231149ac07de5e118026ea930ade,532338d426b2d3f5ef6907fd02113bc8addaf81b21018d2008f73bc790df0357 -965cb914c962182e5584ecaac2357cba2468ad66a7f41390567fb4eb6b7b7c70,0000000000000000000000000000002000000000000000000000000040000000,10809404c0080a09a0870406288cba5084465226202403080a03400c44480220,69e10fbdbb0d273f48791cd3a95589d78ebd8108c062a4e4b1a7970ceee4faf8,023dbc9089045a696f7a6bbc2028a8a59aa66144beaf4da547b3dd50d057e3a9 -ea5f351e1a37b9cd7b0aee869b50cb3c0986513355aa2bdf9b828f1e7a1caf54,df5fdbeff3fbfe97ff7e7e8dfeffffff7b77feff797fffe77f5d6dff77bbdebc,1222404088040014001004480005a1882020204442010800a900000010000180,9b5187a16693880c2ac67123d4cfb3ac6d8d3c62c6b64b0721c89edde4490610,52f15182f1a2215ca3243d527de5f0033dcf7b58873476f991e244e3dba7d069 -afeeffffedbefbf0ebfefd7f5fffbe7efffbefffefff7fb9fbffffdfeef96eff,bdbfbefddc9fff9bfefd6fffdfeb80f7fb9ef9d09fff7d7fedbfefeffbf7aef5,a5979259456cff5d053e1571dc00177b605253aeab8be7a92bfa91fcded0b344,8eba7c7e833af653c9e57be1fdccd090740c537fda1869242a37fce7948d08b2,4a3388a0473e6800219213624f8b585c795a68a87773631bc384546a16a082d0 -00202324220598881004020384080000040050240a0464080020080003c04007,e5d11ff9fef8dffff737edffeffbffd7bfffeefffbb7f1ffe9ffeb6bbf1bbdfb,35bdce87e8434f00eaccdf08638b2180c1b47c9bc79608765572462b5f8e4c07,1d8a09d4b78c8cc88d146835028c070daf56858183c8ab9d19878125b39d240c,7e59bac9adf74e0e8f64833e8eaea0fba5a270f1dcf2e9b00f76f1e228dcbef3 -17c5c8d6e9a3bed8037ab77e354147eec4859fa19bbe67c5a732fe82f98b2f13,404441100490298001040501c070a0320421c22000838005004181a200801100,286b7ff73f7bfdb7ff379ffededf477edeffbcf9f9fffbdefbfffff74e7afbd0,c89001807a42f4ad37d9f1d563bd47a4ddb72f90ffd40dbaa1e33e464fee6d8b,2b7c0916733d3a4bb9d87cbef6211b669c4ff1bd1c6ff87150ec8f8ad21ec90a -fdaf3ffffd5ef7fffdffbef6effeefffbfff7f9f177fdeffb76b7dffb3ffd7bf,01854655e5b7bc0f1ec21318c453b8572f5e05a63488c667568275f8107fdd4f,ef6ffbbef7ff57ffdcbfef757ff7de5fbffdfdf2bff27f5abb1b4f5f7bffeecf,fce7ab24adc380e4b8215af50353741451c7446f8c9b21b2c355f1780d481b6e,5e075b02dc615ffd8adcfaa458ab916250cca29f8529be826dd628963e8c575a -6adbf3b81047f4ffc98dc0f01f9d8a681ef8ea3fce6b95e1c50f108b3a29ddbb,ffff9bfe9ffffe6fdd7bf5fbcfcff79dffeffbfb6cfebf7efaebaf7fbefbb1db,2dff7e7cb7ff5f7dbafff6ffcf3f9f99c3ffab13bdb7bffff6b6fffdf7bfffef,0be98088b82f69254a96f7a3171715f5852ac53e664574c706340cf8b9340195,32b7d88d66c5ee95aabc5047ff83091baba62e76c98e695f69d888582bfe1b00 -df8ffffff7abffffd7ffffbdef4ef66f4fafeddedbe6dfe2df79bfdfb2d7fbde,7d9eeff2fdef7f7f56fefff7fbf9dff6ffb55ff4776fcfdbaffbaf77db7ffff7,0442001080800039080800100100010a70608008600122080052810064808201,1aae48efe182f281013753078af8a5d637cbeec6c76cf61fe49790d643bc6741,0b992308f0878187141d350a7b7c61584899354a29a9e9de5469f290db04c9c3 -bfbef5ffbfff7ef777ffffdddfefffbabebbf5bf5f7fe7fedfb5fd5fdae73e6d,fffffffffffff7fffffffefbffdfff7fffeffffffffffffffff7fffffbffffff,3ebeffde7b7d7ffbfadf7f5febbffefbea7bbcfd72f6fddf7f6edfcdfdebad7f,0016d10ff465be3e68f956b789fcd084ef5e8869abe283809ad48720a8d1689f,14053fb20be990b71a2e5aa5a450bc3a8c971da0e6dce7889150bca76ae28c42 -3dada7aecf2d67a84c673038a209baa656c44482cf30ccbeee871b927246939d,a46fe65f31fd340f1db0a69a315fda31faa82bc35212cf3723d6e1db195f9b03,5401090008040c00b4c4000005424d499004c01509200402814839104c104900,e4f615524441aebc68c1d3a37156c60475399e8d0006b07b3d665f9722db5ea8,317456b26587198bf4f84303a814057f7061a37f5c608320eef54f87e8170128 -01488410044001910500011805000226184010070808230a0a0284b060408400,4912c0880009000000802801060420045010402a1031420120004040186500c3,bffffbef5ffd9ffb7dcddbfbf9fe7af3f95bdf9feff3f3ffdfffb7f36bd9efff,c28433def9e31249bdab6fab0f64d21d20dff890e4babd4f97537810393042cd,3d4057b15f6ab08d220e9b4ef2ed77c4c667625fb459735942e7164e77db2422 -1c9f58bcadfafac39110a7d8adb25182bdd5b8b69319e04b4e2e4b06ed23b197,fd3a5a2cb9b2e61fc5826dc431e139583d73e39b5cc53a4183c49508174e9dae,00004008c041d0921608102004c000820301011437800008022005c424103036,4dfd952086e2b1756bd1cf8d689effedebc7bab84cabb457f36d521e15ddf6c7,45bebf102fd881a2b00ae42fc8b49c1925d07263284d55a10e34cfa80891cca7 -538471ceaaa5ce19ed2ed04e03c54f7ed03efe828389c32a75e111eb8251eb70,1006040890004010206008302004000cb0483209202181a30a21813008345044,de4f57fe97ee3ddd7f7eeffffdb35fef2fefff5df6ffffbfaf7dd3dbbdf57bcf,19da1c6793d0cf8c4d84662556c1622ac1a163aa27f9c27a09b720eab21b981b,4f8b2117f373fab09bab07c0075d7b6f4d507b3843c50383e87712767bfd1b1d -0040c40081c940480c438404080004aa1e4008280404095011a0001800008808,0002000000000000000000000000000100000000000000004000804000001000,f1cdfedc7fc38f58d263c3ce9b3035b208a9c24cbec58d0f78147da325f3a64f,3835a59e724812416089ed3c919b96583b06268d5bd0d0787a15150f5ea99dbb,3f10593d104a9d551d8b4e4238ad62f6be390e1246d56258b53b83555a447a06 -1100a840022128d8122d80820020800082006830088011120080108162180000,9a2affabcb72ca04df235abccd9bcc60799b9657773d11bf4e23945d675cd2a7,fbf7eecfffff33fcf7eebf6f7fe7bdbbdfb9fe9d6f7ae292f77cffeff9ffdfbf,ad2dcb350077ec3b2892a3580f5f432b1cc0a4e097878eb1e66a56ab4a103b69,13aa19eb0091513a880e220e512c23672fc45e9c2f312c76a4c521e7fedf92c8 -0828d44800000098101007a4001008002011c01b406128000175020018020004,7d5206b785b490db379b73024468c487d8e61e0617e1d92531e297faea88bcf8,f3dffbfdfffbf3befeff77cffbfcffffcf72efeefef577fe6ebefefe7ff5ed5b,8b395bea129680018cc7216180537dc7ebbcecf02b9eb1e372be19f9ccd7b0c9,0284d39a12a014f410f0c123dede63f7287f1a53b5335f1d3e5828da79225b73 -178a00208454004440144b484244020020481050308800400a80020660b00050,171fce1b6f767403baa4f075aa5795268da03e0fe6e78b3fc77e063782352b19,59aa50800044010030b000121a01028ca702000401e04fa31241001008024020,6fd9962387b09ca912ef4c7d8655c58f7849a197d454d371681686e768f3cf5a,59d03c275955a7c14f40c491cf2dbf3980a5baf0c2e5f6351e28c18436353728 -fffff6fffffffffffffffffbfffffffffffbfffffffffffffffffffffffffffd,fdb77eff7ef9f7dffbef1fee3bf7ffdd7db37b67bdffdf8efdffbde4ec7fbbf1,016030040a440a0045043d5d026caf0060800a00a2102802e1034a4021410000,847e43663aba188fc82763f8ec7c8faea04dcc5803d431f9f68a8549badd3fcd,0e0d7e9892635cb0873a143a074152be03eeddad4b490aa2852b854511beed93 -a208000000f48140044800030210e84004020006004081013301404410400180,fffede7ee5bf7ebfce63f6b7ffef3ffeeff9ffffdeffffdfffafd6f7baf9fdff,120940100410540c0694001200807080420240010004002580292810400c3318,2f97ef3f01b069bcae988256f0b21d8ae2d1c09f7f3b3c47cdfcb14ac18d3dae,59eb9a331c806abd4ed8976d26ce2afd8d366f14ec38e4ccb85cae0130fb1a5f -fcfffb7beff7ffdaabf7bddbd3fd3fff95fff7fd7baf75ffdcfa77ffffff75b3,40188184a0a1243801220101e091009014210e210280940c111098060b000c60,4001890480811005140013a214a04a0210000a0204010084014345d001000468,596ca658547daf9ebfdf15eac0e350969e6d076713eecf2e37912a8813d3f057,4e0c4a871570fb4839d8bb75c7febbbaa864c32bbbec836fbf633c7c4a1361b0 -0000000100100000080000000000080100180000000000000800000000020000,feb3fdeffbfae7fdfacf7fbfffffff75d37fef7ffff63effed7ff7fffd7deffe,c0bef3c54cfeb9c197d128d6d1794bb1f3f1f0531c40ec805d17654a00bf1930,b57cd8235a81cc86ad02ee503f36bf8c8ebca3dad6a2e03ce194650381b0e45f,7997cc609d93c40f4bb033fea00f332eeaa212e66bcd24892da18857ea8aefef -ef7b5ffe7bfeffbfaffdeffefbfcfed85bff673cfbffe5dfffffd7fedd7bdf9b,f3fddff7fbefffefff97effffbff7f773dff5fff3feff7b75dffdeeffe9fdfbe,ffbb8bfefb9cdfdfbeffbe7ec33ffbfcfc9ffeecadcffbf6fb7fbb18ffffdfce,6b2333851ba74776777fee92b5c4bf07d50a3e15030431b70b990607237ef0c8,67b19325811bbd98180bde7bb27abca56fb89193976b51c145c22098a2570f70 -cfdaed0320c3c6cbd798df7c3aa9249982b9d39a87d70fcb108dbe2fc7350f23,5add3de837eef0ce8af2709e82e041053dd6e2f826f6a001e8d670b507042269,91f8cb47c061fe398862efa168c60e386e4149b889a45535ee94267dab593df9,d50c275053070d0525441f21d1f3e53962dc07622c9c29aabca9d2d24381bec5,4c25e259cfaa6707544482d6d5994b13966b2bf869d7f7a953647add4db1503f -44018004602069480500c455052880a806400210513b880180020209104102c0,ffff5f7abfbebfd8dffebffdbbfdee5f9fddd7ddfcfffebfff3a77f97fff8eff,ffffb7ff2ffffafefe7cff9d4bffe565d7bffffefdfffebddfdfddefadadfffe,7e6ecd8b980743eacc26152739f76217390919e4de410bc2262b3315bb186945,481e5ecbaff61388ea29b9a9fed8bbab5530870caaff2db84e84b532389d2b04 -00400109000200020000841e1200008008002ac4000040141120824108d10052,fdc779effffefdfe676fbef797bed7bbff7fafb7ef7eabe3f95dff5b3afdd0ed,000200000000000000000280004000000000c000000000000000000000000000,4041ae22a4753374539f8a1698b2b0da1600d4322613dd2cc94e3422c1874abd,7bdb364d3c152fab4e6a4aa51422c4bdd61f6a9167fa84ca269ad120fbcc6f00 -01c090294488010008414870024800010200080000020a48a420030030042030,0828000100201008000900088388a049c48100030c0040864394310905409042,fffffebe95ffd9eefafeebf5df7ffa7fbffdffd7dfcdd7febdf3fbfbea5bacbf,3e7ac06ebd3bd7cdde9c3138cc768cc71b2710ec7e53f96672e62d54298267b2,79087d8a5836fb6dbf13169c06888ffa92d36fe20b68a7356e818ac88cb8d782 -051f420f618ee2ebbc2e363af5803dd526a91016904d564849ca552d72479fbe,20401221080854a02a0100013c0602058142180024008064340001c30a098005,dffbfbffff36fefeff57f553ebdf7ef9efbf6dfeeafdd9f7bdffffffe957dfff,468548cde588d7d7e2fb7310ae105abff70bdbb2449ec1445d1aa76a9156dffa,45555d39097574c808fd19d0cb4c8021a894e7c79d8fae43b5f8779d6ff724a9 -ffb7bec7cb7f9fdffffedffff3dff9feeffaf7cffe3b7cfd932cfff7dfdfdff7,40040012070089080102188088000411081000880105085004001486414c80e0,ffffffffdffffffffffffffffffeffffffffffdfffffffffffffffffffffffff,52010e36c98a24d5f82a98ca710e82db75ea7e13637086a1fa77098e4189776f,46e78da02c2e960ad5c2d3d1ecd1ef20cc0fb54bd58c501f20609e4639e5f2a5 -8d421eb2f3c5c318a38e37f748962b0b60b3a346b9e3ab69ce816477631b0323,ffffcfdefbffdf1f73fadf6fffff33fcf2fc2ffe97edf3dffdeccbfeffebffff,002074b52250090fa05400080204020008002090081910420b80142000110114,c26610c2549afe2d574cf930dc61b3bb5b82f1255b64564f787c417614e99c84,30ca6da6a5c67a1824f8e67745e68baa5885f6e8a14720bc3a1cb5657d2fd329 -72000284889b001c0019104086600010a0db86443008904308100618100001a0,7dfff7ffbc5cfedbffdfd5e7ffaf9efff9fcf5d7e53dbffa9fff5ff7affdfdfc,fbfbfffff7777ffff7fdb777f3ef8fbd5effffdfdefe9fdeefb7e6fbf5fef96f,552b2eee683a8d1bc8cb760760349e53c924b1aa1170638e3bed0e95d81c3ab5,5444864aeb5c3b4e37e7aa28db57ca52117ad929cff577e01db5ce18be258485 -dddffbcf7bb7e854ebdf512faed953ddedfacb39eefb22edbfefcb7c7bfe7674,e4c12d689e41bc1949c3c6308e03cc522ce91343d274b323d8f1e93a5b7292e3,aea6b18787369f9bf230b16affeccbebfc702919f98714a0591376241318e457,0e9739da0848179226e4ff14798e345390e22b819fcad91434c8bcb0a598e92a,1881e673cbc3b83398ceb09fd94a957c5fb9193d78fa33f17a731508e8c0e197 -0110648402822091800042600a8100aa4080414480a515ec086004c000203428,fffaefeffdefdbd5f7dce5f6fbfeeff3fdff29ef9db67fcdefef6fc7f36bffaf,2730cc0b83ed392bf3c271dd0013fbf3d0e62438328cbd097c4adce3a7c606ea,690cac41f6b5ede8a463dd105c034fa09b341d2922ba597446a4f9bebf0fd94b,4c1d2d5220a5b1abd2aec2894aa93449951de92aaa0a0ecd39c75864a0c3d3bc -1481002000072400000044017010400600491320040182022054434280000440,0405209c80400800000101002000140000ea00088024224484404800500a0200,00120430112950041008000811204128aa00180402010204220398401018c040,0b611d61a878cf3a12d6126a29eabbe3ffcb9583a5a80a2968d0eb31b229f7ba,4c2fe58d77069e6378992a16767bca9d2d6b275f4070a455563ac2d8715afe0e -00400308000012061300408219d0102a4a1ca04206a081501000580400122822,fbadf7e7e8ffebdf57dffcfbdef4fdbdefcf77b7fffffbf7fbffee7dfff6ffff,001c01a01020000120142060c90402b89210000002050004317610000c00008c,faafe1d93080ead470557b70d65e8d5da7f475f32f031fcfb1cbf9ae3fa02c98,303e29fb283572e018529dc733e109cbed78728412580ed0847943142b3deb00 -ffde473bbf7fdefcbfe1fbffbfef2f753dfef9fbffebe8ff4fdd77effedffd9d,01004820418485510918a0000088014a00050e42105540a004c15b0020210206,f7fcbfcbedfdfe6e7fedfffbbf7e9dffffff13fe1bfffb7df7fffefdffbffffd,9b75b26219508637c655c5919abadb0bfda0b8c258db39259e86b575108f992d,25ae1825cc52a3c11cd4890fe8a69dd99bc9d79717e581f721fcc51c3c0b6fe7 -8c5a34d716d352f6bad1f164ea4e0e6e8c9f5a866db677900ed7144449bd525e,bfffedffebe4f3cfbfdf26efb7e3fd0edefee3b5eb7cf6ffbfff6b05fdcffb21,078810480004001a0129c4024e01012814108b08808c186028000000001031b0,a3cbc81cede766b0702768f4173ce5a7e2163541fe289ce63ef5e191aac9b011,64a31d11f99be2bb5ea8b0d94d619cb8e135e0858e42ffcb5daab3c7ac17bbec -2102a8210030004b14a12a0248842000080044054321a9800202008a80021102,85d00984e9abc4902f4430647ceebdcb9fd8486c8bfb25da9ce1f81fb3466634,895ecbc503ddbe8162c1ff6c364987bd57168bca292c1a3365915bac36388673,49ae8b53c540a2c9ae828e3c3c9ee09f4167ff4d10f07eac5ce530bc027d757d,297ad714d92471f7f058a6715a6e6e645a9c47d6cdb4ba1beee566bd5e64b8ca -ffecf7ffcbdaffbfa76f7eb7eeebf1fe4ff798ebffdff39fa7ffeffdbfff3f5e,ebde9f6cbf73ffffed7dff7ffb7dffeebbabec96effbdf7fefddbbf79fdfebff,32a0cbb709a551b6f3f772bf7d76ad5347494452ab3d4102431e5ce70182e2e8,7fd9901069581ed3c83d2b763d7bcd64cbed9d84e012c1063916379fa1e3e9e9,33f5c192923f65aafd900b92ad95a071c34b84904aca4bd56ec49da70421c482 -1001428800018b408a002a40320c00b006040004882a0021400b014880002000,042500006020a0094210220004036300052200b0010c804004040008060a8841,7ea626dab5aa71faf4772e16a4834dcc4a54d0894a61519f2c77d05d49815d17,78bef37549b702ebc5e491891cdff58b85b2c92f0de3be0f703ea719a866df4c,120b311c5008df00f1a998d0f9a2789b33dd4444c823e8fd68ec1956fd191b4e -fffffdffffffffffffffffffffffeffffffffffffffffff7ffffffffffffff7f,dad67def7fdee6aeafd58fdff5bff7f9f7effff9f82efefc7fdcff7efefffee7,3fcac37800cc2881081a04636df5a9ad2afd23cd5ba8a70d4a32addf92bdfb1f,da06355b9cf612036558ef275ce1de1f3b2e53c1f96b421563343dd67e0a5de1,4aff5c2a9a2ac9d27f1315c266c8daf71fe0570a0329f535a55c55215dc69e65 -0012082401008095014431300100298089a48410024510442000c0040609b009,63c3d6409687cf5c445ce1f4ab994134cf91564dc727aaedd66dc981b3b25907,010900008100400044063a1039c0008520001601495010040384301001411904,73595cd72078ee2e1bf095df744c62e35ebf68db9df736610099ac79967ab9ee,1482e2c970f1b7ecb87b98e9fee4b9648fd5caf2774dbddae2539e55313f6c95 -bfafff6423ef3bffeffadfbf3ffcf96abfeffd77fb513fb7fedfdefdff777fae,00c824f44a921204002b04146000110400a4208010a810009030ca80401a0014,382010012a0461000a81009102410202444108403b20088814020a048a4372a2,78ac88f3214ab55ac23faf1687e3ffd8555d731092ea7d7e6a482ceb0e966679,6b3df2b778eee60e0bf8e3d3bccd3b484f859ef56f9bbf3bf4f07f95e4ce6033 -7081430001010430004080100080001a04100c200028016004e092008600080a,270a0739067be46ef4c09c3603ac089bb26df5938b1bb4ff0ca53f8ea99d804b,054383bdd16b5452d7a96312a6ad7e0d4ed49abe5520c97241d8b1f16dd1b13b,3c45eea85f5e7cd6ba85b9eb7f15b59a1cd42265cd905d4e435e5f442a0a1d2c,3e455be220ac0128d47311e99f40666178c33e7947c47a5e70f0ef58fd2ed685 -9fde7dff5cddbfff5fbfff66ffbfbf6aadffd5f2e9ffdff37dbfbef732bffdff,828004c00070040c200c162282121401b9a015a108000401080404020886c459,5deddddeffff7d7f4f52fffaddbfffb6b7dde3eee7fffbbddaf9f7bbd2f7fffd,449fef121bfb01ba53b90fce7607bfb7ae09fd268df929a537fa20aadfe5aa89,168d346a861419295c112c9377f6e7554b719af2a54bebaae958ede2bc9f1499 -09cfe0ff544795cd0af3e76168de5e3b2785402debaca2a485d0ca40fbdfa088,eaf1d7369fffa743eaf7fffddffdff7effdfbd7f9fffb69e7ffffbaf7df7fffd,550014400c2086142000a0618400013d50a2111050216108480d040280480862,6f631b832607fdfc70f2426d221198d838479f8145cda746ffd7e262063bb22b,3459df22ceafbb6a9a369789309bec26f1dd3d5639094e3c9ecdab4912cf1c66 -7ff5eff7fc67edfcf63efefef9fd7f7ff9f75b9ffbbf3afbfdfdf7d5bfcff6f9,210291000000130c044140200920045004038084906000012020170002808000,40024401010300000485030948200083221b00b0d0800e022010e404080020a4,973ac3998290cd686983ded4471a000909c631e478721e02c1c8505287851866,2e49100b9c5a720e83c18eb6e9a03f261c8db41c95655c4b23a630a5b191577a -022988f088a80060080500493084080644400111008c158987101a5812408ab0,0000000000000000000000000020001000000000000000280000000000000000,49edd3f89971b010397d74c01f36849cffaffba78f4fee52e809fbe540d01641,a7dc4f379dcb683af83185932c3c36bb1e2b02476490171296d4ada945daf2ed,0e8959bf258f3d0d7a6b4b410bc8592fea3de0b2085ea51b55bdf501856af10a -4880010082e041100016830404004290290109081498800d4003044400924002,00041212050640802020444340000208820ec480501003300041893e00000081,75dfbffdbfebbafe6cb7fdbe97bff5f7fd5ff7ad7ff7ef6cd7ff7bb77f4ebf9f,b453921271ca648aac3feaaedd240e69e700f7b4b0eca23b0ac5fbb5b1035e89,46d7d84f6aa47d9f203826d9b1e30aa6eaa01ee540ddf8adb049b148e21a8020 -54d0248814090c000a0500100498a000806290200065090210310008e8440010,008c5010d80420c948194c0040026022c0000318580010c0744080b041200a50,8f49d8d51213eb73cc5f5c5e62fca4ff2aed509393b4ca272143111c77ab6b2c,d4ff3e85eecd72041cda47afc33b85068cfdf58ce31f0d8038ca632e122d0fcd,1bcf6e9a660fc14a57eb4d8173f0f0349ec92908958987fa29d7d7be0a166acf -ef7ff7ff3cdfff5dd6a7ffff7fffebffffe7bfe7bc7b79f55fd5fff47fddfd9d,200000034001400850008200104063150400428a0028008058a02c730824032b,0000000800000000000000000000000000000000000000000000008000240040,c75c1724f3b289cd726b41fb4287f8ad1d1165001791f181ffa0a4b5cb2220f1,1b00fba6c5017f482a3f3c1a373ddc03c56306753aaa282477782a852f8228af -8b1fc40f4e36561f73c9ab8c56aa052734bbc8ef48e9fc08a51b8091726993dc,efff37fd7ffda1e1fb7fdb7efdbf7ffdff377fd7f3dbffeffdfffcffe5fde9f6,0000002000000000100000000400000000000000000004210400040100000010,9c139d3d301849b7695f174b65e0a2c4d6bec4123f8e2f9b6f5fd56bb0ae015f,78fdd05d1c29e1dcdd2e960beac2ff36c06bea6f65838f47439364cb5fee9103 -fdefdff179ebfcb7ff7ea5fffb7dfbbdfdffbc3c7b6fe36fdbffbfdfdfb75fbb,21aef50eac7296d1995c7c316b91f0442c73883ba9a24e9361a8f0ef6bca533d,fffffffffffffffffefffddf7fdfffff7ffdffffffefffffffffffffeffffdff,473f5bc480f2562042e42e1467caa3f942f0788f8445a0a134f777ba01db29ec,384ebd0a995bf099bc0f524c04331d674d23ed9eb0fb95bf85bed080d52489f1 -ffffffffefffffffffffff7ffffffffffffcfffffffdffffffff7fffff7fffff,afca615eb00e2fbf7669daad369c7a22331cb1b3b15d9d8cf8edac6c5c340277,8410d2400204011a02490001a2040983204410040080700200c40a022a121002,7448df017bd0ae316b8c1210ff022a0366558e8179cb5fdb978644b9335c1758,2a47fc27d1d6511611ffc31386504ad7f83e04d44b10a66658020e45600f267f -be0a39c56f73ec640fc0fa099f2aca4aba7c8e673aaa20be473b2978a3c7c2a4,0a11014806608008b2e0ca020800110c103506304002488625020400f28402a0,000200a608204008402205800c210a080400849a840128154468402200011a00,b28e48f69df2f094e739e67069087161454d3ea5267b70ce451ac9b6ba98108c,7f2fdc8cc507505217548ca0fb2402c7daac455b3fcbb9b67ec5a2ef5cdebd72 -0020000000100000001000000400001000000004000000000000000000000001,637a4fa5ba1d47f7d1c8553c1afdcb9f7df8269d309690f3634ddc38eecedd1e,30a0d4dddef7376d021fc747d161e4d22d61786d256fc7efc7bb52f91329764c,307ff8e471d8942ec5596eb6c2040e2579f36e7d461afaef428e94cb5118db75,777db6976d39e38bebd02b90e1fd61c4cad6217fe824c70e8ecc26bf6d402c0a -050060c0360004239900080804184508010a0c00a218014816081c4000045c00,dd57076e4613d6a067f1d90565ab0c545b9f84b785aa7f3f0547a53771b96868,0551568008020010020724100a02840704720040084de0483404041890908230,5ab47c0deff279d7f0227334a3aaa25c6899cfd8375f0150723f0ff622b90adc,3b790076943cbead321b3b621a5694878e1170ad611a5fd29196ae1ca1b7b087 -fd7bcffffd86fefaf7af57eafbef8777ff17ffdbbbdbfaf777ad6dffeedfb0ff,0000002020004000000000000080000000000000004200000400440000000000,c38104240000208000084028a8020d8430060012406400428028008514880408,f3eb8714a3769892dd2746f61d39a97305b084d275ba3da89609346ac99ea353,368f27c14035c3011484b4fb6bb0ffe51da8ba521db0031c480665df653191fb -8cc8012fb1b7d967ab15776c01ff4d5a7afdefeb890c341ceabe554b9dd8b6ee,2f79833ba9eecd12b6f5b7ec49809d05f2b34225df507564f80c92db9128e925,00021000000000000000000000000100800000000020000000000c0080000000,2ae3bb185de774a9e369fc3548be9f42360532a406087cc71932d83fd68515b7,34987d5b84c854954e847b179dfd10700a0ebd47609340cfc1b132d806f3ce2b -ffe0ff36efe7ffe7f6bf7cebbfed7fdff95aedeeb7ffedefbffcedb5fdffbff3,04000510088000842400003009e030000b002400002008861123b04120800000,399f8a2204b420cbe4f07a3342bc2f29ebf3fece14ac130a70e98258cce77d31,ebaeb15cf811fb0d4dd9e3d7b074944bf4c36dae564f70e45eb25e20b6c7ebc6,5e1e9f7c51c9c5fedf5efa1b3f3faa07f7e4e5a4d4bc3db2f82c069427a98294 -f39fffdfef79f7a9efee57fbbf7d5febf7eefbb7fbfd7f9cb9a7f75df7edbfd6,a254217a0552c6276c42af4187c43206f8401888659c885633a2b81e903cac4b,10ffaab5eb43ea75e39d649c2bc1e10c0158f6b9118db8ea42320891923b044e,c700a9825e7c0b780c2cc4bdff790fc66e322898a91a9aa81e6797034b38a6bb,77399f431159a6aa7a878983c7801553d79592e21e28c16afff4ff5c10e8ae10 -2570746e9b3cf643d432831d01341c65e433c6c4dedfa9da263fa28d59252b90,d4ddfb28f15f7aa146fa63664989a9b8fa2deb935de8d720eaede9d1e781a04e,c77cdb2ffe67feefb7deffbaffdfeff7ff75f5fdbaafff6afffeecdbab75fddf,292ef3e010e07fd127aa20eea734798199bf4f6b9a827eaba5902a9c6b492c84,693c414c250d1d2853b992c439a02752358f7384a3e7742e53830cf892413c1f -a0d592cf80011199927bf5631ad755dc64571835c4fe6f0de82948a2845ffe5b,00000000000002000040000000010000400002002b2202000000000000010201,76fe7f7deedffbedbdf99ad7adf65dfffbffef9f9df55fb3cdde3fff7e7abfea,63b63e639fd8444fe30c8c91917185d551cccb9bd2908dd90ce241d40e1174ab,6c023ccbb707b7ba171056aded0717fbda11ac09d27143015ba4700891d7a824 -a00201026024030008800472c04322c4022000018200c5001160149920040110,504b2440294080009c40000260010001003125000084401da8c22020a2124814,90391dd457edc56c26dd8a2fac04881c33c1d823a28aa6824cef3eae56f59ac9,d0aa303f64be694bc5af6760890053c2d226b13e2b90e3b0a437f76ca09a153b,618b8839a8dd5e07f335f0082d097575f60c446e9f77ce167a88e926d7c23ebe -324f9f57378a04e2a2b00b0afe44cb746f13bd598acdbaf39f254a1bdc663f3d,83b24ba0831e439a2fee2d2619db58554984b312324e3eb7f7fed13c23a6f462,c86f8a9308e9ef7e855a1a9049bf9bc2fa5718775136b0c597ca9eb7d091ce8e,8d45b60b26e2f0331d84ab8570d9de424b45d8ba5b1b9d0b5f48bef6f07450c4,3f38a94022ca3a917a43d6d5f6377d5d6aa6875f810c9df77a4353f5d34d2a23 -ff95ff8fffebf7fdf7bfbfbb77bffbffef57e9fcfeb7ee5f9bffb77b7efbf78d,878275492a26f0e26b4d5660ef21fccf23b3bcfee7dda4f86acd980d80ec55aa,d77fb77aff277d35f8ef7dffeef9f9efdfffece1ffff31ffe7d7fdbed6d7df6b,890d4d683dc820dea9a96e912ee9332a86a4239d90c06e5a6709c1db4146d2aa,3b0db835ef1350548bd9946ae589c7b13ce4edab49c79063bbd0f9b26051ba73 -20a06593402089d000100a000141a4202011902202042a20040921459080102a,efefafc775fff65bbfeedfeeb3dadbfff3fefddfa7fbf4f7ffbbfdb5fdf97fed,0101000040000200000000000040000000000202000000000000000000020002,ef53e828ee5ee392645d728851aa68017c93f20763aa0ebb96d5c71448d0cd4b,229037c821809dce6b3ccf6d514d8e26b76d7c8dcf5717c7d07e6254fe5dfbf1 -6d5bd8418740fe24fd97b938a93a865676005556939407bb3fa0ca7e83d74e07,7df6f7f96ff7fbefffd75edeb2d7deafed3f77bf3fbdf6dfffffe97be7fc7c7d,0102210100442800020008c808400480091858902508001007800013592040e2,516c50c62506ffaa72d6ee7942c0056b212424b75d18afbcb9d316b3dbb9da12,22c944a249d9aac28bb2252426a982cd03eaedf0a22aac4d8f76dd7ec5cde938 -9fdfdb7cffd6ffeebff7ffebbd3dfd7d8dff6f79bbdfebfddf3eff77ffffedff,031600194010104105a9000810003010086a081690841e008a000880100b0280,c05915c18ff9288e98768731dcf16fd4a3e6e6152940bbae09110c1241f3f3dc,3b14f4a96d918fecc11da9a5d5c575b8b680a0ba7ac071760fbed78722b91c3e,03b741226917c1dc3183735299f4fbabd0f55be98de748aa55ece454c9806fe3 -0012000b000a9224010490080480a4a0a84c03400840007e60a8004200429040,0f43a47b3098e227dc180ac1d1628e8b2ee7508a43830871b7e5da85cab02660,0000000008101000000000000000008000000000100000000000001000080000,d62db2466bdefaf96290b3320e46790f07d09ca07c51ea9962177c438b004670,67904ccb66df2419ac13726369460f5bc1dfbfc5ae6f8baf285f97b6b20001ad -f96fbfffbf9ff7ffdfbfdee9f7bfff7effef5fff9debffdeeabfcdcfeff7f7e7,f7eef9fe9fffb7ffbd76fbbfdfffeeef7fffe5dffdfde5bfdfefffbf76ff7b7e,aee7e7f7cfefffffff7bbb7f7ffff46feb576fcfcdfffbfbbd8bdd8f7bbff36f,254b46b96ef2afdda4d30719f4c8242fa11f3a25f1ac5ee5496413dabaf70eae,18102a8aa55a9099a9973a056f8100cee36d745d9260e5596bd830fe8ca800e6 -dde17edfffd6b9ffffbdfff777ebd7efffefef1db7fdb7ff26b73fdceefef3f3,ddffff7d7a7fff1fdf6f7bffffbd6febbfcbff6beffb7dff1f7fddf7f7bfff7f,62f70a036de78c6b7f7c7b9690ba6cf9d3371a05a4c10673739cc7fb154effd0,7a84a9ee895a72167e7c3c9184e6c30107fcdd1e48d0aafe65828f4ef9cbd0db,748cad3943ee3f832bb3ad3741a81850c4e0d2cc958bbbe419f4ba4462bec62e -96ff6ece6fd0304287c4821e48d4c04da9a2ad630db2a903aab2de21c6afcb2b,4288001004ea6c5204921004021a04001220028b8004018150a0201386034086,5022209000a00400048403062185050440a0026004004840a001440400420008,14c5276403256aab7b4d23557597ea13f48ca0300e26ce9becbd60172bd0fe9e,3c1e51e5148acdeddde4439de69ab113f1be734ae678622d8b63d91b55ec8108 -0001801001100000000000200020000000800040000010200001000100000010,eff57fffffaedff1a7d79ffbb99de8fffff97ff8dfdecffdbff7ff9f7ff772f7,004882110000c5224000200026200600188810540020268d0040800408080000,b47a91105af112b20fd40c53a5bde415af2dd848d19df5de63184b2008531833,712db4c9970307577b5bd2420254eb6fc40f42cd339c600fcf1be53c04698c3f -0e005c064032248000850b035082262040840801022ac0041c02025201a00801,97bfbfff757fb67df26be9ddb9eebba3cdf7fb7eff7ffd4d77adcf2bfeef7fff,7ffffbffffffffe7d7fffffffffbfff7f7ffffffdffffffffffffffff6ffffff,a44241420540a535a2d2adaac393dc95fb58da1310c560752116652e5ee7ce23,0753bab4678927b4a3693346d5272a2459f8332f8623d81d16696d792354c059 -58a0a0001730e025000858208c10080000a044080b0001005080800200050150,b7ce0111146139655bb161e4e3e217a298178ab82f2d75265cbad6337c49a5b4,c2704c57489f03f0ce291425947c2f43a20043494eacbbc4823a54a927e41fb9,1497a540e5769fc358f10bbae4e9b0fd798f1869f1105d58dbd1dd084801e55b,29e2f8760936492247a2198a0ee2787b07482e42b2ce8671af83e9419c158cb2 -67ebfb7fdaf5ffb9fdf9efdf7f7e9fff77f9fdf77deff7b6fd3d676f793fcffa,000708c250448000800001821c00a004481243c00fe200110c00004000880004,ffbdff5fff5bf7fbffaef39c7fbeefbfdf7dfffffd7b4efed17ef4fbb3bdfbef,bcbfe065ccd9b3395b1356b59dc026a899ce0667a6e7d44a7f4fc0dee60f0252,1df7553c177984713d235e53f61a49cda05c6fc106101bcf99c040d7180c18a1 -2004004c4405400504480a10400c800040b026282080308204101004042c2002,3801902881100007800804440a00000a00848206040005b040508e6945040830,0100200000000090000000000000000000000000000000008000000000020000,0de09075d797f06ea2cc567da753b8aa00ec99a4534d20e233cc206d7ec65224,154030f141cb923d52644ca27085e030bdaf5bae3a8c8d3ff998196045e239c4 - -## bitcoin-cryptography-library: Random cases with 1 or 2 bits set/cleared,or uniform random - -67b2755aab08ff02e3120fce55097114c4a29a908b95a97681c691dd54c88030,272b26ab61483d3bb563c0bc852297d9d7d5ce0396503ba203b76a19fb57661d,df47ee04c663d38d474b4220cdfd5c85c541514d18ed70b81d5c82f8543d4bf0,cdb5d24c50febb9df3e02a77196c0cf04c7eca1c1f7d863dc2ee39d0e1180375,53b7813c523866c8d028b4c0381c9934c18c76ff97b41db5f5cafc6adfdc3d86 -bba65568eb970fd2f27db6d42888f2750fa17090cd1c75cfa620d58fd595db10,bf856cd74b4eaa98a001d33c041903d864f042a57c543124da4b54f219c4c6ce,9a7d39b391639b2521b5a8e8ebdef6ae01d95683b9f7c930e0a1a08815b5048c,31bb6201820f1450cea3927b802d75cce1da20c2503e0084bb93acf5a94d8fa0,6efc9440a2f291363489021b4aed68f1301c28756baca98bca16579ff0ce7f27 -791c4be3d16d4a5e96a421f64a27318e340bb1a8d420590277060f7ced85fa9c,b3dc791b75aae51531744fbe993f81de311b0f3ed7f76f055b927c59370cf6b9,d12dae96b7620bb02509c46a0c21f904d8a2413c23b15c840b2f965cb95ce67c,82efde8f3f1a4f08571700d98592562eff4d780f74fbd65e18c2a4cb63075f87,06c7e8875464e181f212f1011584b6a5d735d3950874a949de9ba438f59118ae -540cc167ec5c336842034a8933d4bebd6762161ed87051dfd2f826460f9c9b4a,fda392622bdf067c8c7b20e9aad0d7b0d8f8468d73a8a530cceb1103636ed25e,5bdcff27f2bbbfd6ac0c7a8fc4e13d5dd4573ef6b4e4c3e5c6c89384f1ea0bef,20be577604f2e0c4a14bd3a2a09b2b1206257b49835475ca42e3b6130d7b4e4a,1c25c32873e5fc670ce6bd5dad85accf46225cba0526354ccd411f0869091068 -195cda015d35f87df89590364a453c62fd896b32c79cdf13e5a8fbdbe33dc35d,93775258e6190dea421045395c132e5a99d1825c9abe91c1aeb8761746f8ed82,7788a17b03b88385a7c562ddb84f663007558444273bd663c02d98dfb9c9f0df,710cd1d26bf71326c729dd72e909b02886bf9caa3447882b8c9b411db1f04220,09163db086fbbc0441e711163e05ce9139ea71c838ace97361e8980c1c04c733 -d72815d6a9fd8d69cec171017c647735d4a9b208d63aead0d9634c012071e574,0c30bbf00e09c8c5dc98587ef6eefdecf38ee6b65edaf01c2019f7ef477d6f47,b8493c1a676c2e2e881fcd504b63c8b22aac9ef7b8dbde4316dc095f7072864e,b3a6ec0cdee405cb472ea34a4759a1aebbb943daa5c2dd5b48d53be3e0d306b8,35c60a7ac75aa2a5fb924854a310f3f1b2348b092a5615489e0156aa87a9f314 -62368226ebd9b441ad3bd12b6ab7e34c8471300339965d7a4909c301e2674735,5b1a9cc25becd31a3f78808e53d9e80711b1cd9e55394f9cf815cffc48072798,39f12a0079f55e12f1d2303128f0b9726f4e38eda1901c2ee6a9ab1cce4bd3dc,bb97ff6940f26c88e69386c6d5bff0130a8bcd3aa1579f61556400ad37598818,78b662d1196bb4e5acf8ea112322b5e1ce975acb1945cf71ed5a626149a1de44 -7b8b02ea63d855c39fa2c6164aa4df8c060a74dc903b19a21c5163af4ba1e035,0b31eefa28d1bcbf667b37db446aebf8b3088dbf8c74ba624a300e6d44553dd5,5d5ceda7781362c413a7285ad4cab2af9919d86ed7c0aa0c9f3f8639cb4a9004,8aaceed5eb70d19185630891d12697e9667b52094e4303eff328b130d6e0a426,330caf265fe233444e1c4e8fb7e75942774e5b2f472ce0e5c7206c9aa992ab71 -8fe7e823b1cc99112fcc2bdaeb323cb1c3c7ea11648bb87a6891d6fcaa82ee77,a550e4d400051fa7940b58e6803b6adf3099e7d965a3eed3cad236e094b5c5af,0000000000000000000000000000000000000000000000000000000000080000,a804c641d28cc0b53a4e3e1a2f56c86f6e0d880a454203b98cd3db5a7940d33a,2b5db8c453ae557d9b1a8cc768f92a6d928b905a8c9fd9eb2438b362a481f320 -9c6311c88a8e0e2bffc7a14fba755f013900dffd5cfdf623bad107b5e315ba6d,b9aedcc500d2150cfcad9f24808a73300022929497c7be5de5d3a42eb52f9ced,0000000000000000000000000000000000000000080000000000000000000000,efea68eca7a6c24f4e65eb211c3191636850e0acdc78d8996114ef13522f001d,2fb34e1c851e7e0cf758babf99f3558ee96b7c2c2c52fd034220f79f286a8ecc -bba7ee905b2754d93ee534d28bb49310ec58e937aa8381948dd1b6642915565e,e0ba00d5d16dd96c5dfae70a232d7535f4581e07fe3f7534452a5ee46a3c5826,0000000000000000000000000000000000000000000000000000000000100000,8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c,713d99fd142e3bb7093ee47b49133c5f38c76d0f4995b3573213001600f07aeb -66ffec60889c0a4d9476a62dec203cb02763d7b03c12c3b889ddf448bc069e4f,5fd36e79b20da4e128294888fb9f3812e0ecd43ca2ee7f62b1d1b5e1a31b57d8,0000000010000000000000000000000000000000000000000000000000000000,174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c,2ea7ef6fffb3ee7f10604363399081713d66ed7439749547dcd4c0edf2553c2a -33d6af99d7fb1ab2b1048d1def35c44d5a1725e73a8021483c6233998759625b,19d6bf0e4e35dad89de617bf5319811a677a6adc29430a1739756e47c96a2fae,0000000000000000000000000000000000008000000000000000000080000000,5cb65856175a5a0b3649d00305cb2b8e1a5cc0213c1da88cefede9bd7e9026f0,44ec1e4502869dd1b6d5a3e4a4536905d43739578c1a906476106937c4d1fe79 -c8f7d50187fc0140aac70b63d0770f305e8da29ddae43bd7d1b72ecfc9303c9d,a01d3fdfd23a9699dec7137e1cb18b8869e5899180f966795fb788bd9df6126b,0000000000000000000000000000000000000000010000000000000000000000,213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754,3593bec388def9c40842e154a3595e4ff14748cf217060a4c3ad551c64231206 -1165dc8ffea152cf35aa8cb0c06a353601bf3256c05cbb9ab0b50beacd734215,b563e840c1f6387f1882ab18f1827b38ce1784bb7dc78f16bd53f8904da381df,0000000000000000000000000000000000000000002004000000000000000000,6129fd509ee1a1b59e03dfa8fd6c2ae800f1d96c8bdb1114f9b3670b4d45862c,5c30fd05fb963e79b84b09236c5a7f65033eea0f49a680ee320b87ec7ccebd0d -128259c084c7dd309e6bb9c3d77e60b68ec6486a1344db56fc1e67e667302a8f,cb0239a91c292237037fa5be54c5fdf5417584659d73bd6e9d4e633e62063d04,0000000000000000000000000000000000000000000000000000000008000000,a94c6524bd40d2bbdac85c056236a79da78bc61fd5bdec9d2bf26bd84b2438e8,119f7acbe83dd8c1220063dacdd9fc8511dbfa08c51cdee6214e04b6271211eb -ac2c5c512363a501c261806c5c52dd8a2dc9ff9c313193b34e139c68929c4a95,3085e56dd632193eaf4830877c5a69a09c849be2b18c0abb6b666a9c3d819c20,fffff7ffffffffffffffffffffffffffbfffffffffffffffffffffffffffffff,79f1265e9e8233849db43fe3536b60d3d9eb2a51d3159b7c515742b3f0ccf617,2600a55eea9ede3d904bc992fdcc779ce9d3aa07f1e47bee240c3b3ccb95f666 -ff3917802281d6eab764ef5ed5848d520336a25730ed012df7f820de112c6d2c,dee956bd3b49301cfd3f709ccb49aedffc66c855dc01d9df693c470c35f28550,fffffffffffffffffffdffffffffffffffffffffffffffffffffffffffffffff,ef54981088d0346ae5d2b5bbf68a29f925f84e0e9fbb69e48294f65220b92db4,112a18047dfe3b4c01ff9e0093261ff4652c2ede0c63fc89b1956f2e49195adf -dab4394d53821668ee5a851814f8665c0ccc323c6e69e9aa138fd3c51be720c5,ea88ddf3cf66733ea14dba6461030fb4ab428aa16c669f454c3d36d7be51416c,ffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffff,e340eb146940c604207899c5a069d6abf9610612fc0d39b1e57af85206183399,2058f473da118013736255811d645030b77eb3bab993c7a3f2fa6dfb8203deb5 -09669a6d19add4dea4694b3f031ebff1f570a6db625de1086f583e640e307eb7,922a71bc12d3087ae9de9d28a08446ccba0c8064bbe01ae1a5ef03de9bba5172,fffffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffff,e847af346ccdaee0e6a5be84247d4173bdcdb84a9dcc3b8255648a26875b9574,38a8b4b538a167b2c19b1ef6268209d5a0dd24ee7d276b576beabd6106ad52d0 -decc3ed34530d05160db48ee4227c81439c7427d1e24cd467f1ed246501faeb3,8ab04f246da0a6e38fb0f63b801a0f3216b894995ff08fad7401af8baeff33c6,ffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffff,5fe49481a1b75fdd07ad271e3da98a60095af444dbb447ca9756b46891ce948a,735d845eee8a972a4d1e6d95c5f8318eece3e984840ce96be72c345c671034ce -23d914579a2e0530c6f3d68e0adf35b04f60375922be2750060e174ec25e1e4f,522517c4e1aa6b508da36706bb56917e2d84e13c1237270e1c7b562c7122dffc,fffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffff,49c3f4ba3a946081cb634ea9dc636c8cfc30d88427c7a2a2a12f853eb0de2f70,6a5c39ef439608ea8e36636cdd162b0cbc3841d45198efb4f998eaf5fb860796 -b5fd7f092432b084037c947780408a3d37aa35b192c10c1db6389563871abd33,932048851eceb7310ca6ede1dc2cc5b62f42fbeab8e7ff92f5b897b37fddde8d,ffffffffffffffffffffffffbeffffffffffffffffffffffffffffffffffffff,57d748985f36957f96a7cae51bbf25e75c53aa853551472f6490e685dff4ba2b,1c4dc75c1430bf843c28a1adeb4ba47f82afa965c6d5ed670826bc8d64e64098 -5049a09a4f0c245089264daa8d3140e6876325924489ffc53357e8672a0ff256,a3b703a424c0786bef127eb84547fa05c7180cf7c4416d0c8bc67ca393394f4b,fffffffffffffffffffffffbffffffffffffffffffffdfffffffffffffffffff,1a9f788563ae0a35876dfeeab66cf174a7b33d6a1d85e74ac5d92c7ba8b21a8f,6808dada320fd280258afccb61335b321ec2c4ea8cb9cada0cf58ca1e49d0435 -514b42576f9d13af98ce1acae7666f55995b10407d7ed21b57c8f1b27a12e399,0000000000000004000000000000000000000000000000000000000000000000,6abe9aef26513bcb79afb23409aebf352462f5b1336d9613066727b71edff6a6,6a32a1895639538504e0a396b562238b05adf321c207c7c2060f6d213fa9a07a,7fabeb9ae54005d239da95fbefadfc64d7a1caae208becc9d34a873ec5ca3697 -9c35ea4583f36f02aad6f066117897bfe9f2eb41a82dbb8a5b9bf607ccc2a396,0000000000000000000000000000000000000000000010000000000000000000,9575bfc1b97935fcca9bf7d4491ac7a030de708972dd230107ffc88867c85359,9d3ced7d84dcbbc9def7161e9f87fef9b177e2d61400f880396db5ab3d64e31c,1f221b0c4f1aac31f0058507035d7cd8fb01467b8d6e18b7f179d3b2f772aa1a -53aff3a714431b67c322e407f700d265f41137da69515c690697bc969ef5026c,0000000000020000000000000000000000000004000000000000000000000000,07d936e13b2499a597c5061195de82b02572654afaa72ed690cfc510ae6f8070,a07eda4530e3bbb2ade7d8e13e425508049c58cc63b2ebd00ca5f1db47a0f720,47b707952e7d997484d3960272a6e53559209007f1dae22f81279acbbbd4b59a -1165d4b2977d9038080ab2aaf6021f65a390e3797fd18ac42906cc0b38ac04a3,0000000000100000000000000000000000000000000000000000000000000010,f97ad8e4937e58ff21edd4f586e78e703a591dfc41e4a7cc3a8ba8f553905018,017595fc279dc740128c425ebf9e4b7dbfa076d11ce6f2798bbbaccefbfe2d1e,71d2fdb89c2e7a869a787564dad216751dda112397a7e806d58329f2c9c2ab4d -e0f160a15958f2c83cbdacf5a69d8ecfccc5a3339aa56cd11d490bd97b015b01,0000000000020000000000000000000000000000000000000000000000000000,83a2e6494c8764247afbdaa6bd8d3048e2baed4acb706192edb325ceee27923a,42c346cb29ba3c816d3ff76cf693dd26b6e1a1fd8556964a1b4624534e601719,67cca4e53ac92c9559bd67b85f65150dc54460588ffe1c5ab28c0cd269e71d44 -6cb1c18078887f5a6bfa9b3c9f99223eb34d131e71df095c82e8013a6f5e17eb,0000100000000000000000000000000000000000000000000000000000000000,31ef4466e122673a631577d89be009e467f97c05d86d1304de35a2b913db98a5,73d7029cb9b14ec706979b1f2180ccfce50f7bbd9887e52cd59bce512c76cfc5,5fc7d252ee4dd84b2ad4417060b51aea006b54719add87ecb9063bdeeb8c0895 -b2734713ffea4fd4566f1cfa3d1857cc2fca33f97751de819e3e61465aefbde1,0000000000000000000000000000000010000000000000008000000000000000,f887710908965a5f53d12380884b4a4378f6664e2772049e4d3b02bb4873f71c,c5174407701116be994b37f1a9eb58091f5fe23b7c5bc623e8c93cb89178bf61,4f450c8f3b1c081864bb6ad7ad8dc584e73652a153478e05cd529e08bc72e8db -34104708e788cd095e35ced0c9946189a137d509e172bcf54c87f9a5cc64636b,0000000000000000000000000000000000000000000000000001000000000000,743b882208bf0fb6a0f089bcd5b468a1b3695d600cde0ad6d6556253c9f8711a,a1dcee10598ce96497ab6ec9a6e657b74f370b313a8c4a2154ea19824c8621ce,20a7460c9fff1cbca88e593c523c7c9ee8a09f5a3518f57bbf0e0fe628f8a30d -fa8e8470d14c481ca1ad489848bd1bd73c829e76568cbe9d4942d30f6e913df2,0000000000000000000000000000000000040000000000000000000000000000,0000000000000000000040000000000000000000000000000000000000000020,e4ec5ea8e6ccd3f9c69e7fb88ae5d03391493ee17b324d092258879a2eb1eb98,61ed11d105b997d282653aed9feac1f1ec372ba309e23d1d6a78a4caca814cc5 -ffd13526b702e90ba676f294ab418d542e5df1194a99f6f857b9bdbe5d9f3a73,0000000000000000000020000000000000000000000000000000000000000000,0000000000000000040000000000000000000000000000000000000000000000,1a28e5042af0c0f6b436eb590497db5860011f4580e1765885289f612380441b,6d84613925a8cd0a8c6a8debb2bcc015559cf2cc88706c68939cdfc834929359 -a8296188ca80162411eb474a304c940983917a0252b898b16d291ae65e1ef967,0000000000000000000000004000000000000000000000000000000000000000,0000000000000000000000000000000000000000000000800000000000000000,c15c8c23d90c8e35c1a214dde2d4383c0735ae45bef61f10aa1a1c255984cf74,0da7fd00650071fb36cdbaf260e822223bff4673fa20ddd6d197d475e44cd056 -4cb73dda26e4f1653149db81bdb3707c104b816081dc7a06bb03c275f8e61c22,0000000000000000000000000000000000004000000000000000000000008000,0000000000000000000000000000000000000000000000000000400000000000,13d1ffc481509beee68f17d8ff41c2590f4c85f15268605087eda8bab4e218da,2adc4b0250eb76a88a6ced19b61f1b76e1378b8cb3557dcc26f324af0a1ff2ea -c037986dd3ddc1648ac0076838bddf908066235ec2e488949b3af5ffa42b7102,0000000008000000000000000000000000000000000000000000000000000000,0000000008000000000000000000000000000000000000000000000000000000,3c4e089cd9a6823d66a40cfc7ac96082e250e3149cf211d3b0e1103548dce109,6ad7c077878aab4dd0cf3746b08ac6b277962ce2abb989fa150e1e8342600608 -0490eee54c41db6aee81780795cb4608e7ea40659636dbbb12e78905948ca4e3,0004000000000000000000000000000000000004000000000000000000000000,0000000000000000000000000000000000000040000000000000000000000000,19cf034fc48b3be219bd648395e462cf9f374b6d86b2b59e2e1b16c6cde4f5be,0fe41fd0733e50dd9017b9f5f277c1451f3820da48db03a1e9b8e41b14f12db2 -1476feaa5d635accd7954e70e19d683b5f291adf0c619f106668a50028122d8a,0000004000000000000000000000000000000000000000000000000080000000,0000000000000000000000000000000000000000000000000000100000000000,da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1,327ccd64584cc83a7f3407cf6e410a3ebed73fb570e2542d6cdb8904693bdd4c -5cd964aa07a82fe298cd69f919941b095934efc507cc135415e6271f044ce4ab,0000001000000000000000000000000000000000000000000000000000000000,0000000000000000000000000000000000080000000000000000000000000000,796634e3f1ad56f0fdba069d9d07bce2ba2fd4f373ddd3ba7777bf279f1048da,1fc3a6e16ac8bbfe0f4ceb296ef2f61ea3d118aee8b9d856395674730c8f6413 -08d9f79139c7cfcf11e6a65ef8c07891650ebc53e5b03be1ce2913c8b92125aa,0000000000000000000000000000000000000000000000010000000000000000,feffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffff,742474470e33203bd59cc9d727e235586931659c1490127b4b0796e3d3d6752c,1fd0a7f9a0452d3df9d4c7396defa03052c345d848df88f3fceb71b927054048 -fbdf50c2bcd46584675f02db823f4ae8a8f39625e04838f91039f64579eb1a87,0000100000000000000000000000000000000000000000000000000000000000,efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,03eda9496347271a7762cb07c3fb4b734c1389460db41e4e1123e4845af4597a,7af049c5b645be1bf973f681c733c26491ebcd26e916e1dbee912641b2d08dea -9c416934711d1f74ea63c4d58e66d2eb40c8352ccb93e4e2795cfb70525ce731,0000100000000000000000000000000000000000000000000000000000000000,ffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffff,b899388d8ef03c0c0817f33b320402859dcd969a033f7c33cffbc49d383d45c0,502e163930c700bf789fa36efe1284e4f657f685991c5300058db3021e7a771b -7e9e0fda16252ed91bd7d45c9b602d34a4ddfb50055fee320a12091b56f140a8,0000000000000000000000000000000000000000000000000000000804000000,ffefffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffff,a27689d3183f17dfc613eba9425629edda487dc9c9ab86facfdb62a475eb5930,51e6b92ef60d9379562f67975575bea2b67457d6f2c33af14e0eb0b6bb9e57a1 -f58799fad606d3c5ff2af40d556a531dda571f066f83ef59686199498d6fb4cc,0000000000000000000000000400000000000000000000000000000000200000,fffff7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,3c426935ab57ac91ed8e456ec1d26a5a46c58b2bcc067f197fa3518eae586980,56f7d48049688e35260f316556aa5f412063499fb3f1638fab4e76e70616d76a -ea7c320582848c6c55d997ffb4935ac45b0b7b8769ec09b08c3751db133fa92e,0000000000000000000000000000000000000000000000400000000000000000,fffffffffffffffdffffffffffffffffffffffffffffffffffffffffffffffff,b6b64f287a5671b4b897d4ceb505159d6451c4e4e247ac365b5fc45327ef54bc,4cafd0a38e4d45fa50c05adc59cb90a1b6ffa2a10ec35ccf248dca14f3a52b63 -d6e02d425f83f37ef407034991371d362367d38078b43096a44627c5448c0c4d,0000000000000000000000002000000000000000000000000000000000000000,ffffffff7fffffffffffffffffffefffffffffffffffffffffffffffffffffff,806d81ff750c2e735b6c6a63186b89d8aa1c747da351e9fe7cdde71c4c66c60d,16776820d1d183e9ede847976a0a299718b9381e96d11371372e8c6cefb59ae8 -12012fd903ef3ab37645b31dfe36bf45921e911afd409c6052fb8024b781fc8d,0000000400000000000000000000000000000000000000000000000000000000,ffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffbfff,4baef5ae7bc766db273af404b8cc2823b7edb3ddec22afc99c556648170897ee,24f8cf5667f3636d5356a586ad3982f06a91f2632f54015982fe97c0ec1eeb02 -a50a62b2e5c26ce913be2cde4198bc748d6b10017e7d20d297256dbf6cc4e329,fffffffffffffffffffffffffffffffffffffffffdffffffffffffffffffffff,f632687f2bf9e535358aa6bb0d137bf449d3bf529e131f9065f9b30fcf6deb94,5275beb5f922dc142f1761179398f4b39e3b046039b5c2d6fd7c21403b67c123,18c96833da47cf87284e7a3152998fc46d34224d6cad32ee860934317ec20f2c -113d828f5cb2a12d355ed1d675a9a155cfe526a4e989b6155d279df1be37a0a1,fffffffff7ffffffffbfffffffffffffffffffffffffffffffffffffffffffff,177b523f5048a8ef1b69ac9a3b62b65b45a52986301468c28636c2407f99709d,b239a446139a6b87fdf7a895f19f4b98dc8315129fe0fa6948647b898f539efb,13102594853b9cc1a593a070048cb7ad8185a827631eb2e167a086169d270500 -7569b65f9261aeb8ee55fa8e81570d61540b3bc780f0838931f11544fcc2d916,fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ff,2afeb411d480e2c78dd6e048f4728f2ab2758f6915aae91516dcd6a36442dbdb,6f60e3d58d0ec89d97a923e66b7e7d261e248663ebfeb15098032b0f8e7e3ca0,306f0dd068244d7b97f04a59596891ff5590323afcd100bd619cce993d014263 -c22988e5f2f753b61656cea70123f6267f3b4e6f05a32f3110c3a589382cda0f,ffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,b39116663abd8dff64076321db72240571e279039c75fc629724327f24e55ac3,048e2c879241481212f388371d0c78fcaa130250f525abc9c432dc3b2c094373,7b560d2c8d77096d89743d82e3e3d9705a377e1e73b134206b851a574bc313c9 -b29d897c4ac2a7f56dd79a41c75452bac7f2c94a265d3242e3b1819575462bc7,fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbf,73807b022e0ce70644c0c8388c6f91a7e331f9cff2028f1532f75facadfd3864,1679c7c48d8f3cab497dc3fe58039fb6d0227f7b7e78d59d90cc1a7977084b3d,0cc17b8fe478c0f8473046b2a9b4da0f8a6f45bc7af6fd7f466061dbe06d8bd7 -151a84158e4acbbdc465379802c81a240a1eec63ccd5b46c660f35a8df3c3700,fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,7d45a45545ec62083f483ab9cab76d28717ebb8cd7bfe2548cf10fdf142a8543,675b66ca7614424151813d7ad99f16b130b35e73f59b476f55c5881e237803ad,2a17798d66df239c4767cdf940f1d76ba65f0b37c40a5105d350266192710897 -3c1dadc69958995d7652d19ca84e74a9a6cb536b08f47b374519b5b981a525a8,ffffffffffffffeffffff7ffffffffffffffffffffffffffffffffffffffffff,5e5f098929dc639c3f05f9cc8baf70233a61ad513bb9e9bf7097b7ecc4345728,e135e4ff609c0dba5ee3ceab5355852b49e96f3591cbd9f557adb8ce89ec683e,5f85a452d9526097e3ed902b0528a23d83dc35fa8d34e53b1fa643b0f04ff399 -4c5841e4d71f3b81cb3f90994dc58f3d65907cb639895c79975110e8bf329a23,fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdffff,0d5ee5c5339406fc4eb6d77fe574529e03cc14108177461b15651f3869dd7636,5995f56473200bab7ff6e9265e150a94868954186129e9dbfeb947106931e737,4e00c50f18ed43760d3a9707b2754c0738f2720df16fdd97a0641b58a36883ce -732fd6d5fe99eda0966fede0f1bd43cf34a450d7e8af905c99d544a6cab78e50,fdffffffffffffffffffffffffffffffffffffffffdfffffffffffffffffffff,0000000000000400000000000000000000000000000000000000000000000000,58f099116eae4e650813fc8698df7f5cd50028649f853991e3fb545f4ddb7bb8,7a2ca587ce23aee5538190ada90f516156f00930b38d6a716484c5ed588eb4ef -d216858dd1103129929fbb3c33c2b83a1d346db81bab298ccceeb67ca46c8109,ffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffff,0000000000000000000000000000000000000000000000000080000000000000,2380c09c7f3aeae57c46e07395aeb0dc944dbaf2b62a9f0c5e8a64ad6ae7d616,247a3e35f58c8eec516a71aba4271bbec20235c25b6f35c9833623c64be23d5e -24b61e9746eb7a55e0fced75505420b743864bde5c07a53655d8ee66bd1fe319,fffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000200000000000000000000000000000000000000000000,4f89bdee3771d350dad163b04cb18ad67ce5e9c55b58f0e7231047a60f59dd9e,671a271fd2cafaebf5442f49f1ab80d46271a6027fc152caa4d0bc5eafb014e7 -56f18fa55ccec7cc4681f50035a426090638b6651d4386db8589a2ec048c23f2,ffffffffe7ffffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000800000000000000000000000000,c0c01f34ae41b8cfe466b4c9c6a5d5f614f570d6fcbef768a81a6c8f05ff4adb,3a7756a3d6268a3fc1701576aedbc795d395d45009b5693d5f544b17f6df2130 -f69f90fd8579a66266d091c8795b2cd965b2ec936704db1c747616d453c83d5e,fffffffffffffffffffffffffffffffffffffffffffffffffffffbffffffffff,0000000000000000000000000000000000000000008000000000000000000000,6930fccbd9a040974abf210f12b71d4bc7b1a6205599b01a7275fb40e48ff9b3,4aa4a71bef67f08109eaab5f8041b4f046763ae534a1f6a6939e8990596019d7 -20c544a5438a515bf6d360858fbd0dfa65ce5037eb32ba1963fa6f5978aa33eb,fffffdfffffbffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000000000000000004000000002000,2c0232cec79c9ea2b5f3e2552856e5791a99222be42164b6b651c1e292f85ca3,6d8e3055c9cd01b1f7542e13ba5c3fe33592c9f1b7d4333abe841b09c07ce58e -cc564852c577153551b1d65e9ad0c61a01c5717b3dea930b4dc6e6b88ca3c033,fffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,0000010000000000000000000000000000000000000000000000000000000000,64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073,7bff10c0730ae847e6e65cf0945ea369005a25df1dab0750146f0d39b6122c18 -04586ab1e45f83e02cafbecb5e289b487e9de34f8d995d0958c90705899bcf42,ffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffff,0000000000000000000000000000000080020000000000000000000000000000,a9e2aa3aff4f65a192d9c8385c9cbf03032fe0b541454dd896d74ba0c6a7734a,6b5a390deb3e0d7fb1c7d46911d7c90ddbf250ead2cd00598824a0fa4596e9af -ab220063ad78873ff6fc709aba71832520ae00703ebaea121b76c0d2f47ba88a,ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77,fffffffffffdffffffffffffffffbfffffffffffffffffffffffffffffffffff,4c0c4f9607428942558d420ec3597e789aeb9d7a7be4d8149ff24738795b08a8,3a3740f92fc6e9bfdcbcffd3c7de78bc9da0f51cbefe170638b01e9ac0dca473 -63fdcdf438af6f60a5d9ce0a2f59a64a0de90861acd06f3e75ce0e7fd7be8777,fffffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffff,ffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffff,0a47cea7d342cb942bae42e1446799d598b95a5dc8ff46a84e2cc56b37202dc8,7479f3772aeda5a973bbbee1c84340a5902f8bf06e769d699c2658768a3acaba -95d48daa7a384535dc9ab15b149296f9de36e0d7ef547ecd4994344df786aaa7,fffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffff,ffdfffffefffffffffffffffffffffffffffffffffffffffffffffffffffffff,6f41c992cb653b0e36521362111273094ad2254431c983bf42f6287c6f454721,72f7d6210412db39cc0db3aca6c6309cc64a397d639b0fccf99f60bb91977874 -8d1a84083651744f691ab50bc7464f180cac657f1dbfcfb50185893f97306e23,ffffffffffffffffffffffffffffffffdfffffffffffffffffffffffffffffff,fffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffbfff,97c24b2f804a67ca5aca3765f516806b6fd699eeebfcbad005ee38c6e5c63dad,0a3b7a328dca453ca56ed6385100cc613fc438adf7c2403af2963530d23623d4 -25202acca69844fe0a9d19447c663f7d264317d843027ab3ce412578dd42201f,ffffffffffffffffffffffffffffff7ffffffffff7ffffffffffffffffffffff,ffffffbfffffffffffffffffffffffffdfffffffffffffffffffffffffffffff,71925fb4c698e3b2ee7256dea33f50b43c34244f5e56448766fd56afee002efe,781d44573f6625a995315fd15a04cab788cb70aa7dd46d782b8258682d82a490 -04c48382b7759d195cd964c07725f8fe70010741b542be33b8322a8ede0ea96e,fffffffffffffffffffffffffffffffffffffffffffffffffffff7ffffffffff,ffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffff,54ed32234b98edb1cb028a05e96e16d2cdc48a5e0b3465c5341daed87fa3d37e,140a8e197e8a1775ffab1f41019045fa37164f8f1f3674219275d2cc060fd5fd -797b2ae0e4ed81d165d86c449e0ec9da1115a7203df658484bc42699681289de,fffffffffffffffffffffffffffffffffffffffffffffffdfffffeffffffffff,fffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,0d0a29484f90b3f47ad8a5baff8a6f718eb1cb6d92bad812df4b23c4f4fce7d7,5e4111999332017d4243d4cbf8f0bf7d7447395f1fd88117ddf6d0424de6ae5c -b09d8c68edd9e21e3cc36ce69d0a1511e0602311071c1ee21777dcb1bf5edba2,ffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffffffff,ffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,3b461b5a100aaa65220d9d516c730fbbd737e6d351adc08911162e57836490fe,6592abcb29c318670350e696a9f102780dd1270e0ef598e923b67033c1c55246 -0002000000000000000000000000000000000000000000000000000000000000,e09fbc3b96a7bfd5d9d82e1498ad474817efb957d15e908dc4b0ac5d44ac1d25,b11f6437748f82b7d49a330ca6943c88e0c3263fd38fa4f675e15de3e742e3a2,20256b206cedd0dc1fc88aea92b7d592f67629f094b05d9dbb0b9020e4002d36,228e99010aeb372a89410195dc94ff7caefbd06f102183733ac252d4cf6cd51b -0000000000000000000000000000000000000000008000000000000000000000,c60de2fa461496b6acb6a7f96eb5232997289c27d73f60cfafb72ac6cb0b5ada,d6037c19290b394958fa1036763d9043d8dddafe0a33010bc16fa5d5381f96df,becba1984469e8869c2203cc4617875a91085efdfce4587c06e3370f0530f8ca,3d3821145fa74142586b3e31f1d3e5cb4d6f28ef0cd110d05c31103819b1f067 -0000000000000000010000000000000000000000000000000000000000000000,fc83cea08c9e4bede48338c52f6e13b3870510e3951bc5ed1d449614c5e5a6bd,f4141f3f11bda1011fc1031c4d319769eaa9bc1a8ded559dd442d972f0dce735,1e3b1abb7bfea44e628186452a3c1cabfcb3e12b704d8e559c7fc871536701dc,525fb4eb84be41480079fb5413b0edf320f079c5b6acbf42d234bdc04db0a5d8 -0000000000000000000000000000004000000000000000000000000000000000,1ae6848fb105a85a7a964ebc3611dafd27318fe61104356297820598dddac998,1c0d0b196fb5e1eb7dffd53250ea6c814974c69e4176238c930e100816ac8a07,a5470552ceed8bbee5af25184ab93cc261b686d72ca54f01e181d1c849e2e233,40277d573bae90fd32840a1b46436c4844cfab79e91a33cfd7ec63130e93bf9f -0000000000000000000000000000000000000000000000000000000000004000,48bf282374491cbe8dd7e47049ea28269b0b2893246aeee3002fb16a97451e3a,48c9ba38f9f29c824365c4f7f22759741fb26014e5a1c60fbd9bd80dbc93f8dd,7896842bb52d4be6a14a58e94bb47227bc591a3f556944a90034adfe71f29920,78cf96d63c668ef3e20d58109d6849fd373593aac1d71872b302ed8431b71555 -0000000000000000000000000000000000000000000000000000008000000000,65e234af263f70618e92a31f34c35c09c764546398ea859d60195bf5d9de493b,34bb99add46dbb999576a1da1b67473a3dcea901ac68a86fd946d127d0a83227,000cd7c61a24e8e579e738fa44a5e1c2e53ca8af203e76fdbdfddcf14594bb66,743c8e1263f44cab9c87a8ee129801795bc092f82ec471ff98ee767addd2a93b -0000000000000000000000000000000000000000000000000000000000400000,41216ef6c47e36f0181913f51e85bb659193670b8c01a262e25d19b1fefcdb75,eaacb18d45cbe4d58aab33334409a4359080c8208b408deb322de78bc0484e76,b6fa5b09f52e529b2a9cb1c9bc0637c88794515b05713a45fca313eb33aa8f3b,49d672b24bf78fcf5320b2f5d17d061358d15828640927fdf8f778723074a216 -0000000000000000000000000000000000000000000000000200000000000000,be0e4e17787df5612b1ba277eece04d9a105ac7c14b8fe77dfa0d9f210e3f2ed,c0582c6c119904a987348b4207f209c5e176bdaaec14163a7874f1e07bd08233,d69d42a179519f445f58a77ca9ef56ae74771e7ab513308776e6561b8bbf9c14,11217fd9a7e41ffb8d44ba46f98e55a32d143adb8d67754afa7ebed4d49896c0 -0000000000000000000000000000000000000000000000000020000000000000,1c3b8a1fd1893fe45432e03582ce73681435fd4659cfc344d4fc470cb738e1f2,0000400000000000000008000000000000000000000000000000000000000000,61dc6ef562e3e6be027d43029a9cd3279bca69b4a29a84d708147b84ddf34c8c,341f38aa4de14bf13f7fa564aada4aa27509b504cb578ab86e94465c1eef3d60 -0000000000000200000000000000000000000000000000000008000000000000,73761022935e0406669f4f381351c51d74fe84e62b0d02001a912400d3cb7129,0000000000000000000000000000000000000000001000000000000000000000,e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725,5234a1570414333397f7f3c53a2c25dd6ea63cb03e7753a65586521796f4f878 -0000000000000000000000000000010000000000000000000000000000000000,effb013cb15b96141d25570b97fe37035e166bbe830f94c1aef44ff46f941e13,0000400000000040000000000000000000000000000000000000000000000000,c9d85d5c3c7389f33c67956149803424d5131a2cb69aeb9ba57b9c96d5f47e38,139a1143cba1e374046472e1896c4bade5f03f07127aa352ea80d1814379becd -0000000100000020000000000000000000000000000000000000000000000000,6c2fed7e13afea70ef3d5fee22fed6c7292d9db305bf8fe116474a2c48a7c9f2,0000000000000000000000000000002000000000000000000000000000000000,4b30cbb7686773e01ec64110abdb362f88531a825ba172953bfee2233bcdaf2f,5996055b1fad4668d115a95e0ca08bad1a88194217ce728cc2d445901d93e9b0 -0000000000000000000020000000000000000000000000000000000000000000,17c35f9d9b995bf94c0f3b2705be669a36c893cd66c54335a2dae0c5ba380c8a,0000000000000000000000000020000000000000000000000000000000000000,f16a409c677a40be402f8efb3752373caced053c6f702b828bda222ca412b6fd,4a90a4e35bd2ed456b496940f1f59a1472686cffac61212b7e4352dc77bf4e4a -0000000000000000000000000000000000000000000000008000000000000000,bf976a1a19411cce7db778b454ac5d4dc93e5b7f9972e1e66297debcc2f9891e,0000000000000000000000002000000000000000000000000000000000000000,ed32cad8d2cc998cd25317d4e4b87088e9de4554e57a8d70c0c6b0fc1da49e04,03e78fcfe1f334865da62c2a23d2a22a26a3805643d670196de5e46bf3c84959 -0000000020000000000000000000000000000000000000000000000000000000,59a31d52407eff3e0a7a94eac25ea9d472bc87213c1e964b51fd48b595815de2,0000000000000000000000000000000000000000000000000008000000000000,8f506f0b6c0b6e9a57a7f36d970ca4e347cbc92146227642cbe781d9f5362d33,786ffae58be7948ac1ad65deb1c71cd20469ebc3039611245986626e12d22da8 -0000000000000000000000000000000000010200000000000000000000000000,3314b2092684a4fd54a3192e668ac25ee4fca326fe6fb44bdb452df0157d906d,0000000000000200000000000000000000000000000000000000000000000000,5be7ea3519f04bc6cbeeaa0344fc90bb8e8462f6ebd890560dae805d414ff9e4,4fc92a6994d59e0e5e1edabce16355745a9af5016d519fca8e9eceea4ff1a26c -0000000000000000000000400000000000000000000000000000000000000000,149c10b9d680b5a23078058b4f494f6bbe299cdd704d19a5771c3b9dbfbef6a0,ffffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffffff,153e6a5447390582c3fb55c2c10e034c337c4e630adaf193ce170844526d78a1,753dba43cf579c102326dc44531f5d3a6e4d8a6ccd4b4bae2c2699c4f900a655 -0000000000000000000000000000000000000000000000000020000000000000,6dc6dc0940ffdce1044c22c772ce59c3e4b9158444f961e5319df408b7ca0362,ffffffffffffffffffffffdfffffffffffffffffffffffffffffffffffffffff,b71fa88d5305bf7ae7e60d5da2a39c6148f3bcf1c2492963278888dab8e38f2d,614235093e04ae50d76089022e360c471e062a71b8cf0a0656f48abda640e28c -0000000000000000000000000000080000000000000000000000000000000000,578dd06b0360f6045c40e90c6366b35c87f1e2d6d2aa6925941f87499780a8e9,fffffffffffffffffffffffeffffffbfffffffffffffffffffffffffffffffff,44161f793ee6d5668cf56aa118ecee225cb86f91df3c98d65cec2d20c06890f8,32dab1b4954983d89ab1d5bd787d2c686fd5102762e691bc6eb7104e5900d615 -0000000000000000000000000100000000010000000000000000000000000000,d0c851d79436e3c63dabe54432bc304f654450998f57fdbcefd908e615f8fd0f,fffffffbffffffffffffffffffffffffffffffffffffffffffffffffffffffff,629c2805b4d2a831902db5a9460b52dc0edc7deb548b491112cae903085ce72c,30bec222985d3282b0396bde3967e0b80e5ccfebaf57adddadc7b217baa0a6d9 -0000000000000000000200000000000000000000000000000000000000000000,cba4afb72669cd3778ca34dc120d33ebbf94afbdbfac9ad343c4f9008b2e3af3,ffffffffffffffffffffffffffdfffffffffffffffffffffffffffffffffffff,b5f35f078c6b1119278dd516b386efc199484016ec7dca76d89bdb417688447b,33f6e708c19007f6e9c4793a62620999a8125e1677cfff3eb8d66ec3c882610e -0000000000000000000000000000000000000000000000000000000000010000,87cb5a0d7497806a0b162424fbb2c1791fe74b4e41d0fad3f38f862fcf20b8c6,fbffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffff,1827c8ea3785cda38e2def913cdc972f925927f7b2c979abc06409fd937ae33f,103aa19533e0c6897748969f4c77ccc6f28d4099ec709e2778e9082da618e0a0 -0000000000000000000000000000100000000000000000000000000000000000,cd647729dc28816c052603f6088b0275b2b64fab414d4385b5e271b78cd1157e,fffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,0d0a29484f90b3f47ad8a5baff8a6f718eb1cb6d92bad812df4b23c4f4fce7d7,040aae75dc8e069ad5c63f280b1abc1af7d42fc5b98fb7d9b5998a37089b0078 -0000200000000000000000000000000000000000000000000000000000000000,85b88246aaaf097e19a1a815604e72de7733b9b713daeff73ccc79c6785900ad,ffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffff,d5eaf8df0b42a050511b3c9ad3af283997f67f08de4861c51072c24a209f39ec,40b77acdf4a7a77d39e9f9aa86e5307c72e59e7253de0e1b84b4e0fc8ee35d3e -0000000000020000000000000000000000000000000000000000000000010000,0000000000000000000000000000000000000000000000000000000100000000,2b54ca6bfadc105d68e28237b460da6d886986d560224c008ca84a71a8bf5a9f,1cd63ad941db776af867687c60b9fd41439e37be749877be21dd6febb5ce60b0,1d5f1e723cfb498edd8a22820b6690f22ce87b78ba9f627c55b7c1e95616425c -0000000000000000000000000000800000000000000000000000000000000000,8000000000000000000000000000000000000000000000000000000000000000,bf53369fe474946a758212913e60f2800ed4ee82ddabc2303c093e174d02b511,8e74d378bca24d9d25e133b97718c273a767885134cede77db2c6fbb29c955af,1e8293687c0c2ad5cf4093983c809ed018b4888a3aafbc813feb5a3ea1f02960 -0000000000000000000000000000000000000000010000000000000000000000,0000000000000000000000000000000000000008000000000000000000000000,f743a8d4bb6e3cdbf707e0a6d1e85b6b2172385241f96820ad023f2e5210769e,6b058c450fe5cac9c0d7890370421e3314e99c49e6795b4a44f9ebbe8e3ca620,4762f815069a07a45c061a6072b5259bbf09b07f53f761843b6759903c6fc73b -0400000000000000000000000000000000000000000000000000200000000000,0000000000002000000000000000000000000000000080000000000000000000,a4d391be33611546635fbff5afac9b7b172ea28287e20949af3d9ce9b131fbde,a4ccca7af9ec9fd786573b4eed8bfe371d2fbed1b5924558195edfa0219bc7a9,3c5bb48bcd1e1dfe8ec22d7acf17dfaae81c3cb929ede6a4f81ddcc26dc02490 -0000000000000040000000000000000000000000000000000000000000000000,0000004000000000000000000000000000000000000000000000000000080000,0c05a55710a2ee9e42cabc8fa0f22548e10e6687c6291e0359a2383bfc555daf,2da99c1ec77faca80722d533f2abbf96c5536f99c379555161d403f28990ef05,33041ad7a90a8cf043169728d440fd3cdeff2b6bdc09eaa03a8f1609a4b0ecc6 -0000200000000000000000000000000000000000000000000000000000000000,0000000000000000004080000000000000000000000000000000000000000000,74ff2ff9fd8428bc9bc5527e8a25968213da8c83bcfaf3eedb7d368897029e15,5c0fe1e7a07169b424fc657d2903ea4f55d27802a12964245d587f1ffd3e38ff,01021131eced22163718b3bbea45c0aaac8545a4ea4d3341a11c3bb6a65bad3b -4000000000400000000000000000000000000000000000000000000000000000,0000000001000000000000000000000000000000000000000000000000000000,2dc73680b0302d049b8db6fdd18bc2d04d885aafd47e991304ac48a8f88b39f6,3a59fba35e7f45b6e4132ce8d31d44fd1865289797f2d2684af00437e2b5aa32,74da64a5cb5916c10b2a814cd898a96f4e023e5180b14d8d5cb09e733b2cc84b -0000000000000000000000000000000000000000000000000020000000000000,0000000000000000000000000100000000000000000000000000000000000000,added81534051013dc24841a12d96b33777ca1d3189682e0b46490ff67d06460,2dc2da3e1b2aaf77ec787933a428b65018e2df8415f4cc001289274190716949,63e324ac9b5494ee3605664e0c2a908e7fd4602132e5560a5529b296624c9407 -0000000000000000000000000000000000000000100000000000000000000000,0000000000000000000000000000000080800000000000000000000000000000,0000000000000000000000000000000000000000800000000000000000000000,327f876c93652555fa80a054968b4712930dc93012ee6b8dc10263ed3b89a762,39b00f126d935b5540afebf56d2e971d5c49fe13a9745a9d37d44b248b9c5b64 -0000000000000000000000000000800000000000000000000000000000000000,0000000000000002000000000000000000000000000000000000000000000000,0000000000000000000000000000000000000000000000000000000040000000,e1efb9cd05adc63bcce10831d9538c479cf1d05fefdd08b2448d70422ede454c,1891781d862a3ffcbe2e8c40c614ce649efb2f8b9bac5839233a340d27193c99 -0000000000000000000000000000000000000400000000000000000000000000,0000000000000000000000000000800000000000000000000000000000000000,0000000000040000000000000000000000000000000000000000000000000000,5a3ce25b4d15b7e22d1469ddf0fc9f75afd7f12ad3cbda31f814ba1ebadb2a65,565f8a618ba7ebbd6192e743db5a3ce1ed8a6af7a88822882efdf7a1ee2d9e02 -0000000008000000000000000000000000000000000000000000000000000000,0002000000000000000000000000000000000000000000000000000000000000,0000000000000000000000200000000000000000000000000000000000000000,6773fd677c52e0640394110a46dc85df7c133f8dd4a28e661899ca5d82fd545c,1900e5044291b72177ffe292891e735679d1bb127d5f37c911e4f2d4ab490548 -0000000000000000000000000000000000000000000000000020000000000000,0000000000000000000000000000000000000000000000400000000000000000,0000000000000000000004000000000000000040000000000000000000000000,1eecaad4b8cbbd5151b3c3b942cd8c387926cf292e8e0023a716ad1a55f01961,11d9e8eabd84fd5afb8f234696a6a9219eee667ab0df9a30bf374e6db0df3a35 -0000000000000000000000000000000000000000000000000008000000000000,0001000000000000000000000000000000000000000000000000000000002000,0000000000000000000000000000000000000000000002000000000000000000,26952c7f372e59360d5ce4c66291f0b6ef16c1331e825e51396eb0457e8b000a,1f6e310052c2ef33469b274a8c6ce675904c491d7000d7cfd83bba0c1913075f -0000000000000000000000000000000000000000000000000000000010000000,0000000001000000000000000000000000000000100000000000000000000000,0000000000000000000000000000000000000000000000000000000000000008,2f01e5e15cca351daff3843fb70f3c2f0a1bdd05e5af888a67784ef3e10a2a01,3d466b95c48018f78091e187a1744fa7e0d7b97b46e1e17d22b15e3e81ddc2cc -0000000000000000000000000000200000000000000000000000000000000000,0000000000000000000000000080000000000000000000000000000000000000,0000000001000000000000000000000000000000000000000000000000000000,a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13,52529144e22f8caab5b51c505fe192e0697158ea1b49d12a3c9b55a3ad8a69dc -0000000000000000000000008000000000000000000000000000000000000000,0000000000000000000080000000000000000000000000000002000000000000,ffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffff,880b6ef14e02de5bf73592e0f85e58784decadb2cf3a12f4dcc76777e12fb933,6cf75f3741d3a5bde26a48c50a9cdb994fbed35f730574488453fafc14b038bf -0000000000000000200000000000000000000000000000000000000000000000,0040000040000000000000000000000000000000000000000000000000000000,fffffffffffff7fffffffffffffffffffffffffffffffffffeffffffffffffff,88dbf090a532d101c16f894e7807deebdb373859b9fc20338d8709f7819a9300,3389d5bd1704775e3873c6100a21b03b4dfdf1ff3bca75a87a7e0aeacd4a3e59 -0000000000000000000000000000000000000000000000000000000000200000,0000008000002000000000000000000000000000000000000000000000000000,ffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff,a605a1c9406c6b5d69c66f43c6a95bd46feb9a321d50d0677d12f8c884325326,0fefc28c66dcc32266cb0748595478b8a0088dd0bfa33e409a96a66f72b5fbc7 -4000000080000000000000000000000000000000000000000000000000000000,0000000100000000000000000000000000000000000000000000000000000000,ffffffffffffffffffffffffffff7fffffffffbfffffffffffffffffffffffff,04ff2d1b1df0b1c1cf81866e46bb584530461342c070cf52eaf7e71287ee4b9e,6a0e7dc851f7ea88f8deaf6cc02bed07b4741f2b9acb9334dd794aa6bc16b4f1 -0000000000000000000000000000000000000000008000001000000000000000,0000000000000000000000800000000000000000000000000000000000000000,ffffbfffffffffffffffffffffffffffffff7fffffffffffffffffffffffffff,d8a66a3690927b50a485c9cd72a704fa2d597a9d01bc046179a05db0d6c39200,64ffef9dc23da8e1a5656c9c6aa3a8d222a629f290a9ee608d49a1a40798a769 -0000000000000000000000000000000000000000000000000020000000000000,0000000000000400000000000000000000000000000000000000000000000000,fffffffffffffffbfffffffffffffffffffffffffffffffffffff7ffffffffff,e210e933ee03c770b485b7dd32f8212a3eb8864f6f0ba6fb6f781bfe3033c3fb,408e986a8721d7fc5769f2b4c7fb80d185b97661b1651020aa99f826d4ce3046 -0000010000000000000000000000000000000000000008000000000000000000,0000000000004000000000000000000000000000000000000000000000004000,fffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffff,d8c40c899e4635db9ea86b0929e1193d6df6eb698ed8c1273b03df2aaa98204f,45d03663b2a057adfa47f28d4f5c3ffa6efe90f34670312a08081e17838ddf3b -0000000000000000000000000000002000000000000000000000000000000000,0000000000000000000000000000000000000080000000000000040000000000,f7fffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffff,a8986cfa34ce79b43e81281e85ab4116b3b0cac4928a9cba71d77604b96a8ffa,524e5ad074807eedd3df25d166ec1a9bbec5d9f0309c43f3720455df71a59d07 -0000000000000000000000000080000000000000000000000000000000000000,ffffffffffffffffffffffffbffffffffffffffffffffffffffffffffff7ffff,479048eed165e36f58f77a68852f8923111f26c87426e01f402629c761b268eb,7ba4d6b0a409eedf6e2027934c4d9df725aee7ec03ab86a10479b71f831d3236,44766c04859650e90fa708b5e00197ff25dc0e6e379e90fac778259cd2763515 -0000000000000000000000000000000000008000000000000000000000000000,ffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffff,33bcbaeebc20f1b7dd22c33f5785e0b7f94bb6a71287b85023429c3bed11e0b1,44a0952e3b4b7ec57eb9b09d106a820b736f9b11edaacf1073642bceafcce250,314f9520d38e5bd1074da244beda11af5a9bd1ddc8c300e0537aa1c79c850ed9 -0000004000000000000000000000000000000000000000000000000000000000,fffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffff,f4abe2902fd001c7a32e536df2119c0bf67741f8a97d1cd7a694612592b24e13,bc289e5f555b6ab352c36df0ee8ecde44cdee041bc3c9234e2cf395b78373c64,76576f635c6246c33b73bdcc18e382a84a85c5b0d7c9a280b2ec9925fef2e375 -0000000000000000000000000000000010000000000000000000000000000040,fffffffffffffffffffffffffffffffffffffffffffdffffffffffffffffffff,bfa7c311cc62a1792cb9eba692c737205ce62090feed18cdad558ba9d6f24368,c04381620d2ae9def4de8dbb6fce391e94319dd866a3edc9bbb4ca1d984944b4,2c8c045b0902f864fa95969f257c5078bed6271980fb279b6b1951f9e60632c0 -0000000000000000000000000000000000000000001000000000000000000000,fffffffffffffffffffffffffefffffffffffffffffffffffffffff7ffffffff,c0e5def043f140d9613fea4fc9c2bfa969b04d6f72ee328189d77259db8b0e2f,6e518d298c4dfc3ee8bcefebebef60b62e85c7f3dbe429980a15c0da8e80e0ee,25e3cb427d16cf09bb0fcf148e71dca8be1b37643e856180735c6872eb911e69 -0000000000000000000000000000000000000000020000000000000000000000,ffffffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffff,da166fa18394fc2c3683746ae86dd9617634128970edb75ff469fc1f30ee26aa,aef3f791a6ba162031d76b6d54d2bee0eecc70590582591c48ed8701ae56225b,5d3734e7c7f426234df43551f142aa2ffb7e9bbea846a1ab4a8d643e123d26a0 -0000200000000000000000000000000000000000000000000000000000000000,ffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffff,b25a9c0d4ad4cb54486cb3adae1eef94eaee0402ac78b915dfef41f2e82b5b04,ed97343281f480a2ff04ba062dd5828f218da3db4620e3f1f2a1ee16778c3f92,2efcdf0d7576494975f83c2f17a469b28aa7828eeb30ab36d45d7ef278793218 -0000000000000000000000000020000000000000000000000000000000000000,ffbffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffff,73e7a3cc4673bfd7708c66fdcd2a48f288ad6cda32c01f73a0d0b6a541f84262,071e9519475669fd1c06a9cf81b3aea0b6c4efedc65f6f8e0526ec8a5ab1cdf7,048ec828c6363ff6b7ad2a0b7659e37c3fbc13fbfc5e2514555214d1b2064c14 -0000000000000000000000000000000000000000000000000000000002000000,fffffffffffffffffffffffffffffffbffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000000000000002000000000000000,ae86eeea252b411c1cdc36c284482939da1745e5a7e4da175c9d22744b7fd72d,6b2245de8ea2e4fea252b411c1cdc36ba0200b57bd505c402a5c845ede20aa61 -0000000000000000000000000000000000000000000000000000000000004000,fffffffffffffffffffffffffffffffbffffffffffffffffffffffffffffffff,0000000000000000000200000000000000000000000000000000000000000000,4f89bdee3771d350dad163b04cb18ad67ce5e9c55b58f0e7231047a60f59dd9e,1716a1b133b3381c1fcad9e5adc4018e9ef3252e8e61459a27b0923731757e9f -0000000000000000000000000000000400000000000000000000000000000000,ffffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffff,0000000000000000000000000000000000000000000000000000000000200000,ed0c5ce4e13291718ce17c7ec83c611071af64ee417c997abb3f26714755e4be,469843dd6708cb2e6279e1a67ccf9a8a87919acb1a30b011bf1557de95d2a7e5 -0000000000000000000000000000000000000000000000000000000000200000,ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffff,0000000000000000000000000000000000000800000000000000000000000000,c0c01f34ae41b8cfe466b4c9c6a5d5f614f570d6fcbef768a81a6c8f05ff4adb,527201d959988ac73b7cf5ecd8bcd2b89e1e61d858ed914363e69e40154f96d2 -0004000000000000000000000000000000000000000000000000000000400000,fffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000008000000000000000000000000,126b57d05013936d6f3fb7bd33580a31fd453e4a86060cff467c44537f422491,450c190667ae4b2b9874ed2143a427d39cae9249d6ca1e610290839e34d1c0af -0000000000000000000000000000000000000000000000000000010000000000,bfffffffffffffffffffffffffffdfffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000400000000000000000000000000000,f694cbaf2b966c1cc5f7f829d3a907819bc70ebcc1b229d9e81bda2712998b10,3789bc4f4550db6f1439bf02f4084aa608f971dd948f0ee589a69a04532d4cec -0000000000000000000000000000000000000000000000200000000000000000,fffffffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffff,0000000000000000000000000000000000000000000000000000000001000000,723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda,1583908111c7fe8556e6f6fa7ac539e4fbead952284c98edba98ebff6b46f5e6 -0000000000000000000000000014000000000000000000000000000000000000,fffffffffffffffffffffffffffffffffffffffffffffffffffffbffffffffff,0000000000200000000000000000000000000000000000000000000000000000,9c7be00b4ef4c444df85d5f61dc1283a23605483e1f8e934b3c210d22cd3c369,434b6eb40e105004eb6be24463f95744fa03baa8a632298666148a336d9fab1b -0000000000000000000010100000000000000000000000000000000000000000,fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffff,ffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff,4b08bd3b1ff47c1b06029a28bb1a7a69d20d10d0bb963a86a5224340f34ccfec,5a38ad36ee2dc5e0d8a70a99ac61d48d45b013b6c9683de935a73f45d653cc26 -0000000000000000000400000000000000000000000000000000000000000000,ffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffff,ffffffffffff7fffffffffffffffffffffffffffffffffffefffffffffffffff,9c5304c06e8d6d691a009604dfe69cffa285da8dedcabb26da7223ab20eaa11b,7967e78f15d69ddc5393fa305ef1517f1cfebc5ef224f61a13f178d0b1c08144 -0000000800000000000000000000000000000000000000000000100000000000,ffffffffffffffdfffffffffffffffdfffffffffffffffffffffffffffffffff,ffefffffffffffbfffffffffffffffffffffffffffffffffffffffffffffffff,e23fb02becfe7ee915b3ef6f0f8808bc959b29a697e1075d98d3d7727d5c0c0e,23e672cf426aad4e8155ef5d54745fa3aff869a5b31712d47ad7ebb71f2aae80 -0000000000000000002000000000000000000000000000000000000000000000,fffffffffffffffffffffffffffffffffffdffffffffffffffffffffffffffff,ffffffffffffffffffffbfffffffffffffffffffffffffffffffffffffffffff,3840bee83ea26d000b386607fe1a2e71f509d6537e08688920a8a615d2a869f3,0a009aee8694a4939c87535c8edad47f3425af8a069a22f9491b4325a53e0b00 -0000000000000000000000000010000000000000000000000000000000000000,fffffffffffffffbffffffffffffffffffffffff7fffffffffffffffffffffff,ffffffffbfffffffffffffffffffffffffffffffffffffdfffffffffffffffff,35763a8a076da0b2d8078c512c042b5cfb727ce3181a7ced086f5f0bc79e8695,0e1c54475d8741556b9ebbe7e0af5e2a576a1f5d7f7ad0a71a0c1a26b87ab546 -0000000000100000000000000000000000000400000000000000000000000000,ffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,fffffffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffff,573917f2bb039a0d4465b702544d2c26c3822482b6e501e3f282a56ebaa23ef5,3c43d8b6269f8fc48c363ec43f2fbc632e12da03ef169d813ca166fef12a04e4 -0000000000000000000000000000000400000000000000000000000000000000,ffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff,ffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff7fffff,5788beea51c90106fd056e9998b4880bc6e36fd86ba66a15467cc6b8a15aac44,3399c00527d6d8f71fc6bde66a5cc5916e31a6fcbf1287b402157881d758f346 -0000000000000000000000000000000000000000000200000000000000000000,ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,ffffffffffffffffffffffdfffffffefffffffffffffffffffffffffffffffff,ee9d410d754f9f1dae476745bc4d2aac99e3e2ac5fb1e74d2969ba935ff11701,347913a6befef5cc7ac997d927266c9221eada367795a1fe5a20333bc99478b8 -fffffffffffffffefdffffffffffffffffffffffffffffffffffffffffffffff,4971e7cae34fc4a51c5a51a46e987b5e6c2247a82e056ec9c157ee7831926f6a,a5601c1f1770f0c786e6b86c76ad305305bb99df6751b6de14c4ca6c93a31c2c,14e41ac55cfcdf9726341e1e3638a1b2a9cf425c0f2a75e61ba05f68462ec6d0,428d7857637078ff31e6d71d30bdbc8dae508e179b64c7aab8a4274b1f0cf722 -fffffffffffffffffffffffffffbffffffffffffffffffffffffffffffffffff,260b1d388318f7083223e90a88fe67331b6c17387ed3c317dec0ca0a7df34429,f21fe8d960f3da2e8b7249f1ed82ba6487011670233faaeca3a33cfdca5aa0e8,07c67628ac3c0556cc3ae3660a2fe1119dd527564b048d16606c3e76b936bfee,5eb08afee066672614f98bf5bed49da7d8c1804ccdb5a68b0748e88a9047a09f -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffff,9d05aa038eff0c589c8e786d5f70b7ce82ed0d68563c5074f129b5cd0c213c30,0457ac0d3d96280c41c208cb69c0d7fdf97e2c81300e25df4c7e56778415cbeb,b80a73e90183d965ad2996a8059f946ff076bc9ea130d4aa8de45af4eb496c9d,6b328bd42dc1cf77a45026032204b167968239a6827bfbf77941922f7d06585e -ff7fffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffff,33036dddf1a94ad0a89521a35bad4bf3e63906748e047e97735475eea5fce561,834b8deb923186fd61fd67d0b277922d1b2739ac3d38e03989cf2061b4f2c3a3,d729a429ec6d7c07386b64a49a8b712374ce5714b5ad94e7309e86666cf10a16,5fe60be0ba72550e9abe72e44be80ef76bdd2c7f461fe757fedf6309c8915edb -fffbffffffffffffffffffffffffffbfffffffffffffffffffffffffffffffff,ce41f184d836bcbb45a9864f8511a7b328a12efe930678cf731d93b68c1c3841,83a332d915747db4dbd78933c341ea8fc1223e21ea1b017ee21467ac12f3501b,9180feae821da5e706f9974f74c5c28409485821111e0f2d5a2fc0fe721ae6f4,034fe1e9c895a4105d15e7be3cde8863c77fa38205a5c80e5d08482498841505 -fffffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffff,6bafe9ef28532a1a67fe25788a236206953f949eb888246a56ce9a838ba2bfd1,987b89ef51842d9a6eb4106fa585b1e6fefdb61bf86f83f22bff2d9c8f03e864,81cf02e38fb916d88bad3c33e73677ecf31124a1c5e6fe0f880e293c8478fa9c,53c18dea325d16da00dfcb08d731edd8956ef4b04738e74257027d7fef9e184b -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff,2bbef69978151517f5497c1a445429b4037fc3bdc94a8bac241b6fb4cdfdee49,5cc500b27c7f1eadea6330f085e31e924cbe3844f458cb944fed867cee16ab95,d9cc421abcb01307c85fe7365f8f8950354f49550cdd2acee74c843d6338baba,230f6a359d9dafd4dc40a1f08a5fa13f103909dac1b3ea30f366a9f6a7f730f9 -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdff,3019d7e3cc4cffd552c7f72c1e4b2ed855d40d4e1e2e2a0e4e77d89df12aa92b,05f06be88297de37b9caa80018b9b96bbd4997a7a96f7aa07ec07b21c6f1fbd2,8e88eef064fe6d25a8d9c2856dd005bb8c5a5956fc48a50dd1d7eeaeb820ca44,5fa905c8701966a496f1342c84a99a395f3c98509151b0b33868be6b65b74646 -fffffffffffffffffffffffffffdffffffffffffffffffffffffffffffffffff,7dad9598e8d9d75966f9414df88ba30ed98a1e669b1ed9abafe9e3ae02864c69,0000000000000000000040000000000000800000000000000000000000000000,082bc0e786f7baf5ae72ca79ab23a95f136559b242c617e0972f9807f1b06c96,71cea39f20253de4b4b853eb371c2b2f4512a107661bfecedc912b31ce8992c2 -fffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffff,a0ed405c5dfb3daaf8364aea40301ceb4b29583320ab86e6bd2da0903a379ac4,0000000000000100000000000000000000000000000000000000000000000000,1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19,3ecc6ba8c48348e35c8faf0a166f037fdd017e861531e115e21362913236a4ea -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffdffffff,d9a5465417d74960dee54cacbbcd03645e80f9279d444e7459eda6cf30b2b058,0000000000000000001000000000000000000000000000000000000000000000,85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751,07784f46998e9bfc3d5fdb15e911878fdbcc5adfdd181c1d38521a7e2fc23d47 -ffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffff,d137ee2f471685a2aeb0282bf71daaa30160969a7975acd13aacb23ad9dcebcb,0000000000000000000000000000000000000000000000000000108000000000,c62a2956d11e1eec4fd3523fa23d1b4a9f9d1675737347cca17de6720475f303,32503977c9fbf4dd80d49c76669c43fc3274881637238ef06b0936601a9b9682 -ffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffff,cb8a0f9bec91d2ffca727ea057ae35da7d03a8ace658f63d9fa01a8475cb164d,0000000000000000000000000000000000000000000000000000000000080000,a804c641d28cc0b53a4e3e1a2f56c86f6e0d880a454203b98cd3db5a7940d33a,5d763787fdd2b295ffc9df6a229f13a4adce58efe2f1bf242910493173a43910 -ffffffffffffffffbfffffffffffffffffffffffffffffffffffffffffffffff,2490beb902d5187bcebca920f0d80a69a60e8b1c6a64af76234242367d148f5f,0000000000000000000000000000000000000000000000000000000000002000,423a013f03ff32d7a5ffbcc8e139c62130fdfeb5c6da121bce78049e46bc47d6,38e981b61cabb0130846c5cb7275b4b025deb0fec0f26c6064282f4fde677ed8 -ffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffffffff,b96e18a44efbc28c4c569d9624b7afa91a5b51037907db7faa808a36ac48d63a,0000000000000000000000000000000000000000002000000000000000000000,0eac134ca2046b8f9c8dbd304fad3f3c045ebfdb4ec6ed3cfe09aee43ed2ff3e,4db572c4e1ee30881dc11499af4874af14ddb2f1b52c33f52e89b4dcce38ab56 -ffffffffffffffffffffffffffffffffffbfffffffffffffffffffffffffffff,bae54869c43cdf7b0aa582bd27640b2e00d526eccadd854093e5d3b2375b35c5,0000000000000000000000000000000000000000000008000000000000000100,28c0c453944ca52c55aaf168d063052cb6a74e418264963e717bb0432d7e789e,147248e1adec66403714485878c76dcc035c4e694ef4bfedca7eca30f8d3eac1 -fffffffffffffffffffffffffffffffffffffffffff7ffffffffffffffffffff,9033dd772b9051aeec0cb9b370b57a49d9e7d242485ecec5b328b9962bb3a619,fff7fffffffffffffffffffffffffffffffffbffffffffffffffffffffffffff,202cbafa2db4f8b6df93d9741006b2216c32e61a457c056ca60cd6000348e884,354de6d87e0b3f7c6aae5bb04f699cfd43a1aae9912bb5d12816dbc3bbd4ef24 -fffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff,2b734ea2cffe952117b38ea24eb22114bf0fbda5e388076848cab4afeaee180c,fffffffffffffffffffffffffffbffffffffffffffffffffffffffffffffffff,2b069092d1c9c2102e29d5683ac53e696a430de573e64238c547aacb62a2b157,75eb2c2d93be000c5bd2821fa7c3123c3bc2904b8867fcd7c2e7382b56c1d08b -fffffffffffffffffffdffffffffffffffffffffffffffffffffffffffffffff,596faf7c48ede147c9b8b8ffc511bc462966f7eeac88e26a4bc644a58b84e56c,ffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,c357339cb5b76ebf94138535b9a189ad2dbc30187654facc31b6e64661bdf812,6b3f54b1f4ed11e1a603912403364a0d7b8631990b001d1765581b689ab0217c -fffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffff,e30e568da7ea244e5ebdde0b19e7088fb29bb3a6543b61c21e64860273007296,ffffffffffffffffffffffffffdfffffffffffffffffffffffffffffffffffff,b5f35f078c6b1119278dd516b386efc199484016ec7dca76d89bdb417688447b,3001743d9fef88d798664c8539345622cbe550c885d3675143106f3651e273a4 -fffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,4fc526e40a88e4c457f3cf9c6b335c52d5d3ef587eec9b64b92e5fc122ee1577,fffff7fffffbffffffffffffffffffffffffffffffffffffffffffffffffffff,7c0e959c7278e806e6b0db150b6f40482e571ac9953f42d27f496bb5d204d9a8,294e62afb0f2847d4083cc19c4ff5fadc2f70faff843bceb986e2e8985aa0326 -ffffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffffff,7b2a1d154331c7d407f6cd8e2773014873a28b8f57e84fe91d742dc349b0ba1b,fffffffffdfffffffffffffffffffffffffffffffffffffffffffffff7ffffff,c938ef1a6819796cd85ed03eadc0497258bc7ddfb0ce155f747b502b6ed10d9c,6334e90cc9db94cd9ec4198638920085b993bf7791c89a9a938d8b7d47bd022d -fffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffff,da3d6b03fc34d533059fa8704c1b87fe37ae9e3ca402d7745be0f9a8a901d624,ffffffffffffffbfffffffffffffffffffffffffffffffffffffffffffffffff,0d5613f0e3c0ade1c1c644a635e45b820172634f1078401f2c672fd6e802977b,117163b416d2a7b5bdc63787414a857493dacc8dd11bb2f9512d65aca28f53ef -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff,97e070e32ee26ced4b6563b7433ccf746c63f203bee8feda2340ab05e27bb621,ffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,38a9488cdd62ab995ad39dade1696e0d1a65bcc9022149a5dbd7e22e35f7905e,72b56bb6424d88f28381936deb60a8b7d8d96367c5233f0b6b2c95f80818cf9f -fffffffffffbffffffffffffffffffffffffffffffefffffffffffffffffffff,0000000200000000000000000000000000000000000000000000000000000000,915c982576889243e72332cd337a7531fe22b4eccf9bd954bb9a7a7f08341a49,51527197c8267c255e7d3f71d5b789235646eb32e5e67babd96c9dd4cff7b6c5,663619646b00f96e6249486e987ff348db258e71b3cb90ee54bff644971ebb43 -fffff7fffffffffffffffffffffffffffffffffffffdffffffffffffffffffff,0000000000000000000000000000000000000000000400000000000000000000,e1346597383d1046423e81e213651fb00575cfb418820ff235917958057a4e61,e196448d47ae788e762fd9dbef8ceb1fd0e507f09b804f229019ef4c2c0177f2,20821978801075089e47eb6a6294074ee253b8ddef7e653b4be456ce3c237d07 -ffffffffbfbfffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000020000000000000000000000000000000000000000,4f5c33141ef485423645a793c44990e23b64dd7e98c562f2a603e3908f78e4e5,1718c049c233ef31f3c180321d85f81179cf48b6ce34e5b3eb7ebcfdb10e0d4b,2b136e902ce0e755dacabfeed1ad0bd8cb65b2b9213b1ba3a49e759e372e3854 -fffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000020200000000000000000000000000000000000000000000000,17b57cfb57444cfa5cbdd1d149fa493cccdd5aa06e2afd3d90a2fdc24b975dc2,f705472be4a5cb203ece0e14b96b4e4d8767782a81f110bf3e77620bc7d8ee83,79b263325f3b79204ea3a02d2c6e56ae41f3c8b459aa5ae0bdf8bc7ecfec0a77 -ffffffffffffffffffffffffffffffffffffffffffff7fffffffff7fffffffff,0000000000000000000000000000000000000000010000000000000000000000,db288b66a57db435c10deff800dd181a4c1c194782ba852a0f7adc4f9f1db4d1,b257001ad19f027879fb46bb6bf4f2dc6a67ae8ac70ceb12b19c283e7a761c96,17093e32ad376cdaee93e4a2ce3da59bc56da1fc3b4b3a346a862912ee85e144 -fffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000000000000000000000008000000,12ebbe6640b0ebfcde17dcd79b23e6139991179ad03c0a66babc39919396a8d8,242884e7ebbc2a1a713f78cf3e155fb18ae51befee63036971df830cb92435a8,1f024de10125c8dabc024689491ff9c00fe8e2ea42a5bfb12ea97a47deefc715 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffff,0000000000000000000000000000000000000000000000400000000000000000,fbf7c120677aa0390c6c09bee508b5d9128f6897b285be795d41a88fd95eda05,168916be83a5e0f6ac77f582932543e823690a75e70eb5913ee05e0b83e1b1d8,1c9b5b6c7adb62f5fff70e916683eed972b6b6336ec112e3eae3219fc1bd8f0b -ffffffffffffffffffffffffffffffffffffffffffeffffffeffffffffffffff,0000000000000000000000000000000000000000000000000000040000000000,4dc98b3b49efe43bfae83f0f204165d2a590d648f6ef16bb030f6c7e1463e3ed,071a4ddc6990e6e8f668fa6d6f6b93f29445e0cb99ac7fbd15c47a196474ca0f,3aef14f4230c3cdfdb67e3dafee07e1b994f5eec013adf43cf07d1ed084ebd2f -ffffffdffffffffdffffffffffffffffffffffffffffffffffffffffffffffff,0000000000800000000000000000000000000000000000000000000000000000,0000000000000000000000000000000000000000000000000080000000000000,2380c09c7f3aeae57c46e07395aeb0dc944dbaf2b62a9f0c5e8a64ad6ae7d616,60c35041852843424d971fef1102ee9cdba56b10eb95809ce27e31943a3d19df -fffffffffffffff7ffffffffffffffffffffffffffffffffefffffffffffffff,0000000000000000000000000000000000000040000000000000000000000000,0000000000000010000000000000000000000000000020000000000000000000,b73a7e3d73850aa2ede06af4ec5b41ff33f0fe14b4625f1278ac1e96fc788c70,6aadc793d51a566eeb6e27d6c9920b391aea2fcd11d6e8daf3fdd5a134ebadc3 -ffffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000002000000000000000000000000000000000010000,0000000000000000000000000000000000000000008000000000000000000000,6930fccbd9a040974abf210f12b71d4bc7b1a6205599b01a7275fb40e48ff9b3,76aea2e11be6f8d10f0b7d886e7f4a0f373ce7d61423cb419f2e6c667bb7c2b7 -ffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000001000000000000000000000000000000000000000000000000000000,0000000000000000000000000002000000000000200000000000000000000000,74a442bb61370af1730729961b35028382b3eeb39e0573154a3efa1c070c678f,78fd08e28198d547bcc2c45a11ede04548f874d3e04dc68032b09e1e7ac07a27 -fffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffff,0000100000000000000000000000000000000000000000000000000400000000,0020000000000000000000000000000000000000000000000000000000000000,da433d5e11ceccc0abc5c7626ce7bab42e89b221f785c409282de545f3fceb19,259f84d0b654ba1c18ddcbf8aad55fa078fb4de36e35b04d852ad9bab2f83d2d -fffffffffff7ffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000000000400000000000000000000,0000000000000000000000000000000000000000000000000002000000000000,01a575af9d4146753cf991196316995d2a6ee7aaad0f85ad57cd0f1f38a47ca9,2c0deb5fe3ad8d2884c945dde3f1672640701ad7e76f8e4a61756cfb84c099b9 -feffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffff,0000000000000000000000000000000000000000000010000000000000000000,0000000000000000020000000000000000000000000000000000000000000000,2982dbbc5f366c9f78e29ebbecb1bb223deb5c4ee638b4583bd3a9af3149f8ef,2283d9d7435b2b3efae3c21f1e90917029b2cd77606d3fc7747c1b502755cf80 -fffffffffffffffffffffffffffffbffffffffffffffefffffffffffffffffff,0400000000000000000000000000000000000000000000000000000000000004,0000000000002000000000000000000000000000000000000000200000000000,6ee63ea24bf96b48c1dcc634e0c4da63933bb7fc4007d2c1c9052a59da1ef784,00d5bf0a0ffb48b9669307b7d0d0ba4344da7fc0009ba6dc1cc340a99340e268 -fffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000000000000000000000000020000,fffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffff7,1caa0b6ff2dbb899765d585d1919fed59aa6e1f7b6522d0effc4784da9a3b588,1525ff8e4977fa40e76d0dc6d6b1dda187cb45365d4ce17da3170c426228c42e -ffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff,0000000000000010000000000000000000000000000000000000000000000000,fffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffff,3619c12fe8797042d5b1af5dab1fac333c7668ec610a381903c848737a0aa17b,68ac5650430e2defe17c66598dc37d7eccfd8a6e20d2669659c8f53bd82e0f49 -fffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000800000000000000000000000000000000000,ffffffffffffffffffdfffffffffffffffffffffffffffffffffffffffffffff,7ef66e831c709b43dc8813fa7bfb43af8b91df4ae2da15ba77622511a4ea6dc9,3b9b394c60ea620faee0489738c0f6149475c3629b6c9197e440abcc76189304 -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff,0000000000000000000000000000000000000000040000000000000000000000,bfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,baf79fe5e5da980ebf5ed4b640d49d61412cf5ef5a46325a0a1e12f5e89c25be,088984e2a7a820f29566031f359ad1d8b50a22b275721188e93f911e3994c2fa -fffffdfffffffffffffff7ffffffffffffffffffffffffffffffffffffffffff,0000000000000000800000000000000000000000000000000000000000000001,ffffffffffffffffeffffffffffffffffffbffffffffffffffffffffffffffff,60a86d356ebb5cc87c76b5f51f22cc6fe21e11542315eb0dff95290fcc13be4a,4892fce22aaedaeea76423a3092ab54490eb08c04485dc82401e19a87b4a2b57 -ffffffffffffffdfffffffffffffffffffffffffffffffffffffffdfffffffff,0000004000000000000000000000000000000000000000000000000000000000,fffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffd,9f74fe097f475fb5d8c520696f3f780662062a1b1f581ce6a9d582046bf6e136,413dfc3e970dd476245b3a95936772eaf701016fb21a4f0589f5538921f28cd3 -ffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffff,0000000000000002000000000000000000000000000000000000000020000000,fffffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffff,e847af346ccdaee0e6a5be84247d4173bdcdb84a9dcc3b8255648a26875b9574,47b3207e0cbaeccb9b895b498caf5fb431d56ae85b155b5cbee14707e7f73b52 -ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000400000000000000000000000000,ffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffff,895b6bb2bb80fbd666567fd64d770d585242456151eb82b6722f88501e35cec3,1f820b0ac9122eb61383328bcf872c22b71c11d56ecac8157567ef19aa34aff4 -ffffffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffff,ffffffffffffffffffffffffbfffffffffdfffffffffffffffffffffffffffff,986196cfec8389f4dd56997ef92b2e66ca09419b775a925af631ddc055e097ae,0a175062f62b8f2d2f2d8f198f7efade344979d91906570e7ef43acf83b8d1b3,58d8b481ff57402e5a3537d56308e13484634a3175a322557226dce5401ff4a9 -fffffffffffffffffffffffff7ffffffffffffffffffffffffffffffffffffff,fffffffffffffffffffffffffffffffffffffffffffeffffffffff7fffffffff,6df6f0862887366019ac4bc3b720e8749d1280db08657e9f7fb101ae0254289b,b6dcc975a234fd07011e63e58fec2e87b618232fb35cbb82a5e9444f185f43e7,6613b047f370fe44adaf9bce3edbe0d51d43457fcd8f1055f0213246c2ad8a9a -f7ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffff,ffffffffffffbfffffffffbfffffffffffffffffffffffffffffffffffffffff,69b79d171bf3236ab2db188199495cbf21a1601956aab0d37b267922bf9fe667,cf7c2809146f0c19a2af2e7bfee1c593a41d0c401dae909736601dc4e3fd619c,516ebd5c44683f1237e8346877f9acb6dfd574329d55f1a1d22a87c5b27e20ca -fffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffff,ffffffffffffffeffffffffffffffffffffffffffffffffffffffffff7ffffff,04bc0e13cc69d4587d5a1b572f17030a151d68efc861f57f8761c819eadff784,93e2e354ac1e4ce29c709f863d35a7e12fc6e9231bf0d3ad71e52ac888022425,5b6e6f478eb170f739bbf39dc830358501bb9713ca8ba2b0d85a368d1531030f -fffffdfffffffffffffffffffffffffffffffffffffeffffffffffffffffffff,ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffff,98ba487bcc026752ac462c2374935863bff0d769a848f18c57ce3cd8531c25dd,269ac8f0bff716170d3d14f383554b46f44f3ed056ac1a9cc36e886fa77359eb,5f1079964b19d1c74220f1f3ad87dc432a9fbc8676e8c85ca1280d79b4c07827 -ffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffff,ffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffff,819f13912cd98fb5cd88ba147bf3a2e866cd2963490867c2d6e467ad667ed259,04459c2736e3af31d63a72ff0b5e6be4dc7a2b6e308984cb2617d8cc73c206bd,1795d738fc382831d7292a0345db7d8416e0e5351110dae033100c1313477624 -fffffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffff,fffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffff,252a571bde30ed43e92a748cfa69fae101fbf9d464d6a1772e5a62763ecc5f37,e6a307fd823c3dd433d19a40e33d291964ce04be2fa2677d4684d6f770f0775c,1cc4fb91c547eaf70b783e5d8ff893911b39da13b06bdd9ee168d4e9d659a007 -ffffffffffffffffffffffffffffffbfffffffffffffffffffffffffffffffff,ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfff,7c013333741948937601cb418025f4686ed6872cef3b559759c4b25d55c0e71b,3006d971ac824e499e4e0aeae98f3b52f2666fe0cc60e0024d96f207d34f282e,6f5995da9e257426cdcae1f740f4ab002657d4582925c09a652088305956e9e3 -fffffffffffffffffffffdfffffffffffffffffffffffffffffbffffffffffff,ffffffffffffffffffffffdfffffffffbfffffffffffffffffffffffffffffff,0000000000000000010000000000000000000000000000000000000000000000,ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e,1354a9c87a1d30bea14670cfb8806afc8a5331e4e9a79a23e5c806ae10e4f20d -fffffffffffffffffffffffffdffffffffffffffffffffffffffffffffffffff,fffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000000000000000000000000000040000000000000,374deeae22c93f955cb83ad2071f7e2256f6e109cad7bca6d71dc7b24414bb36,58107a072768011c332eaf4ba8105e034c78331c88bdf95dc4aac0d266c7be82 -ffffffffefffffffffffffffffff7fffffffffffffffffffffffffffffffffff,fffffffffffffefffffffffffffffffffffffeffffffffffffffffffffffffff,0000000000000000000000000000000000000000000000000000020000000000,4d000b621adb87e1c53261af9db2e179141ecae0b331a1870aa4040aee752b08,02b1ddcb5907bc8dc23ea21ec4ca8ed451fd2d401e1fdafa168e78f0edb56132 -fffffffffffffffffffffffdffffffefffffffffffffffffffffffffffffffff,ffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff,0000008000000000000000000000000000000000000100000000000000000000,1e5f4502069439739887372daf147d890793cc414df76cfc3cbf176a14a1f857,269178d7feddd5ccad44afe27a8f0a9ff516308610148780f60fd266739f0162 -ffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffbffff,ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fff,0000000000000004000000000000000000000000000000000000000000000000,129e53ac428e9cbb7e10955e56c5fc69fefdff56963e7caf054e9e0c90ae86f9,5ccc8a10748268375a15d5307417acb93cc6b33ebb52107a29daab02e76ea1ed -fffffffffffffffffffffffffffffffffffffffffffffffdffffffffffffffff,ffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffff,0100000000000000000000000000000000000000000000000000000000000000,8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa,218fda0b4a63abef45403858841323a0ff4f1f076a4d43f3104bb5c603a978e4 -ffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffff,fffffffffffffffffffffffffffffffffffffffffbfffffffffffffffffffdff,0000000000000000000000000000000020000000000000000000000000000000,7e2cd40ef8c94077f44b1d1548425e3d7e125be646707bad2818b0eda7dc0151,330c1c4a693063bcb83d160a3b462b657e48c8e67234ace9a31538e4d80f0340 -ffffffffffffffffffffffffffffffffffffffffffdfffffffffffffffffffff,fffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff,0000000000000000000000000001000000000000000000000000000000000000,b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef,45aeef0f37fb710d53cb44ed8be70f128f112d5724d3d86f37d4122d5d13f736 -fffffffffffbffffffffffffffffffffffffffffffffffffffffffffffffffff,fffffffffffffffffffffffffffbffffffffffffffffffffffffffffffffffff,fffffffffffffffffdffffffffffffffffffffffffffffffffffffffffffffff,86fe5d6a44b34e0099868db1852f147516009ab43022ad641b8f273f845b90d9,12a2f435dccedb20ee5a7cbb22cbe2c905e856f9eb2aa45f3b3879bc4341e21a -fffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffff,fffffffffffffffffffffffffffffffffffffdffffffffffffffffffffffffff,ffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffff,49aa8388e578e3f24abac451d26513ebdb7fbe70d0da925ff4300455b37dfde9,370a8d653a80e9178bd1b6493fc887455272575b24deede57c3b6cb623229ae3 -ffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffff,ffffffffffffffffbfffffffffffffffffffffffffffffffffffffffffffffff,ffffffffffffffffffffffffffdfffffffffffffffffffffffffffffffffffff,b5f35f078c6b1119278dd516b386efc199484016ec7dca76d89bdb417688447b,0896c1df1fd0ad1834948085e08fbd4694ae20a3daaef0320596d8ae19fa4f35 -ffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffff,ffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffff,ffbfffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffff,91c3f6b39e833d4e6c8c2c08081fd9ed9563d13a658a598eeacbf7e0acc6a715,699119f3012191c8bc146928ad6a891b0a635faa99c61b6ae54c1793c619e07d -fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffff,fffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffffffff,fffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffff,78d6e4ebce682bc53f26487a0a004aa1ff9c593b865901c07b77580403188270,22ad2a2bda0bff6f55b68d3350d36cd101eb9e623c1390ca919e3698a525ec4a -fffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,fffffffffffffffffffffffffffffffffffffffffffffffffffffeffffefffff,ffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffff,42fd2c487f7509ce6d570d18df9e43677f4d1d57596e3c82c287acf6b9e64a25,09509fe9194d7485139748d2dfe323eb3112bcf7cc347949a0576fbf686b7a05 -ffffffeffffffffffffffffffffffffbffffffffffffffffffffffffffffffff,ffdffffffffffffffffffffffffffffff7ffffffffffffffffffffffffffffff,ffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffff,4e8b7198ffaad1dc059046d5f603bb5a4729885629f5d613f3124026bee11875,5b1041b8542a1c4c8cfe2d5f3cc75524b986260050dbd9efd1b365a7e0d22c62 -fffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff,ffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffff,ffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,e8b6b147dcda9d145608c505212746b5c107e9693d1b6c6e14f4e98dab75ccc3,6ff3740592fd8057a0e6bcf7f052d806732e1217caa1fd0acf48f9aaec187a05 diff --git a/external/libwally-core/src/data/pbkdf2_hmac_sha_vectors.txt b/external/libwally-core/src/data/pbkdf2_hmac_sha_vectors.txt deleted file mode 100644 index 93b85c79d..000000000 --- a/external/libwally-core/src/data/pbkdf2_hmac_sha_vectors.txt +++ /dev/null @@ -1,265 +0,0 @@ -# Format: HMAC_SHA_TYPE,PASSWORD,SALT,COST,RESULT - -# -# https://stackoverflow.com/questions/15593184/pbkdf2-hmac-sha-512-test-vectors -# - -# AW 1a 1iter 64outBytes 19pw 19sa -512,70617373444154416230304142375978445454,73616c744b4559626354635848434278746a44,1,CBE6088AD4359AF42E603C2A33760EF9D4017A7B2AAD10AF46F992C660A0B461ECB0DC2A79C2570941BEA6A08D15D6887E79F32B132E1C134E9525EEDDD744FA -# AW 1b 100000iter 64outBytes 19pw 19sa -512,70617373444154416230304142375978445454,73616c744b4559626354635848434278746a44,100000,ACCDCD8798AE5CD85804739015EF2A11E32591B7B7D16F76819B30B0D49D80E1ABEA6C9822B80A1FDFE421E26F5603ECA8A47A64C9A004FB5AF8229F762FF41F -# AW 2a 1iter 64outBytes 20pw 20sa -512,706173734441544162303041423759784454546c,73616c744b4559626354635848434278746a4432,1,8E5074A9513C1F1512C9B1DF1D8BFFA9D8B4EF9105DFC16681222839560FB63264BED6AABF761F180E912A66E0B53D65EC88F6A1519E14804EBA6DC9DF137007 -# AW 2b 100000iter 64outBytes 20pw 20sa -512,706173734441544162303041423759784454546c,73616c744b4559626354635848434278746a4432,100000,594256B0BD4D6C9F21A87F7BA5772A791A10E6110694F44365CD94670E57F1AECD797EF1D1001938719044C7F018026697845EB9AD97D97DE36AB8786AAB5096 -# AW 3a 1iter 64outBytes 21pw 21sa -512,706173734441544162303041423759784454546c52,73616c744b4559626354635848434278746a443250,1,A6AC8C048A7DFD7B838DA88F22C3FAB5BFF15D7CB8D83A62C6721A8FAF6903EAB6152CB7421026E36F2FFEF661EB4384DC276495C71B5CAB72E1C1A38712E56B -# AW 3b 100000iter 64outBytes 21pw 21sa -512,706173734441544162303041423759784454546c52,73616c744b4559626354635848434278746a443250,100000,94FFC2B1A390B7B8A9E6A44922C330DB2B193ADCF082EECD06057197F35931A9D0EC0EE5C660744B50B61F23119B847E658D179A914807F4B8AB8EB9505AF065 -# AW 4a 1iter 64outBytes 63pw 63sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,1,E2CCC7827F1DD7C33041A98906A8FD7BAE1920A55FCB8F831683F14F1C3979351CB868717E5AB342D9A11ACF0B12D3283931D609B06602DA33F8377D1F1F9902 -# AW 4b 100000iter 64outBytes 63pw 63sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,100000,07447401C85766E4AED583DE2E6BF5A675EABE4F3618281C95616F4FC1FDFE6ECBC1C3982789D4FD941D6584EF534A78BD37AE02555D9455E8F089FDB4DFB6BB -# AW 5a 1iter 64outBytes 64pw 64sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,1,B029A551117FF36977F283F579DC7065B352266EA243BDD3F920F24D4D141ED8B6E02D96E2D3BDFB76F8D77BA8F4BB548996AD85BB6F11D01A015CE518F9A717 -# AW 5b 100000iter 64outBytes 64pw 64sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,100000,31F5CC83ED0E948C05A15735D818703AAA7BFF3F09F5169CAF5DBA6602A05A4D5CFF5553D42E82E40516D6DC157B8DAEAE61D3FEA456D964CB2F7F9A63BBBDB5 -# AW 6a 1iter 64outBytes 65pw 65sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,1,28B8A9F644D6800612197BB74DF460272E2276DE8CC07AC4897AC24DBC6EB77499FCAF97415244D9A29DA83FC347D09A5DBCFD6BD63FF6E410803DCA8A900AB6 -# AW 6b 100000iter 64outBytes 65pw 65sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,100000,056BC9072A356B7D4DA60DD66F5968C2CAA375C0220EDA6B47EF8E8D105ED68B44185FE9003FBBA49E2C84240C9E8FD3F5B2F4F6512FD936450253DB37D10028 -# AW 7a 1iter 64outBytes 127pw 127sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,1,16226C85E4F8D604573008BFE61C10B6947B53990450612DD4A3077F7DEE2116229E68EFD1DF6D73BD3C6D07567790EEA1E8B2AE9A1B046BE593847D9441A1B7 -# AW 7b 100000iter 64outBytes 127pw 127sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,100000,70CF39F14C4CAF3C81FA288FB46C1DB52D19F72722F7BC84F040676D3371C89C11C50F69BCFBC3ACB0AB9E92E4EF622727A916219554B2FA121BEDDA97FF3332 -# AW 8a 1iter 64outBytes 128pw 128sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,1,880C58C316D3A5B9F05977AB9C60C10ABEEBFAD5CE89CAE62905C1C4F80A0A098D82F95321A6220F8AECCFB45CE6107140899E8D655306AE6396553E2851376C -# AW 8b 100000iter 64outBytes 128pw 128sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,100000,2668B71B3CA56136B5E87F30E098F6B4371CB5ED95537C7A073DAC30A2D5BE52756ADF5BB2F4320CB11C4E16B24965A9C790DEF0CBC62906920B4F2EB84D1D4A -# AW 9a 1iter 64outBytes 129pw 129sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,1,93B9BA8283CC17D50EF3B44820828A258A996DE258225D24FB59990A6D0DE82DFB3FE2AC201952100E4CC8F06D883A9131419C0F6F5A6ECB8EC821545F14ADF1 -# AW 9b 100000iter 64outBytes 129pw 129sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,100000,2575B485AFDF37C260B8F3386D33A60ED929993C9D48AC516EC66B87E06BE54ADE7E7C8CB3417C81603B080A8EEFC56072811129737CED96236B9364E22CE3A5 -# AW 10a 1iter 64outBytes 1025pw 1025sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,1,384BCD6914407E40C295D1037CF4F990E8F0E720AF43CB706683177016D36D1A14B3A7CF22B5DF8D5D7D44D69610B64251ADE2E7AB54A3813A89935592E391BF -# AW 10b 100000iter 64outBytes 1025pw 1025sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,100000,B8674F6C0CC9F8CF1F1874534FD5AF01FC1504D76C2BC2AA0A75FE4DD5DFD1DAF60EA7C85F122BCEEB8772659D601231607726998EAC3F6AAB72EFF7BA349F7F -# AW Trunc 1a 1iter 63outBytes 19pw 19sa -512,70617373444154416230304142375978445454,73616c744b4559626354635848434278746a44,1,CBE6088AD4359AF42E603C2A33760EF9D4017A7B2AAD10AF46F992C660A0B461ECB0DC2A79C2570941BEA6A08D15D6887E79F32B132E1C134E9525EEDDD744 -# AW Trunc 1b 100000iter 63outBytes 19pw 19sa -512,70617373444154416230304142375978445454,73616c744b4559626354635848434278746a44,100000,ACCDCD8798AE5CD85804739015EF2A11E32591B7B7D16F76819B30B0D49D80E1ABEA6C9822B80A1FDFE421E26F5603ECA8A47A64C9A004FB5AF8229F762FF4 -# AW Trunc 2a 1iter 63outBytes 20pw 20sa -512,706173734441544162303041423759784454546c,73616c744b4559626354635848434278746a4432,1,8E5074A9513C1F1512C9B1DF1D8BFFA9D8B4EF9105DFC16681222839560FB63264BED6AABF761F180E912A66E0B53D65EC88F6A1519E14804EBA6DC9DF1370 -# AW Trunc 2b 100000iter 63outBytes 20pw 20sa -512,706173734441544162303041423759784454546c,73616c744b4559626354635848434278746a4432,100000,594256B0BD4D6C9F21A87F7BA5772A791A10E6110694F44365CD94670E57F1AECD797EF1D1001938719044C7F018026697845EB9AD97D97DE36AB8786AAB50 -# AW Trunc 3a 1iter 63outBytes 21pw 21sa -512,706173734441544162303041423759784454546c52,73616c744b4559626354635848434278746a443250,1,A6AC8C048A7DFD7B838DA88F22C3FAB5BFF15D7CB8D83A62C6721A8FAF6903EAB6152CB7421026E36F2FFEF661EB4384DC276495C71B5CAB72E1C1A38712E5 -# AW Trunc 3b 100000iter 63outBytes 21pw 21sa -512,706173734441544162303041423759784454546c52,73616c744b4559626354635848434278746a443250,100000,94FFC2B1A390B7B8A9E6A44922C330DB2B193ADCF082EECD06057197F35931A9D0EC0EE5C660744B50B61F23119B847E658D179A914807F4B8AB8EB9505AF0 -# AW Trunc 4a 1iter 63outBytes 63pw 63sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,1,E2CCC7827F1DD7C33041A98906A8FD7BAE1920A55FCB8F831683F14F1C3979351CB868717E5AB342D9A11ACF0B12D3283931D609B06602DA33F8377D1F1F99 -# AW Trunc 4b 100000iter 63outBytes 63pw 63sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,100000,07447401C85766E4AED583DE2E6BF5A675EABE4F3618281C95616F4FC1FDFE6ECBC1C3982789D4FD941D6584EF534A78BD37AE02555D9455E8F089FDB4DFB6 -# AW Trunc 5a 1iter 63outBytes 64pw 64sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,1,B029A551117FF36977F283F579DC7065B352266EA243BDD3F920F24D4D141ED8B6E02D96E2D3BDFB76F8D77BA8F4BB548996AD85BB6F11D01A015CE518F9A7 -# AW Trunc 5b 100000iter 63outBytes 64pw 64sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,100000,31F5CC83ED0E948C05A15735D818703AAA7BFF3F09F5169CAF5DBA6602A05A4D5CFF5553D42E82E40516D6DC157B8DAEAE61D3FEA456D964CB2F7F9A63BBBD -# AW Trunc 6a 1iter 63outBytes 65pw 65sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,1,28B8A9F644D6800612197BB74DF460272E2276DE8CC07AC4897AC24DBC6EB77499FCAF97415244D9A29DA83FC347D09A5DBCFD6BD63FF6E410803DCA8A900A -# AW Trunc 6b 100000iter 63outBytes 65pw 65sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,100000,056BC9072A356B7D4DA60DD66F5968C2CAA375C0220EDA6B47EF8E8D105ED68B44185FE9003FBBA49E2C84240C9E8FD3F5B2F4F6512FD936450253DB37D100 -# AW Trunc 7a 1iter 63outBytes 127pw 127sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,1,16226C85E4F8D604573008BFE61C10B6947B53990450612DD4A3077F7DEE2116229E68EFD1DF6D73BD3C6D07567790EEA1E8B2AE9A1B046BE593847D9441A1 -# AW Trunc 7b 100000iter 63outBytes 127pw 127sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,100000,70CF39F14C4CAF3C81FA288FB46C1DB52D19F72722F7BC84F040676D3371C89C11C50F69BCFBC3ACB0AB9E92E4EF622727A916219554B2FA121BEDDA97FF33 -# AW Trunc 7a 1iter 63outBytes 128pw 128sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,1,880C58C316D3A5B9F05977AB9C60C10ABEEBFAD5CE89CAE62905C1C4F80A0A098D82F95321A6220F8AECCFB45CE6107140899E8D655306AE6396553E285137 -# AW Trunc 8b 100000iter 63outBytes 128pw 128sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,100000,2668B71B3CA56136B5E87F30E098F6B4371CB5ED95537C7A073DAC30A2D5BE52756ADF5BB2F4320CB11C4E16B24965A9C790DEF0CBC62906920B4F2EB84D1D -# AW Trunc 9a 1iter 63outBytes 129pw 129sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,1,93B9BA8283CC17D50EF3B44820828A258A996DE258225D24FB59990A6D0DE82DFB3FE2AC201952100E4CC8F06D883A9131419C0F6F5A6ECB8EC821545F14AD -# AW Trunc 9b 100000iter 63outBytes 129pw 129sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,100000,2575B485AFDF37C260B8F3386D33A60ED929993C9D48AC516EC66B87E06BE54ADE7E7C8CB3417C81603B080A8EEFC56072811129737CED96236B9364E22CE3 -# AW Trunc 10b 100000iter 63outBytes 1025pw 1025sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,100000,B8674F6C0CC9F8CF1F1874534FD5AF01FC1504D76C2BC2AA0A75FE4DD5DFD1DAF60EA7C85F122BCEEB8772659D601231607726998EAC3F6AAB72EFF7BA349F -# AW Ext 1a 1iter 65outBytes 19pw 19sa -512,70617373444154416230304142375978445454,73616c744b4559626354635848434278746a44,1,CBE6088AD4359AF42E603C2A33760EF9D4017A7B2AAD10AF46F992C660A0B461ECB0DC2A79C2570941BEA6A08D15D6887E79F32B132E1C134E9525EEDDD744FA88 -# AW Ext 1b 100000iter 65outBytes 19pw 19sa -512,70617373444154416230304142375978445454,73616c744b4559626354635848434278746a44,100000,ACCDCD8798AE5CD85804739015EF2A11E32591B7B7D16F76819B30B0D49D80E1ABEA6C9822B80A1FDFE421E26F5603ECA8A47A64C9A004FB5AF8229F762FF41F7C -# AW Ext 2a 1iter 65outBytes 20pw 20sa -512,706173734441544162303041423759784454546c,73616c744b4559626354635848434278746a4432,1,8E5074A9513C1F1512C9B1DF1D8BFFA9D8B4EF9105DFC16681222839560FB63264BED6AABF761F180E912A66E0B53D65EC88F6A1519E14804EBA6DC9DF1370070B -# AW Ext 2b 100000iter 65outBytes 20pw 20sa -512,706173734441544162303041423759784454546c,73616c744b4559626354635848434278746a4432,100000,594256B0BD4D6C9F21A87F7BA5772A791A10E6110694F44365CD94670E57F1AECD797EF1D1001938719044C7F018026697845EB9AD97D97DE36AB8786AAB5096E7 -# AW Ext 3a 1iter 65outBytes 21pw 21sa -512,706173734441544162303041423759784454546c52,73616c744b4559626354635848434278746a443250,1,A6AC8C048A7DFD7B838DA88F22C3FAB5BFF15D7CB8D83A62C6721A8FAF6903EAB6152CB7421026E36F2FFEF661EB4384DC276495C71B5CAB72E1C1A38712E56B93 -# AW Ext 3b 100000iter 65outBytes 21pw 21sa -512,706173734441544162303041423759784454546c52,73616c744b4559626354635848434278746a443250,100000,94FFC2B1A390B7B8A9E6A44922C330DB2B193ADCF082EECD06057197F35931A9D0EC0EE5C660744B50B61F23119B847E658D179A914807F4B8AB8EB9505AF06526 -# AW Ext 4a 1iter 65outBytes 63pw 63sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,1,E2CCC7827F1DD7C33041A98906A8FD7BAE1920A55FCB8F831683F14F1C3979351CB868717E5AB342D9A11ACF0B12D3283931D609B06602DA33F8377D1F1F9902DA -# AW Ext 4b 100000iter 65outBytes 63pw 63sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,100000,07447401C85766E4AED583DE2E6BF5A675EABE4F3618281C95616F4FC1FDFE6ECBC1C3982789D4FD941D6584EF534A78BD37AE02555D9455E8F089FDB4DFB6BB30 -# AW Ext 5a 1iter 65outBytes 64pw 64sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,1,B029A551117FF36977F283F579DC7065B352266EA243BDD3F920F24D4D141ED8B6E02D96E2D3BDFB76F8D77BA8F4BB548996AD85BB6F11D01A015CE518F9A71780 -# AW Ext 5b 100000iter 65outBytes 64pw 64sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,100000,31F5CC83ED0E948C05A15735D818703AAA7BFF3F09F5169CAF5DBA6602A05A4D5CFF5553D42E82E40516D6DC157B8DAEAE61D3FEA456D964CB2F7F9A63BBBDB59F -# AW Ext 6a 1iter 65outBytes 65pw 65sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,1,28B8A9F644D6800612197BB74DF460272E2276DE8CC07AC4897AC24DBC6EB77499FCAF97415244D9A29DA83FC347D09A5DBCFD6BD63FF6E410803DCA8A900AB671 -# AW Ext 6b 100000iter 65outBytes 65pw 65sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,100000,056BC9072A356B7D4DA60DD66F5968C2CAA375C0220EDA6B47EF8E8D105ED68B44185FE9003FBBA49E2C84240C9E8FD3F5B2F4F6512FD936450253DB37D1002889 -# AW Ext 7a 1iter 65outBytes 127pw 127sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,1,16226C85E4F8D604573008BFE61C10B6947B53990450612DD4A3077F7DEE2116229E68EFD1DF6D73BD3C6D07567790EEA1E8B2AE9A1B046BE593847D9441A1B766 -# AW Ext 7b 100000iter 65outBytes 127pw 127sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,100000,70CF39F14C4CAF3C81FA288FB46C1DB52D19F72722F7BC84F040676D3371C89C11C50F69BCFBC3ACB0AB9E92E4EF622727A916219554B2FA121BEDDA97FF3332EC -# AW Ext 8a 1iter 65outBytes 128pw 128sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,1,880C58C316D3A5B9F05977AB9C60C10ABEEBFAD5CE89CAE62905C1C4F80A0A098D82F95321A6220F8AECCFB45CE6107140899E8D655306AE6396553E2851376C57 -# AW Ext 8b 100000iter 65outBytes 128pw 128sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,100000,2668B71B3CA56136B5E87F30E098F6B4371CB5ED95537C7A073DAC30A2D5BE52756ADF5BB2F4320CB11C4E16B24965A9C790DEF0CBC62906920B4F2EB84D1D4A30 -# AW Ext 9a 1iter 65outBytes 129pw 129sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,1,93B9BA8283CC17D50EF3B44820828A258A996DE258225D24FB59990A6D0DE82DFB3FE2AC201952100E4CC8F06D883A9131419C0F6F5A6ECB8EC821545F14ADF199 -# AW Ext 9b 100000iter 65outBytes 129pw 129sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,100000,2575B485AFDF37C260B8F3386D33A60ED929993C9D48AC516EC66B87E06BE54ADE7E7C8CB3417C81603B080A8EEFC56072811129737CED96236B9364E22CE3A542 -# AW Ext 10a 1iter 65outBytes 1025pw 1025sa -512,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,1,384BCD6914407E40C295D1037CF4F990E8F0E720AF43CB706683177016D36D1A14B3A7CF22B5DF8D5D7D44D69610B64251ADE2E7AB54A3813A89935592E391BF91 -# AW Spl 1 16777216iter 7outBytes 8pw 9sa -512,7061737344415441,73616c744b45596263,16777216,AB96C76400D08B -# AW Spl 2 2097152iter 481outBytes 13pw 12sa -512,70617373444154416230304142,73616c744b45596263546358,2097152,C8CB4B4B498B32CDE191159866A8E86B4C9D84EF1D0A37CF7B9BDC7872EDD5F02242AA7D83172C778EF64C788D622ACBCD4317C4B63A2EDE184CB2A5F6B94815C395CC822D68C637ADB0E928C9692D32D6B66B3825CDB6AC9B57D9D15BCA72CC32773CA45350BB460F83172B75EDD418E2C39DF437FFFDDEF6FF5E83AFC2974E5B391303C80B73DA815E979118FB41ACC3E2019DB30C14650DC7E75D67A048541563A3ECA996CF15F9B3DD7C768B45613078CF772292F092CCFEC10F027669D60EDF56A383894F0EFD7DDC3551E1C6AA366F7EFB39981BF0BDF7894A83D051E900AF2FB81CA990F52EE613A5C2D28D28683E331F50BD10B6F8AF12705E505BCA3BB0D3869246863387DD385748718B3AAA51BA12BB067F1ABD6B8F2E0DECDA0A6693D1331349470E78212B2B4700709BC22C86AE7ADAB9C74635BC0E40A18BE604B8BE7ED1E0419258BB0C38D27264783FE2A915CD63C7CBB6C2D937803D86FFE9DC58132F2AF7642C782AF6A0D50AB47622A73EF16618E15B5CE8EEE9F5A1A477A02ADB5E95638792811013A9A8ACC9F618C4726DC26E67C1DDCE6E1E90594C94D4DE8FD8D89400AB3E8138089B4CD5893BD66691708D1C27FF7E69F12D1A15983352933DE1583A2127DC8B62E345C0B1CD14F9F7BC85FFBCEB40E80E84E8E8C0 - -# -# https://github.com/Anti-weakpasswords/PBKDF2-Test-Vectors/releases -# - -# AW 1a 1iter 32outBytes 31pw 31sa -256,706173734441544162303041423759784454546c5248326471784478313947,73616c744b4559626354635848434278746a4432506e426834344149513658,1,089314BCDFF35115C3240C0CEE274C114C7BC49FD498F853928A385528C9D9C3 -# AW 1b 100000iter 32outBytes 31pw 31sa -256,706173734441544162303041423759784454546c5248326471784478313947,73616c744b4559626354635848434278746a4432506e426834344149513658,100000,4A087BE50A80D23CAF4906010CEB7C9BCCBDDAE52380DD60B6DAFF4A2287CA41 -# AW 2a 1iter 32outBytes 32pw 32sa -256,706173734441544162303041423759784454546c524832647178447831394744,73616c744b4559626354635848434278746a4432506e42683434414951365855,1,806E79AEA28676B851B61D6D76E55DD49DC6781E50B76E2C1F32A2FFAEE91624 -# AW 2b 100000iter 32outBytes 32pw 32sa -256,706173734441544162303041423759784454546c524832647178447831394744,73616c744b4559626354635848434278746a4432506e42683434414951365855,100000,89D738B7AFACEC234157C84390C8357D34CCBF267C2DD14C8D357C4A459F5392 -# AW 3a 1iter 32outBytes 33pw 33sa -256,706173734441544162303041423759784454546c52483264717844783139474478,73616c744b4559626354635848434278746a4432506e426834344149513658554f,1,CCDE3C818E49B7CA1103A9C88597AC4B516E600F8084372901E1E88F56277FC5 -# AW 3b 100000iter 32outBytes 33pw 33sa -256,706173734441544162303041423759784454546c52483264717844783139474478,73616c744b4559626354635848434278746a4432506e426834344149513658554f,100000,8FEA43515B6669B32619916664D03A9547D667BBA4249499D80A0D53E379DC18 -# AW 4a 1iter 32outBytes 63pw 63sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,1,3B28BF8995D81DDF78040C36D2E22C3B7C674BA05F91F11E3319BFB6FC8AC69E -# AW 4b 100000iter 32outBytes 63pw 63sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,100000,DE166AF05815A27B3317662E72ECC139B262911F8790CCE62B5D10D9CF4BE3DC -# AW 5a 1iter 32outBytes 64pw 64sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,1,43B34EC2B78FB5E1ABA41A5453F733C65B6604626D0F0C0BCC275CDC32F4717B -# AW 5b 100000iter 32outBytes 64pw 64sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,100000,78CDCD1505BBF7AF1695173C147398BFBB57A774AA93F8F7A415F87A84C6C03B -# AW 6a 1iter 32outBytes 65pw 65sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,1,57547F8DDB48E9F9926723050AFB0ADFA48F0FB8C0D7274448F55595FEBEC5EA -# AW 6b 100000iter 32outBytes 65pw 65sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,100000,844E50F6F72A2EA3D5D23BF781DF0F8D3B89BF5D37D609F9B87FDEA6C4508675 -# AW 7a 1iter 32outBytes 127pw 127sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,1,2212BB287D744DEF4CC1BC51EE73EE191966BCF7B1F62A98DD2632783C3301BD -# AW 7b 100000iter 32outBytes 127pw 127sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,100000,42D29932A23F82C16F11F854757D32EB5201A1F46561440DB97D85E1D8C97896 -# AW 8a 1iter 32outBytes 128pw 128sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,1,D5B7964768AAE8B3293CEDB72B061ADF08ADB2FC75536330CBB41F1C03BC699E -# AW 8b 100000iter 32outBytes 128pw 128sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,100000,3D3A047ABF790AABE0EEBB907E4648D4E3202474FE937BF6E5EC8EFE5F30752D -# AW 9a 1iter 32outBytes 129pw 129sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,1,F83D917F329DA4A215F5350BB7C4A614854184F6FAF204D352C73E6F345B22C8 -# AW 9b 100000iter 32outBytes 129pw 129sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,100000,029D495DC4FF9A27D4BC532B6C9E435A74DDF19087113A207FC8D0FC6F412208 -# AW 10a 1iter 32outBytes 1025pw 1025sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,1,4D7AB8C17E8906EF0D8BF41835A41138FA844C7949AC4567108008284DB323F7 -# AW 10b 100000iter 32outBytes 1025pw 1025sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,100000,25BC2936281DB8D43C6D612B1C6F7A137EC53E0F45777252401813D5AB6C7A0E -# AW Trunc 1a 1iter 31outBytes 31pw 31sa -256,706173734441544162303041423759784454546c5248326471784478313947,73616c744b4559626354635848434278746a4432506e426834344149513658,1,089314BCDFF35115C3240C0CEE274C114C7BC49FD498F853928A385528C9D9 -# AW Trunc 1b 100000iter 31outBytes 31pw 31sa -256,706173734441544162303041423759784454546c5248326471784478313947,73616c744b4559626354635848434278746a4432506e426834344149513658,100000,4A087BE50A80D23CAF4906010CEB7C9BCCBDDAE52380DD60B6DAFF4A2287CA -# AW Trunc 2a 1iter 31outBytes 32pw 32sa -256,706173734441544162303041423759784454546c524832647178447831394744,73616c744b4559626354635848434278746a4432506e42683434414951365855,1,806E79AEA28676B851B61D6D76E55DD49DC6781E50B76E2C1F32A2FFAEE916 -# AW Trunc 2b 100000iter 31outBytes 32pw 32sa -256,706173734441544162303041423759784454546c524832647178447831394744,73616c744b4559626354635848434278746a4432506e42683434414951365855,100000,89D738B7AFACEC234157C84390C8357D34CCBF267C2DD14C8D357C4A459F53 -# AW Trunc 3a 1iter 31outBytes 33pw 33sa -256,706173734441544162303041423759784454546c52483264717844783139474478,73616c744b4559626354635848434278746a4432506e426834344149513658554f,1,CCDE3C818E49B7CA1103A9C88597AC4B516E600F8084372901E1E88F56277F -# AW Trunc 3b 100000iter 31outBytes 33pw 33sa -256,706173734441544162303041423759784454546c52483264717844783139474478,73616c744b4559626354635848434278746a4432506e426834344149513658554f,100000,8FEA43515B6669B32619916664D03A9547D667BBA4249499D80A0D53E379DC -# AW Trunc 4a 1iter 31outBytes 63pw 63sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,1,3B28BF8995D81DDF78040C36D2E22C3B7C674BA05F91F11E3319BFB6FC8AC6 -# AW Trunc 4b 100000iter 31outBytes 63pw 63sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,100000,DE166AF05815A27B3317662E72ECC139B262911F8790CCE62B5D10D9CF4BE3 -# AW Trunc 5a 1iter 31outBytes 64pw 64sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,1,43B34EC2B78FB5E1ABA41A5453F733C65B6604626D0F0C0BCC275CDC32F471 -# AW Trunc 5b 100000iter 31outBytes 64pw 64sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,100000,78CDCD1505BBF7AF1695173C147398BFBB57A774AA93F8F7A415F87A84C6C0 -# AW Trunc 6a 1iter 31outBytes 65pw 65sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,1,57547F8DDB48E9F9926723050AFB0ADFA48F0FB8C0D7274448F55595FEBEC5 -# AW Trunc 6b 100000iter 31outBytes 65pw 65sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,100000,844E50F6F72A2EA3D5D23BF781DF0F8D3B89BF5D37D609F9B87FDEA6C45086 -# AW Trunc 7a 1iter 31outBytes 127pw 127sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,1,2212BB287D744DEF4CC1BC51EE73EE191966BCF7B1F62A98DD2632783C3301 -# AW Trunc 7b 100000iter 31outBytes 127pw 127sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,100000,42D29932A23F82C16F11F854757D32EB5201A1F46561440DB97D85E1D8C978 -# AW Trunc 7a 1iter 31outBytes 128pw 128sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,1,D5B7964768AAE8B3293CEDB72B061ADF08ADB2FC75536330CBB41F1C03BC69 -# AW Trunc 8b 100000iter 31outBytes 128pw 128sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,100000,3D3A047ABF790AABE0EEBB907E4648D4E3202474FE937BF6E5EC8EFE5F3075 -# AW Trunc 9a 1iter 31outBytes 129pw 129sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,1,F83D917F329DA4A215F5350BB7C4A614854184F6FAF204D352C73E6F345B22 -# AW Trunc 9b 100000iter 31outBytes 129pw 129sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,100000,029D495DC4FF9A27D4BC532B6C9E435A74DDF19087113A207FC8D0FC6F4122 -# AW Trunc 10a 1iter 31outBytes 1025pw 1025sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,1,4D7AB8C17E8906EF0D8BF41835A41138FA844C7949AC4567108008284DB323 -# AW Trunc 10b 100000iter 31outBytes 1025pw 1025sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,100000,25BC2936281DB8D43C6D612B1C6F7A137EC53E0F45777252401813D5AB6C7A -# AW Ext 1a 1iter 33outBytes 31pw 31sa -256,706173734441544162303041423759784454546c5248326471784478313947,73616c744b4559626354635848434278746a4432506e426834344149513658,1,089314BCDFF35115C3240C0CEE274C114C7BC49FD498F853928A385528C9D9C34D -# AW Ext 1b 100000iter 33outBytes 31pw 31sa -256,706173734441544162303041423759784454546c5248326471784478313947,73616c744b4559626354635848434278746a4432506e426834344149513658,100000,4A087BE50A80D23CAF4906010CEB7C9BCCBDDAE52380DD60B6DAFF4A2287CA4148 -# AW Ext 2a 1iter 33outBytes 32pw 32sa -256,706173734441544162303041423759784454546c524832647178447831394744,73616c744b4559626354635848434278746a4432506e42683434414951365855,1,806E79AEA28676B851B61D6D76E55DD49DC6781E50B76E2C1F32A2FFAEE91624BB -# AW Ext 2b 100000iter 33outBytes 32pw 32sa -256,706173734441544162303041423759784454546c524832647178447831394744,73616c744b4559626354635848434278746a4432506e42683434414951365855,100000,89D738B7AFACEC234157C84390C8357D34CCBF267C2DD14C8D357C4A459F5392E8 -# AW Ext 3a 1iter 33outBytes 33pw 33sa -256,706173734441544162303041423759784454546c52483264717844783139474478,73616c744b4559626354635848434278746a4432506e426834344149513658554f,1,CCDE3C818E49B7CA1103A9C88597AC4B516E600F8084372901E1E88F56277FC50F -# AW Ext 3b 100000iter 33outBytes 33pw 33sa -256,706173734441544162303041423759784454546c52483264717844783139474478,73616c744b4559626354635848434278746a4432506e426834344149513658554f,100000,8FEA43515B6669B32619916664D03A9547D667BBA4249499D80A0D53E379DC18C9 -# AW Ext 4a 1iter 33outBytes 63pw 63sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,1,3B28BF8995D81DDF78040C36D2E22C3B7C674BA05F91F11E3319BFB6FC8AC69EFA -# AW Ext 4b 100000iter 33outBytes 63pw 63sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c7474704535,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a65,100000,DE166AF05815A27B3317662E72ECC139B262911F8790CCE62B5D10D9CF4BE3DC6F -# AW Ext 5a 1iter 33outBytes 64pw 64sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,1,43B34EC2B78FB5E1ABA41A5453F733C65B6604626D0F0C0BCC275CDC32F4717BC8 -# AW Ext 5b 100000iter 33outBytes 64pw 64sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d,100000,78CDCD1505BBF7AF1695173C147398BFBB57A774AA93F8F7A415F87A84C6C03BF3 -# AW Ext 6a 1iter 33outBytes 65pw 65sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,1,57547F8DDB48E9F9926723050AFB0ADFA48F0FB8C0D7274448F55595FEBEC5EAD8 -# AW Ext 6b 100000iter 33outBytes 65pw 65sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c74747045353755,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b,100000,844E50F6F72A2EA3D5D23BF781DF0F8D3B89BF5D37D609F9B87FDEA6C450867559 -# AW Ext 7a 1iter 33outBytes 127pw 127sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,1,2212BB287D744DEF4CC1BC51EE73EE191966BCF7B1F62A98DD2632783C3301BDE3 -# AW Ext 7b 100000iter 33outBytes 127pw 127sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b6275563661776930,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d70627879,100000,42D29932A23F82C16F11F854757D32EB5201A1F46561440DB97D85E1D8C978962E -# AW Ext 8a 1iter 33outBytes 128pw 128sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,1,D5B7964768AAE8B3293CEDB72B061ADF08ADB2FC75536330CBB41F1C03BC699E08 -# AW Ext 8b 100000iter 33outBytes 128pw 128sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936,100000,3D3A047ABF790AABE0EEBB907E4648D4E3202474FE937BF6E5EC8EFE5F30752D56 -# AW Ext 9a 1iter 33outBytes 129pw 129sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,1,F83D917F329DA4A215F5350BB7C4A614854184F6FAF204D352C73E6F345B22C88C -# AW Ext 9b 100000iter 33outBytes 129pw 129sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b62755636617769303455,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d706278793650,100000,029D495DC4FF9A27D4BC532B6C9E435A74DDF19087113A207FC8D0FC6F4122085F -# AW Ext 10a 1iter 33outBytes 1025pw 1025sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,1,4D7AB8C17E8906EF0D8BF41835A41138FA844C7949AC4567108008284DB323F7CE -# AW Ext 10b 100000iter 33outBytes 1025pw 1025sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254663749396669654d65574348544d6b4d3456636d5179514870626350384d45623566316736436b6735786b3348517233774d427651634f4870435079314b3848434d376135776b5044686756413042566d774e707352496244515a5274484b36645436624779616c70366762465a427542487744383667547a6b72465937486b4f5672676330674a63474a5a65363543653876344a6e354f7a6b75567369553865666d32507732526e62705753417237536b56644377584b3258534a445135665a344842457a395654465972473233454c754c6a7678356e6a4f4c4e6744414a7566354a4232746e346e4d6a6a636e6c31653871635956775a71467a4576327a684c7944574d6b5634747a6c3461734c6e7679417854426b7850525a6a3270524142577762336b456f6670734859784d54416e33385953705a72656f5869705a57426e7536484455526172755861495059465059486c394c73397773754437727a614766624f796656674c49474b35724f447068775241376c6d383862474b5938623774574f746570794576614c784d4937475a4635536377705a54596545444e554b507a764d32496d397a656849617a6e7067754e644e584e4d4c576e7750753448367a4576616a6b7733473375635369584b6d6836584e6533686b6453414e6d33766e787a52586d346663757a4178363849456c584532626b4746456c6c75444c6f3645735544575a344a4957425661447759644a78387543586251646f69667a4373356b7575436c614461447149686235684a325752386d78697565467353306144476449596d79653573766d4e6d7a5178466d644f6b486f463743667775553179793475454574397650535032774670316479614d764a573638767442346b64644c6d493667496756566354365a5831516d36577375735072646973504c423253636f64586f6a43624c33444c6a36504b47385144564d5754724c3154706166543277736c526c656457496873546c76326d493343303636574d635453774b4c58644544685676464a365368694c4b534e37676e52726c4530426e4177,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a36795852444850773950794630694c596d3975467445756e6c41417847423571716561345835745a7642314f664c5677796d593361334a506a64785464764878434862717145307a697036314a4e71646d65577847746c5242433643476f4369484f34587848436e745142524a446347307a57376a6f5464677454426172735151686c4c5842474d4e42534e6d6d546244663368467461775542434a483138494169524d777965514a624a326245527359334d5652507559436634417537674e3732694768316c526b745351744546796537704f34366b4d585272456a48515758496e4d7a7a79375832537458557a48565446463256644f6f4b6e30575571464e7642365046377149734f6c594b6a3537626931507361333473383557784d5362546b68726437564864485a6b545661576472616f6858594f65506465457649774f62434745586b4554557a714d355032797a6f424f4a53646a7049596161387a7a644c4433797262315477435a754a567873727130585859367645725534516e74735730393732586d474e79756d464e4a69506d344f4e4b6831524c7653316b646459336e6d3832373653345455755a667252514f3851785a524e7553615a49384a525a7035566f6a4235446b74754d7841516b716f506a5135567462366f58654f79593539314342314d455731664c544373304e724c33323153614e524d717a613145546f67417870456959775a367049676e4d6d53714e4d52645a6e43714134674d5777316c49564154574b38334f436569634e52554e4f64667a5337413876624c636d764b5074704f4676684e7a77727255646b76754b7661594a76695167655237736e4765744f394a4c4377496c48496a3532674d434e553138643332534a6c37586f6d746c337749653032534d767131693142636158376c58696f7157476d6756714257553366735575477748693652554b43435164454f42664e6f32576470466143666c63676e6e304f366a564843716b763863516b3831417153303072416d4847434e547779413654713554586f4c6c446e43386741516a4455735a70307a,100000,25BC2936281DB8D43C6D612B1C6F7A137EC53E0F45777252401813D5AB6C7A0EF8 -# AW Spl 1 16777216iter 7outBytes 8pw 9sa -256,7061737344415441,73616c744b45596263,16777216,CEF414181274D2 -# AW Spl 2 2097152iter 241outBytes 13pw 12sa -256,70617373444154416230304142,73616c744b45596263546358,2097152,2DA3D20A280599D71AECDFADEC857325950C59E0715F4576BCF532F8CAFF3E6A99976F66ACB3530751AA106783281DBE24E8688868AA45D5011220D55CCCF3860D3DA6AA91259A13949E39102A61C88B1DF45E0BCA421EA35231565DC3F7E7566C43B0497D6D98961515CC0F5C9D2BEE0A10609A6CFC03F83AEC9242A61FECF8511BB7F529FD54B74B048D69D2B71ABD28AA67E583171799983465785B3739A07670A89DCF07ED09053FD7BD3A9009A60AC8EFDFDAC2F9B5E191E80E72EEAA94E274DF7CAB3E232ABCE15D41DAEAEA91C2C55B7B86E4F9F50371B64012F09D5A9755765F9CF7556A8D8177F8BC2E0668F3 -# AW Spl 3 16777216iter 8outBytes 256pw 255sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c6474595658575658483254,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a3679585244,16777216,C81F8B52ABC33474 -# AW Spl 4 2097152iter 256outBytes 257pw 256sa -256,706173734441544162303041423759784454546c524832647178447831394744784456317a464d7a3745365156714b497a774f744d6e6c78514c747470453537556e3475313244325944376f4f5070694576434459766e74584565344e4e504c436e4747654a417262594445753678446f43665748366b627556366177693034557a3365624541687a5a347665314132776735436e4c58645a4335593767776656676245675a53546d6f5951537a43354f57346466726a71697741705441434f36786f4f4c31416a576a3658366636714666463854566d4f7a553952684f64314e3451747a574934665036465974744e7a3546754c647459565857565848325466,73616c744b4559626354635848434278746a4432506e426834344149513658554f4345534f685870457033487263474d77626a7a514b4d5361663633494a656d6b5552576f714875734965564238496c39314e6a694347516163505575397154466153684c624b4730596a3452434d56353657506a37453134454d7062787936506c4264494c424f6b4b554236544754504a5868317470644f485447364b754976636251703971576a6166317578414b676954745952494868786a4a4932766956613666445a3637514f6f754f6166325258516870735761547441566e66663650494663764a68645044464756356e766d5a576f435a516f646a367958524448,2097152,7B0968F0B9CCBB0D00AB41BE83FD1C9E31BD2C6AC8082D7D560548762CC2FCDC25FB042024D425DC6F691832332046381D9F9F9DD3DF70E31D6F856F948ECA4386BD01DB905779B5B7C9B782272EEC2E42CD7C6AC26919025C708AA99E4A7788E54FF9A732A82938F009B8933836EA6E6B76E804FFF1706BB66AD53FFA10298C8C7A4CDE6311AA4CB0A9BEB01BB4EDE9BA976CBECC9DCF7C150D787F18D4C10A7BF9A9C980FDD732096CA5094B0B15FF44F9F59B6E582EB4CF155F9C7434258DCE8364109032D7C5F5CEB1B24BE2368C3D1D405530C7CFC59D36CDA9A2580F61FAE678273FEEB6F4BB3BA7096E4EACE141CB12DF49119F4FC1F2336F1C08E05C - -# -# This is the first input vector of the first scrypt vector. It -# is unusual only in that password and salt are both zero-length. -# -256,,,1,f7ce0b653d2d72a4108cf5abe912ffdd777616dbbb27a70e8204f3ae2d0f6fad89f68f4811d1e87bcc3bd7400a9ffd29094f0184639574f39ae5a1315217bcd7894991447213bb226c25b54da86370fbcd984380374666bb8ffcb5bf40c254b067d27c51ce4ad5fed829c90b505a571b7f4d1cad6a523cda770e67bceaaf7e89 diff --git a/external/libwally-core/src/data/wordlists/README b/external/libwally-core/src/data/wordlists/README deleted file mode 100644 index 1eea10a61..000000000 --- a/external/libwally-core/src/data/wordlists/README +++ /dev/null @@ -1,9 +0,0 @@ -These lists have been taken from the reference implementation at: - -https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md - -With some minor changes (BOM removal). - -The c files are generated using: - -python3 tools/wordlist_cc.py /path/to/language.txt shortname diff --git a/external/libwally-core/src/data/wordlists/chinese_simplified.c b/external/libwally-core/src/data/wordlists/chinese_simplified.c deleted file mode 100644 index 7227d62ba..000000000 --- a/external/libwally-core/src/data/wordlists/chinese_simplified.c +++ /dev/null @@ -1,2408 +0,0 @@ -/* Generated file - do not edit! */ -#include - -static const unsigned char zhs_[] = { - 0xe7,0x9a,0x84,0, - 0xe4,0xb8,0x80,0, - 0xe6,0x98,0xaf,0, - 0xe5,0x9c,0xa8,0, - 0xe4,0xb8,0x8d,0, - 0xe4,0xba,0x86,0, - 0xe6,0x9c,0x89,0, - 0xe5,0x92,0x8c,0, - 0xe4,0xba,0xba,0, - 0xe8,0xbf,0x99,0, - 0xe4,0xb8,0xad,0, - 0xe5,0xa4,0xa7,0, - 0xe4,0xb8,0xba,0, - 0xe4,0xb8,0x8a,0, - 0xe4,0xb8,0xaa,0, - 0xe5,0x9b,0xbd,0, - 0xe6,0x88,0x91,0, - 0xe4,0xbb,0xa5,0, - 0xe8,0xa6,0x81,0, - 0xe4,0xbb,0x96,0, - 0xe6,0x97,0xb6,0, - 0xe6,0x9d,0xa5,0, - 0xe7,0x94,0xa8,0, - 0xe4,0xbb,0xac,0, - 0xe7,0x94,0x9f,0, - 0xe5,0x88,0xb0,0, - 0xe4,0xbd,0x9c,0, - 0xe5,0x9c,0xb0,0, - 0xe4,0xba,0x8e,0, - 0xe5,0x87,0xba,0, - 0xe5,0xb0,0xb1,0, - 0xe5,0x88,0x86,0, - 0xe5,0xaf,0xb9,0, - 0xe6,0x88,0x90,0, - 0xe4,0xbc,0x9a,0, - 0xe5,0x8f,0xaf,0, - 0xe4,0xb8,0xbb,0, - 0xe5,0x8f,0x91,0, - 0xe5,0xb9,0xb4,0, - 0xe5,0x8a,0xa8,0, - 0xe5,0x90,0x8c,0, - 0xe5,0xb7,0xa5,0, - 0xe4,0xb9,0x9f,0, - 0xe8,0x83,0xbd,0, - 0xe4,0xb8,0x8b,0, - 0xe8,0xbf,0x87,0, - 0xe5,0xad,0x90,0, - 0xe8,0xaf,0xb4,0, - 0xe4,0xba,0xa7,0, - 0xe7,0xa7,0x8d,0, - 0xe9,0x9d,0xa2,0, - 0xe8,0x80,0x8c,0, - 0xe6,0x96,0xb9,0, - 0xe5,0x90,0x8e,0, - 0xe5,0xa4,0x9a,0, - 0xe5,0xae,0x9a,0, - 0xe8,0xa1,0x8c,0, - 0xe5,0xad,0xa6,0, - 0xe6,0xb3,0x95,0, - 0xe6,0x89,0x80,0, - 0xe6,0xb0,0x91,0, - 0xe5,0xbe,0x97,0, - 0xe7,0xbb,0x8f,0, - 0xe5,0x8d,0x81,0, - 0xe4,0xb8,0x89,0, - 0xe4,0xb9,0x8b,0, - 0xe8,0xbf,0x9b,0, - 0xe7,0x9d,0x80,0, - 0xe7,0xad,0x89,0, - 0xe9,0x83,0xa8,0, - 0xe5,0xba,0xa6,0, - 0xe5,0xae,0xb6,0, - 0xe7,0x94,0xb5,0, - 0xe5,0x8a,0x9b,0, - 0xe9,0x87,0x8c,0, - 0xe5,0xa6,0x82,0, - 0xe6,0xb0,0xb4,0, - 0xe5,0x8c,0x96,0, - 0xe9,0xab,0x98,0, - 0xe8,0x87,0xaa,0, - 0xe4,0xba,0x8c,0, - 0xe7,0x90,0x86,0, - 0xe8,0xb5,0xb7,0, - 0xe5,0xb0,0x8f,0, - 0xe7,0x89,0xa9,0, - 0xe7,0x8e,0xb0,0, - 0xe5,0xae,0x9e,0, - 0xe5,0x8a,0xa0,0, - 0xe9,0x87,0x8f,0, - 0xe9,0x83,0xbd,0, - 0xe4,0xb8,0xa4,0, - 0xe4,0xbd,0x93,0, - 0xe5,0x88,0xb6,0, - 0xe6,0x9c,0xba,0, - 0xe5,0xbd,0x93,0, - 0xe4,0xbd,0xbf,0, - 0xe7,0x82,0xb9,0, - 0xe4,0xbb,0x8e,0, - 0xe4,0xb8,0x9a,0, - 0xe6,0x9c,0xac,0, - 0xe5,0x8e,0xbb,0, - 0xe6,0x8a,0x8a,0, - 0xe6,0x80,0xa7,0, - 0xe5,0xa5,0xbd,0, - 0xe5,0xba,0x94,0, - 0xe5,0xbc,0x80,0, - 0xe5,0xae,0x83,0, - 0xe5,0x90,0x88,0, - 0xe8,0xbf,0x98,0, - 0xe5,0x9b,0xa0,0, - 0xe7,0x94,0xb1,0, - 0xe5,0x85,0xb6,0, - 0xe4,0xba,0x9b,0, - 0xe7,0x84,0xb6,0, - 0xe5,0x89,0x8d,0, - 0xe5,0xa4,0x96,0, - 0xe5,0xa4,0xa9,0, - 0xe6,0x94,0xbf,0, - 0xe5,0x9b,0x9b,0, - 0xe6,0x97,0xa5,0, - 0xe9,0x82,0xa3,0, - 0xe7,0xa4,0xbe,0, - 0xe4,0xb9,0x89,0, - 0xe4,0xba,0x8b,0, - 0xe5,0xb9,0xb3,0, - 0xe5,0xbd,0xa2,0, - 0xe7,0x9b,0xb8,0, - 0xe5,0x85,0xa8,0, - 0xe8,0xa1,0xa8,0, - 0xe9,0x97,0xb4,0, - 0xe6,0xa0,0xb7,0, - 0xe4,0xb8,0x8e,0, - 0xe5,0x85,0xb3,0, - 0xe5,0x90,0x84,0, - 0xe9,0x87,0x8d,0, - 0xe6,0x96,0xb0,0, - 0xe7,0xba,0xbf,0, - 0xe5,0x86,0x85,0, - 0xe6,0x95,0xb0,0, - 0xe6,0xad,0xa3,0, - 0xe5,0xbf,0x83,0, - 0xe5,0x8f,0x8d,0, - 0xe4,0xbd,0xa0,0, - 0xe6,0x98,0x8e,0, - 0xe7,0x9c,0x8b,0, - 0xe5,0x8e,0x9f,0, - 0xe5,0x8f,0x88,0, - 0xe4,0xb9,0x88,0, - 0xe5,0x88,0xa9,0, - 0xe6,0xaf,0x94,0, - 0xe6,0x88,0x96,0, - 0xe4,0xbd,0x86,0, - 0xe8,0xb4,0xa8,0, - 0xe6,0xb0,0x94,0, - 0xe7,0xac,0xac,0, - 0xe5,0x90,0x91,0, - 0xe9,0x81,0x93,0, - 0xe5,0x91,0xbd,0, - 0xe6,0xad,0xa4,0, - 0xe5,0x8f,0x98,0, - 0xe6,0x9d,0xa1,0, - 0xe5,0x8f,0xaa,0, - 0xe6,0xb2,0xa1,0, - 0xe7,0xbb,0x93,0, - 0xe8,0xa7,0xa3,0, - 0xe9,0x97,0xae,0, - 0xe6,0x84,0x8f,0, - 0xe5,0xbb,0xba,0, - 0xe6,0x9c,0x88,0, - 0xe5,0x85,0xac,0, - 0xe6,0x97,0xa0,0, - 0xe7,0xb3,0xbb,0, - 0xe5,0x86,0x9b,0, - 0xe5,0xbe,0x88,0, - 0xe6,0x83,0x85,0, - 0xe8,0x80,0x85,0, - 0xe6,0x9c,0x80,0, - 0xe7,0xab,0x8b,0, - 0xe4,0xbb,0xa3,0, - 0xe6,0x83,0xb3,0, - 0xe5,0xb7,0xb2,0, - 0xe9,0x80,0x9a,0, - 0xe5,0xb9,0xb6,0, - 0xe6,0x8f,0x90,0, - 0xe7,0x9b,0xb4,0, - 0xe9,0xa2,0x98,0, - 0xe5,0x85,0x9a,0, - 0xe7,0xa8,0x8b,0, - 0xe5,0xb1,0x95,0, - 0xe4,0xba,0x94,0, - 0xe6,0x9e,0x9c,0, - 0xe6,0x96,0x99,0, - 0xe8,0xb1,0xa1,0, - 0xe5,0x91,0x98,0, - 0xe9,0x9d,0xa9,0, - 0xe4,0xbd,0x8d,0, - 0xe5,0x85,0xa5,0, - 0xe5,0xb8,0xb8,0, - 0xe6,0x96,0x87,0, - 0xe6,0x80,0xbb,0, - 0xe6,0xac,0xa1,0, - 0xe5,0x93,0x81,0, - 0xe5,0xbc,0x8f,0, - 0xe6,0xb4,0xbb,0, - 0xe8,0xae,0xbe,0, - 0xe5,0x8f,0x8a,0, - 0xe7,0xae,0xa1,0, - 0xe7,0x89,0xb9,0, - 0xe4,0xbb,0xb6,0, - 0xe9,0x95,0xbf,0, - 0xe6,0xb1,0x82,0, - 0xe8,0x80,0x81,0, - 0xe5,0xa4,0xb4,0, - 0xe5,0x9f,0xba,0, - 0xe8,0xb5,0x84,0, - 0xe8,0xbe,0xb9,0, - 0xe6,0xb5,0x81,0, - 0xe8,0xb7,0xaf,0, - 0xe7,0xba,0xa7,0, - 0xe5,0xb0,0x91,0, - 0xe5,0x9b,0xbe,0, - 0xe5,0xb1,0xb1,0, - 0xe7,0xbb,0x9f,0, - 0xe6,0x8e,0xa5,0, - 0xe7,0x9f,0xa5,0, - 0xe8,0xbe,0x83,0, - 0xe5,0xb0,0x86,0, - 0xe7,0xbb,0x84,0, - 0xe8,0xa7,0x81,0, - 0xe8,0xae,0xa1,0, - 0xe5,0x88,0xab,0, - 0xe5,0xa5,0xb9,0, - 0xe6,0x89,0x8b,0, - 0xe8,0xa7,0x92,0, - 0xe6,0x9c,0x9f,0, - 0xe6,0xa0,0xb9,0, - 0xe8,0xae,0xba,0, - 0xe8,0xbf,0x90,0, - 0xe5,0x86,0x9c,0, - 0xe6,0x8c,0x87,0, - 0xe5,0x87,0xa0,0, - 0xe4,0xb9,0x9d,0, - 0xe5,0x8c,0xba,0, - 0xe5,0xbc,0xba,0, - 0xe6,0x94,0xbe,0, - 0xe5,0x86,0xb3,0, - 0xe8,0xa5,0xbf,0, - 0xe8,0xa2,0xab,0, - 0xe5,0xb9,0xb2,0, - 0xe5,0x81,0x9a,0, - 0xe5,0xbf,0x85,0, - 0xe6,0x88,0x98,0, - 0xe5,0x85,0x88,0, - 0xe5,0x9b,0x9e,0, - 0xe5,0x88,0x99,0, - 0xe4,0xbb,0xbb,0, - 0xe5,0x8f,0x96,0, - 0xe6,0x8d,0xae,0, - 0xe5,0xa4,0x84,0, - 0xe9,0x98,0x9f,0, - 0xe5,0x8d,0x97,0, - 0xe7,0xbb,0x99,0, - 0xe8,0x89,0xb2,0, - 0xe5,0x85,0x89,0, - 0xe9,0x97,0xa8,0, - 0xe5,0x8d,0xb3,0, - 0xe4,0xbf,0x9d,0, - 0xe6,0xb2,0xbb,0, - 0xe5,0x8c,0x97,0, - 0xe9,0x80,0xa0,0, - 0xe7,0x99,0xbe,0, - 0xe8,0xa7,0x84,0, - 0xe7,0x83,0xad,0, - 0xe9,0xa2,0x86,0, - 0xe4,0xb8,0x83,0, - 0xe6,0xb5,0xb7,0, - 0xe5,0x8f,0xa3,0, - 0xe4,0xb8,0x9c,0, - 0xe5,0xaf,0xbc,0, - 0xe5,0x99,0xa8,0, - 0xe5,0x8e,0x8b,0, - 0xe5,0xbf,0x97,0, - 0xe4,0xb8,0x96,0, - 0xe9,0x87,0x91,0, - 0xe5,0xa2,0x9e,0, - 0xe4,0xba,0x89,0, - 0xe6,0xb5,0x8e,0, - 0xe9,0x98,0xb6,0, - 0xe6,0xb2,0xb9,0, - 0xe6,0x80,0x9d,0, - 0xe6,0x9c,0xaf,0, - 0xe6,0x9e,0x81,0, - 0xe4,0xba,0xa4,0, - 0xe5,0x8f,0x97,0, - 0xe8,0x81,0x94,0, - 0xe4,0xbb,0x80,0, - 0xe8,0xae,0xa4,0, - 0xe5,0x85,0xad,0, - 0xe5,0x85,0xb1,0, - 0xe6,0x9d,0x83,0, - 0xe6,0x94,0xb6,0, - 0xe8,0xaf,0x81,0, - 0xe6,0x94,0xb9,0, - 0xe6,0xb8,0x85,0, - 0xe7,0xbe,0x8e,0, - 0xe5,0x86,0x8d,0, - 0xe9,0x87,0x87,0, - 0xe8,0xbd,0xac,0, - 0xe6,0x9b,0xb4,0, - 0xe5,0x8d,0x95,0, - 0xe9,0xa3,0x8e,0, - 0xe5,0x88,0x87,0, - 0xe6,0x89,0x93,0, - 0xe7,0x99,0xbd,0, - 0xe6,0x95,0x99,0, - 0xe9,0x80,0x9f,0, - 0xe8,0x8a,0xb1,0, - 0xe5,0xb8,0xa6,0, - 0xe5,0xae,0x89,0, - 0xe5,0x9c,0xba,0, - 0xe8,0xba,0xab,0, - 0xe8,0xbd,0xa6,0, - 0xe4,0xbe,0x8b,0, - 0xe7,0x9c,0x9f,0, - 0xe5,0x8a,0xa1,0, - 0xe5,0x85,0xb7,0, - 0xe4,0xb8,0x87,0, - 0xe6,0xaf,0x8f,0, - 0xe7,0x9b,0xae,0, - 0xe8,0x87,0xb3,0, - 0xe8,0xbe,0xbe,0, - 0xe8,0xb5,0xb0,0, - 0xe7,0xa7,0xaf,0, - 0xe7,0xa4,0xba,0, - 0xe8,0xae,0xae,0, - 0xe5,0xa3,0xb0,0, - 0xe6,0x8a,0xa5,0, - 0xe6,0x96,0x97,0, - 0xe5,0xae,0x8c,0, - 0xe7,0xb1,0xbb,0, - 0xe5,0x85,0xab,0, - 0xe7,0xa6,0xbb,0, - 0xe5,0x8d,0x8e,0, - 0xe5,0x90,0x8d,0, - 0xe7,0xa1,0xae,0, - 0xe6,0x89,0x8d,0, - 0xe7,0xa7,0x91,0, - 0xe5,0xbc,0xa0,0, - 0xe4,0xbf,0xa1,0, - 0xe9,0xa9,0xac,0, - 0xe8,0x8a,0x82,0, - 0xe8,0xaf,0x9d,0, - 0xe7,0xb1,0xb3,0, - 0xe6,0x95,0xb4,0, - 0xe7,0xa9,0xba,0, - 0xe5,0x85,0x83,0, - 0xe5,0x86,0xb5,0, - 0xe4,0xbb,0x8a,0, - 0xe9,0x9b,0x86,0, - 0xe6,0xb8,0xa9,0, - 0xe4,0xbc,0xa0,0, - 0xe5,0x9c,0x9f,0, - 0xe8,0xae,0xb8,0, - 0xe6,0xad,0xa5,0, - 0xe7,0xbe,0xa4,0, - 0xe5,0xb9,0xbf,0, - 0xe7,0x9f,0xb3,0, - 0xe8,0xae,0xb0,0, - 0xe9,0x9c,0x80,0, - 0xe6,0xae,0xb5,0, - 0xe7,0xa0,0x94,0, - 0xe7,0x95,0x8c,0, - 0xe6,0x8b,0x89,0, - 0xe6,0x9e,0x97,0, - 0xe5,0xbe,0x8b,0, - 0xe5,0x8f,0xab,0, - 0xe4,0xb8,0x94,0, - 0xe7,0xa9,0xb6,0, - 0xe8,0xa7,0x82,0, - 0xe8,0xb6,0x8a,0, - 0xe7,0xbb,0x87,0, - 0xe8,0xa3,0x85,0, - 0xe5,0xbd,0xb1,0, - 0xe7,0xae,0x97,0, - 0xe4,0xbd,0x8e,0, - 0xe6,0x8c,0x81,0, - 0xe9,0x9f,0xb3,0, - 0xe4,0xbc,0x97,0, - 0xe4,0xb9,0xa6,0, - 0xe5,0xb8,0x83,0, - 0xe5,0xa4,0x8d,0, - 0xe5,0xae,0xb9,0, - 0xe5,0x84,0xbf,0, - 0xe9,0xa1,0xbb,0, - 0xe9,0x99,0x85,0, - 0xe5,0x95,0x86,0, - 0xe9,0x9d,0x9e,0, - 0xe9,0xaa,0x8c,0, - 0xe8,0xbf,0x9e,0, - 0xe6,0x96,0xad,0, - 0xe6,0xb7,0xb1,0, - 0xe9,0x9a,0xbe,0, - 0xe8,0xbf,0x91,0, - 0xe7,0x9f,0xbf,0, - 0xe5,0x8d,0x83,0, - 0xe5,0x91,0xa8,0, - 0xe5,0xa7,0x94,0, - 0xe7,0xb4,0xa0,0, - 0xe6,0x8a,0x80,0, - 0xe5,0xa4,0x87,0, - 0xe5,0x8d,0x8a,0, - 0xe5,0x8a,0x9e,0, - 0xe9,0x9d,0x92,0, - 0xe7,0x9c,0x81,0, - 0xe5,0x88,0x97,0, - 0xe4,0xb9,0xa0,0, - 0xe5,0x93,0x8d,0, - 0xe7,0xba,0xa6,0, - 0xe6,0x94,0xaf,0, - 0xe8,0x88,0xac,0, - 0xe5,0x8f,0xb2,0, - 0xe6,0x84,0x9f,0, - 0xe5,0x8a,0xb3,0, - 0xe4,0xbe,0xbf,0, - 0xe5,0x9b,0xa2,0, - 0xe5,0xbe,0x80,0, - 0xe9,0x85,0xb8,0, - 0xe5,0x8e,0x86,0, - 0xe5,0xb8,0x82,0, - 0xe5,0x85,0x8b,0, - 0xe4,0xbd,0x95,0, - 0xe9,0x99,0xa4,0, - 0xe6,0xb6,0x88,0, - 0xe6,0x9e,0x84,0, - 0xe5,0xba,0x9c,0, - 0xe7,0xa7,0xb0,0, - 0xe5,0xa4,0xaa,0, - 0xe5,0x87,0x86,0, - 0xe7,0xb2,0xbe,0, - 0xe5,0x80,0xbc,0, - 0xe5,0x8f,0xb7,0, - 0xe7,0x8e,0x87,0, - 0xe6,0x97,0x8f,0, - 0xe7,0xbb,0xb4,0, - 0xe5,0x88,0x92,0, - 0xe9,0x80,0x89,0, - 0xe6,0xa0,0x87,0, - 0xe5,0x86,0x99,0, - 0xe5,0xad,0x98,0, - 0xe5,0x80,0x99,0, - 0xe6,0xaf,0x9b,0, - 0xe4,0xba,0xb2,0, - 0xe5,0xbf,0xab,0, - 0xe6,0x95,0x88,0, - 0xe6,0x96,0xaf,0, - 0xe9,0x99,0xa2,0, - 0xe6,0x9f,0xa5,0, - 0xe6,0xb1,0x9f,0, - 0xe5,0x9e,0x8b,0, - 0xe7,0x9c,0xbc,0, - 0xe7,0x8e,0x8b,0, - 0xe6,0x8c,0x89,0, - 0xe6,0xa0,0xbc,0, - 0xe5,0x85,0xbb,0, - 0xe6,0x98,0x93,0, - 0xe7,0xbd,0xae,0, - 0xe6,0xb4,0xbe,0, - 0xe5,0xb1,0x82,0, - 0xe7,0x89,0x87,0, - 0xe5,0xa7,0x8b,0, - 0xe5,0x8d,0xb4,0, - 0xe4,0xb8,0x93,0, - 0xe7,0x8a,0xb6,0, - 0xe8,0x82,0xb2,0, - 0xe5,0x8e,0x82,0, - 0xe4,0xba,0xac,0, - 0xe8,0xaf,0x86,0, - 0xe9,0x80,0x82,0, - 0xe5,0xb1,0x9e,0, - 0xe5,0x9c,0x86,0, - 0xe5,0x8c,0x85,0, - 0xe7,0x81,0xab,0, - 0xe4,0xbd,0x8f,0, - 0xe8,0xb0,0x83,0, - 0xe6,0xbb,0xa1,0, - 0xe5,0x8e,0xbf,0, - 0xe5,0xb1,0x80,0, - 0xe7,0x85,0xa7,0, - 0xe5,0x8f,0x82,0, - 0xe7,0xba,0xa2,0, - 0xe7,0xbb,0x86,0, - 0xe5,0xbc,0x95,0, - 0xe5,0x90,0xac,0, - 0xe8,0xaf,0xa5,0, - 0xe9,0x93,0x81,0, - 0xe4,0xbb,0xb7,0, - 0xe4,0xb8,0xa5,0, - 0xe9,0xa6,0x96,0, - 0xe5,0xba,0x95,0, - 0xe6,0xb6,0xb2,0, - 0xe5,0xae,0x98,0, - 0xe5,0xbe,0xb7,0, - 0xe9,0x9a,0x8f,0, - 0xe7,0x97,0x85,0, - 0xe8,0x8b,0x8f,0, - 0xe5,0xa4,0xb1,0, - 0xe5,0xb0,0x94,0, - 0xe6,0xad,0xbb,0, - 0xe8,0xae,0xb2,0, - 0xe9,0x85,0x8d,0, - 0xe5,0xa5,0xb3,0, - 0xe9,0xbb,0x84,0, - 0xe6,0x8e,0xa8,0, - 0xe6,0x98,0xbe,0, - 0xe8,0xb0,0x88,0, - 0xe7,0xbd,0xaa,0, - 0xe7,0xa5,0x9e,0, - 0xe8,0x89,0xba,0, - 0xe5,0x91,0xa2,0, - 0xe5,0xb8,0xad,0, - 0xe5,0x90,0xab,0, - 0xe4,0xbc,0x81,0, - 0xe6,0x9c,0x9b,0, - 0xe5,0xaf,0x86,0, - 0xe6,0x89,0xb9,0, - 0xe8,0x90,0xa5,0, - 0xe9,0xa1,0xb9,0, - 0xe9,0x98,0xb2,0, - 0xe4,0xb8,0xbe,0, - 0xe7,0x90,0x83,0, - 0xe8,0x8b,0xb1,0, - 0xe6,0xb0,0xa7,0, - 0xe5,0x8a,0xbf,0, - 0xe5,0x91,0x8a,0, - 0xe6,0x9d,0x8e,0, - 0xe5,0x8f,0xb0,0, - 0xe8,0x90,0xbd,0, - 0xe6,0x9c,0xa8,0, - 0xe5,0xb8,0xae,0, - 0xe8,0xbd,0xae,0, - 0xe7,0xa0,0xb4,0, - 0xe4,0xba,0x9a,0, - 0xe5,0xb8,0x88,0, - 0xe5,0x9b,0xb4,0, - 0xe6,0xb3,0xa8,0, - 0xe8,0xbf,0x9c,0, - 0xe5,0xad,0x97,0, - 0xe6,0x9d,0x90,0, - 0xe6,0x8e,0x92,0, - 0xe4,0xbe,0x9b,0, - 0xe6,0xb2,0xb3,0, - 0xe6,0x80,0x81,0, - 0xe5,0xb0,0x81,0, - 0xe5,0x8f,0xa6,0, - 0xe6,0x96,0xbd,0, - 0xe5,0x87,0x8f,0, - 0xe6,0xa0,0x91,0, - 0xe6,0xba,0xb6,0, - 0xe6,0x80,0x8e,0, - 0xe6,0xad,0xa2,0, - 0xe6,0xa1,0x88,0, - 0xe8,0xa8,0x80,0, - 0xe5,0xa3,0xab,0, - 0xe5,0x9d,0x87,0, - 0xe6,0xad,0xa6,0, - 0xe5,0x9b,0xba,0, - 0xe5,0x8f,0xb6,0, - 0xe9,0xb1,0xbc,0, - 0xe6,0xb3,0xa2,0, - 0xe8,0xa7,0x86,0, - 0xe4,0xbb,0x85,0, - 0xe8,0xb4,0xb9,0, - 0xe7,0xb4,0xa7,0, - 0xe7,0x88,0xb1,0, - 0xe5,0xb7,0xa6,0, - 0xe7,0xab,0xa0,0, - 0xe6,0x97,0xa9,0, - 0xe6,0x9c,0x9d,0, - 0xe5,0xae,0xb3,0, - 0xe7,0xbb,0xad,0, - 0xe8,0xbd,0xbb,0, - 0xe6,0x9c,0x8d,0, - 0xe8,0xaf,0x95,0, - 0xe9,0xa3,0x9f,0, - 0xe5,0x85,0x85,0, - 0xe5,0x85,0xb5,0, - 0xe6,0xba,0x90,0, - 0xe5,0x88,0xa4,0, - 0xe6,0x8a,0xa4,0, - 0xe5,0x8f,0xb8,0, - 0xe8,0xb6,0xb3,0, - 0xe6,0x9f,0x90,0, - 0xe7,0xbb,0x83,0, - 0xe5,0xb7,0xae,0, - 0xe8,0x87,0xb4,0, - 0xe6,0x9d,0xbf,0, - 0xe7,0x94,0xb0,0, - 0xe9,0x99,0x8d,0, - 0xe9,0xbb,0x91,0, - 0xe7,0x8a,0xaf,0, - 0xe8,0xb4,0x9f,0, - 0xe5,0x87,0xbb,0, - 0xe8,0x8c,0x83,0, - 0xe7,0xbb,0xa7,0, - 0xe5,0x85,0xb4,0, - 0xe4,0xbc,0xbc,0, - 0xe4,0xbd,0x99,0, - 0xe5,0x9d,0x9a,0, - 0xe6,0x9b,0xb2,0, - 0xe8,0xbe,0x93,0, - 0xe4,0xbf,0xae,0, - 0xe6,0x95,0x85,0, - 0xe5,0x9f,0x8e,0, - 0xe5,0xa4,0xab,0, - 0xe5,0xa4,0x9f,0, - 0xe9,0x80,0x81,0, - 0xe7,0xac,0x94,0, - 0xe8,0x88,0xb9,0, - 0xe5,0x8d,0xa0,0, - 0xe5,0x8f,0xb3,0, - 0xe8,0xb4,0xa2,0, - 0xe5,0x90,0x83,0, - 0xe5,0xaf,0x8c,0, - 0xe6,0x98,0xa5,0, - 0xe8,0x81,0x8c,0, - 0xe8,0xa7,0x89,0, - 0xe6,0xb1,0x89,0, - 0xe7,0x94,0xbb,0, - 0xe5,0x8a,0x9f,0, - 0xe5,0xb7,0xb4,0, - 0xe8,0xb7,0x9f,0, - 0xe8,0x99,0xbd,0, - 0xe6,0x9d,0x82,0, - 0xe9,0xa3,0x9e,0, - 0xe6,0xa3,0x80,0, - 0xe5,0x90,0xb8,0, - 0xe5,0x8a,0xa9,0, - 0xe5,0x8d,0x87,0, - 0xe9,0x98,0xb3,0, - 0xe4,0xba,0x92,0, - 0xe5,0x88,0x9d,0, - 0xe5,0x88,0x9b,0, - 0xe6,0x8a,0x97,0, - 0xe8,0x80,0x83,0, - 0xe6,0x8a,0x95,0, - 0xe5,0x9d,0x8f,0, - 0xe7,0xad,0x96,0, - 0xe5,0x8f,0xa4,0, - 0xe5,0xbe,0x84,0, - 0xe6,0x8d,0xa2,0, - 0xe6,0x9c,0xaa,0, - 0xe8,0xb7,0x91,0, - 0xe7,0x95,0x99,0, - 0xe9,0x92,0xa2,0, - 0xe6,0x9b,0xbe,0, - 0xe7,0xab,0xaf,0, - 0xe8,0xb4,0xa3,0, - 0xe7,0xab,0x99,0, - 0xe7,0xae,0x80,0, - 0xe8,0xbf,0xb0,0, - 0xe9,0x92,0xb1,0, - 0xe5,0x89,0xaf,0, - 0xe5,0xb0,0xbd,0, - 0xe5,0xb8,0x9d,0, - 0xe5,0xb0,0x84,0, - 0xe8,0x8d,0x89,0, - 0xe5,0x86,0xb2,0, - 0xe6,0x89,0xbf,0, - 0xe7,0x8b,0xac,0, - 0xe4,0xbb,0xa4,0, - 0xe9,0x99,0x90,0, - 0xe9,0x98,0xbf,0, - 0xe5,0xae,0xa3,0, - 0xe7,0x8e,0xaf,0, - 0xe5,0x8f,0x8c,0, - 0xe8,0xaf,0xb7,0, - 0xe8,0xb6,0x85,0, - 0xe5,0xbe,0xae,0, - 0xe8,0xae,0xa9,0, - 0xe6,0x8e,0xa7,0, - 0xe5,0xb7,0x9e,0, - 0xe8,0x89,0xaf,0, - 0xe8,0xbd,0xb4,0, - 0xe6,0x89,0xbe,0, - 0xe5,0x90,0xa6,0, - 0xe7,0xba,0xaa,0, - 0xe7,0x9b,0x8a,0, - 0xe4,0xbe,0x9d,0, - 0xe4,0xbc,0x98,0, - 0xe9,0xa1,0xb6,0, - 0xe7,0xa1,0x80,0, - 0xe8,0xbd,0xbd,0, - 0xe5,0x80,0x92,0, - 0xe6,0x88,0xbf,0, - 0xe7,0xaa,0x81,0, - 0xe5,0x9d,0x90,0, - 0xe7,0xb2,0x89,0, - 0xe6,0x95,0x8c,0, - 0xe7,0x95,0xa5,0, - 0xe5,0xae,0xa2,0, - 0xe8,0xa2,0x81,0, - 0xe5,0x86,0xb7,0, - 0xe8,0x83,0x9c,0, - 0xe7,0xbb,0x9d,0, - 0xe6,0x9e,0x90,0, - 0xe5,0x9d,0x97,0, - 0xe5,0x89,0x82,0, - 0xe6,0xb5,0x8b,0, - 0xe4,0xb8,0x9d,0, - 0xe5,0x8d,0x8f,0, - 0xe8,0xaf,0x89,0, - 0xe5,0xbf,0xb5,0, - 0xe9,0x99,0x88,0, - 0xe4,0xbb,0x8d,0, - 0xe7,0xbd,0x97,0, - 0xe7,0x9b,0x90,0, - 0xe5,0x8f,0x8b,0, - 0xe6,0xb4,0x8b,0, - 0xe9,0x94,0x99,0, - 0xe8,0x8b,0xa6,0, - 0xe5,0xa4,0x9c,0, - 0xe5,0x88,0x91,0, - 0xe7,0xa7,0xbb,0, - 0xe9,0xa2,0x91,0, - 0xe9,0x80,0x90,0, - 0xe9,0x9d,0xa0,0, - 0xe6,0xb7,0xb7,0, - 0xe6,0xaf,0x8d,0, - 0xe7,0x9f,0xad,0, - 0xe7,0x9a,0xae,0, - 0xe7,0xbb,0x88,0, - 0xe8,0x81,0x9a,0, - 0xe6,0xb1,0xbd,0, - 0xe6,0x9d,0x91,0, - 0xe4,0xba,0x91,0, - 0xe5,0x93,0xaa,0, - 0xe6,0x97,0xa2,0, - 0xe8,0xb7,0x9d,0, - 0xe5,0x8d,0xab,0, - 0xe5,0x81,0x9c,0, - 0xe7,0x83,0x88,0, - 0xe5,0xa4,0xae,0, - 0xe5,0xaf,0x9f,0, - 0xe7,0x83,0xa7,0, - 0xe8,0xbf,0x85,0, - 0xe5,0xa2,0x83,0, - 0xe8,0x8b,0xa5,0, - 0xe5,0x8d,0xb0,0, - 0xe6,0xb4,0xb2,0, - 0xe5,0x88,0xbb,0, - 0xe6,0x8b,0xac,0, - 0xe6,0xbf,0x80,0, - 0xe5,0xad,0x94,0, - 0xe6,0x90,0x9e,0, - 0xe7,0x94,0x9a,0, - 0xe5,0xae,0xa4,0, - 0xe5,0xbe,0x85,0, - 0xe6,0xa0,0xb8,0, - 0xe6,0xa0,0xa1,0, - 0xe6,0x95,0xa3,0, - 0xe4,0xbe,0xb5,0, - 0xe5,0x90,0xa7,0, - 0xe7,0x94,0xb2,0, - 0xe6,0xb8,0xb8,0, - 0xe4,0xb9,0x85,0, - 0xe8,0x8f,0x9c,0, - 0xe5,0x91,0xb3,0, - 0xe6,0x97,0xa7,0, - 0xe6,0xa8,0xa1,0, - 0xe6,0xb9,0x96,0, - 0xe8,0xb4,0xa7,0, - 0xe6,0x8d,0x9f,0, - 0xe9,0xa2,0x84,0, - 0xe9,0x98,0xbb,0, - 0xe6,0xaf,0xab,0, - 0xe6,0x99,0xae,0, - 0xe7,0xa8,0xb3,0, - 0xe4,0xb9,0x99,0, - 0xe5,0xa6,0x88,0, - 0xe6,0xa4,0x8d,0, - 0xe6,0x81,0xaf,0, - 0xe6,0x89,0xa9,0, - 0xe9,0x93,0xb6,0, - 0xe8,0xaf,0xad,0, - 0xe6,0x8c,0xa5,0, - 0xe9,0x85,0x92,0, - 0xe5,0xae,0x88,0, - 0xe6,0x8b,0xbf,0, - 0xe5,0xba,0x8f,0, - 0xe7,0xba,0xb8,0, - 0xe5,0x8c,0xbb,0, - 0xe7,0xbc,0xba,0, - 0xe9,0x9b,0xa8,0, - 0xe5,0x90,0x97,0, - 0xe9,0x92,0x88,0, - 0xe5,0x88,0x98,0, - 0xe5,0x95,0x8a,0, - 0xe6,0x80,0xa5,0, - 0xe5,0x94,0xb1,0, - 0xe8,0xaf,0xaf,0, - 0xe8,0xae,0xad,0, - 0xe6,0x84,0xbf,0, - 0xe5,0xae,0xa1,0, - 0xe9,0x99,0x84,0, - 0xe8,0x8e,0xb7,0, - 0xe8,0x8c,0xb6,0, - 0xe9,0xb2,0x9c,0, - 0xe7,0xb2,0xae,0, - 0xe6,0x96,0xa4,0, - 0xe5,0xad,0xa9,0, - 0xe8,0x84,0xb1,0, - 0xe7,0xa1,0xab,0, - 0xe8,0x82,0xa5,0, - 0xe5,0x96,0x84,0, - 0xe9,0xbe,0x99,0, - 0xe6,0xbc,0x94,0, - 0xe7,0x88,0xb6,0, - 0xe6,0xb8,0x90,0, - 0xe8,0xa1,0x80,0, - 0xe6,0xac,0xa2,0, - 0xe6,0xa2,0xb0,0, - 0xe6,0x8e,0x8c,0, - 0xe6,0xad,0x8c,0, - 0xe6,0xb2,0x99,0, - 0xe5,0x88,0x9a,0, - 0xe6,0x94,0xbb,0, - 0xe8,0xb0,0x93,0, - 0xe7,0x9b,0xbe,0, - 0xe8,0xae,0xa8,0, - 0xe6,0x99,0x9a,0, - 0xe7,0xb2,0x92,0, - 0xe4,0xb9,0xb1,0, - 0xe7,0x87,0x83,0, - 0xe7,0x9f,0x9b,0, - 0xe4,0xb9,0x8e,0, - 0xe6,0x9d,0x80,0, - 0xe8,0x8d,0xaf,0, - 0xe5,0xae,0x81,0, - 0xe9,0xb2,0x81,0, - 0xe8,0xb4,0xb5,0, - 0xe9,0x92,0x9f,0, - 0xe7,0x85,0xa4,0, - 0xe8,0xaf,0xbb,0, - 0xe7,0x8f,0xad,0, - 0xe4,0xbc,0xaf,0, - 0xe9,0xa6,0x99,0, - 0xe4,0xbb,0x8b,0, - 0xe8,0xbf,0xab,0, - 0xe5,0x8f,0xa5,0, - 0xe4,0xb8,0xb0,0, - 0xe5,0x9f,0xb9,0, - 0xe6,0x8f,0xa1,0, - 0xe5,0x85,0xb0,0, - 0xe6,0x8b,0x85,0, - 0xe5,0xbc,0xa6,0, - 0xe8,0x9b,0x8b,0, - 0xe6,0xb2,0x89,0, - 0xe5,0x81,0x87,0, - 0xe7,0xa9,0xbf,0, - 0xe6,0x89,0xa7,0, - 0xe7,0xad,0x94,0, - 0xe4,0xb9,0x90,0, - 0xe8,0xb0,0x81,0, - 0xe9,0xa1,0xba,0, - 0xe7,0x83,0x9f,0, - 0xe7,0xbc,0xa9,0, - 0xe5,0xbe,0x81,0, - 0xe8,0x84,0xb8,0, - 0xe5,0x96,0x9c,0, - 0xe6,0x9d,0xbe,0, - 0xe8,0x84,0x9a,0, - 0xe5,0x9b,0xb0,0, - 0xe5,0xbc,0x82,0, - 0xe5,0x85,0x8d,0, - 0xe8,0x83,0x8c,0, - 0xe6,0x98,0x9f,0, - 0xe7,0xa6,0x8f,0, - 0xe4,0xb9,0xb0,0, - 0xe6,0x9f,0x93,0, - 0xe4,0xba,0x95,0, - 0xe6,0xa6,0x82,0, - 0xe6,0x85,0xa2,0, - 0xe6,0x80,0x95,0, - 0xe7,0xa3,0x81,0, - 0xe5,0x80,0x8d,0, - 0xe7,0xa5,0x96,0, - 0xe7,0x9a,0x87,0, - 0xe4,0xbf,0x83,0, - 0xe9,0x9d,0x99,0, - 0xe8,0xa1,0xa5,0, - 0xe8,0xaf,0x84,0, - 0xe7,0xbf,0xbb,0, - 0xe8,0x82,0x89,0, - 0xe8,0xb7,0xb5,0, - 0xe5,0xb0,0xbc,0, - 0xe8,0xa1,0xa3,0, - 0xe5,0xae,0xbd,0, - 0xe6,0x89,0xac,0, - 0xe6,0xa3,0x89,0, - 0xe5,0xb8,0x8c,0, - 0xe4,0xbc,0xa4,0, - 0xe6,0x93,0x8d,0, - 0xe5,0x9e,0x82,0, - 0xe7,0xa7,0x8b,0, - 0xe5,0xae,0x9c,0, - 0xe6,0xb0,0xa2,0, - 0xe5,0xa5,0x97,0, - 0xe7,0x9d,0xa3,0, - 0xe6,0x8c,0xaf,0, - 0xe6,0x9e,0xb6,0, - 0xe4,0xba,0xae,0, - 0xe6,0x9c,0xab,0, - 0xe5,0xae,0xaa,0, - 0xe5,0xba,0x86,0, - 0xe7,0xbc,0x96,0, - 0xe7,0x89,0x9b,0, - 0xe8,0xa7,0xa6,0, - 0xe6,0x98,0xa0,0, - 0xe9,0x9b,0xb7,0, - 0xe9,0x94,0x80,0, - 0xe8,0xaf,0x97,0, - 0xe5,0xba,0xa7,0, - 0xe5,0xb1,0x85,0, - 0xe6,0x8a,0x93,0, - 0xe8,0xa3,0x82,0, - 0xe8,0x83,0x9e,0, - 0xe5,0x91,0xbc,0, - 0xe5,0xa8,0x98,0, - 0xe6,0x99,0xaf,0, - 0xe5,0xa8,0x81,0, - 0xe7,0xbb,0xbf,0, - 0xe6,0x99,0xb6,0, - 0xe5,0x8e,0x9a,0, - 0xe7,0x9b,0x9f,0, - 0xe8,0xa1,0xa1,0, - 0xe9,0xb8,0xa1,0, - 0xe5,0xad,0x99,0, - 0xe5,0xbb,0xb6,0, - 0xe5,0x8d,0xb1,0, - 0xe8,0x83,0xb6,0, - 0xe5,0xb1,0x8b,0, - 0xe4,0xb9,0xa1,0, - 0xe4,0xb8,0xb4,0, - 0xe9,0x99,0x86,0, - 0xe9,0xa1,0xbe,0, - 0xe6,0x8e,0x89,0, - 0xe5,0x91,0x80,0, - 0xe7,0x81,0xaf,0, - 0xe5,0xb2,0x81,0, - 0xe6,0x8e,0xaa,0, - 0xe6,0x9d,0x9f,0, - 0xe8,0x80,0x90,0, - 0xe5,0x89,0xa7,0, - 0xe7,0x8e,0x89,0, - 0xe8,0xb5,0xb5,0, - 0xe8,0xb7,0xb3,0, - 0xe5,0x93,0xa5,0, - 0xe5,0xad,0xa3,0, - 0xe8,0xaf,0xbe,0, - 0xe5,0x87,0xaf,0, - 0xe8,0x83,0xa1,0, - 0xe9,0xa2,0x9d,0, - 0xe6,0xac,0xbe,0, - 0xe7,0xbb,0x8d,0, - 0xe5,0x8d,0xb7,0, - 0xe9,0xbd,0x90,0, - 0xe4,0xbc,0x9f,0, - 0xe8,0x92,0xb8,0, - 0xe6,0xae,0x96,0, - 0xe6,0xb0,0xb8,0, - 0xe5,0xae,0x97,0, - 0xe8,0x8b,0x97,0, - 0xe5,0xb7,0x9d,0, - 0xe7,0x82,0x89,0, - 0xe5,0xb2,0xa9,0, - 0xe5,0xbc,0xb1,0, - 0xe9,0x9b,0xb6,0, - 0xe6,0x9d,0xa8,0, - 0xe5,0xa5,0x8f,0, - 0xe6,0xb2,0xbf,0, - 0xe9,0x9c,0xb2,0, - 0xe6,0x9d,0x86,0, - 0xe6,0x8e,0xa2,0, - 0xe6,0xbb,0x91,0, - 0xe9,0x95,0x87,0, - 0xe9,0xa5,0xad,0, - 0xe6,0xb5,0x93,0, - 0xe8,0x88,0xaa,0, - 0xe6,0x80,0x80,0, - 0xe8,0xb5,0xb6,0, - 0xe5,0xba,0x93,0, - 0xe5,0xa4,0xba,0, - 0xe4,0xbc,0x8a,0, - 0xe7,0x81,0xb5,0, - 0xe7,0xa8,0x8e,0, - 0xe9,0x80,0x94,0, - 0xe7,0x81,0xad,0, - 0xe8,0xb5,0x9b,0, - 0xe5,0xbd,0x92,0, - 0xe5,0x8f,0xac,0, - 0xe9,0xbc,0x93,0, - 0xe6,0x92,0xad,0, - 0xe7,0x9b,0x98,0, - 0xe8,0xa3,0x81,0, - 0xe9,0x99,0xa9,0, - 0xe5,0xba,0xb7,0, - 0xe5,0x94,0xaf,0, - 0xe5,0xbd,0x95,0, - 0xe8,0x8f,0x8c,0, - 0xe7,0xba,0xaf,0, - 0xe5,0x80,0x9f,0, - 0xe7,0xb3,0x96,0, - 0xe7,0x9b,0x96,0, - 0xe6,0xa8,0xaa,0, - 0xe7,0xac,0xa6,0, - 0xe7,0xa7,0x81,0, - 0xe5,0x8a,0xaa,0, - 0xe5,0xa0,0x82,0, - 0xe5,0x9f,0x9f,0, - 0xe6,0x9e,0xaa,0, - 0xe6,0xb6,0xa6,0, - 0xe5,0xb9,0x85,0, - 0xe5,0x93,0x88,0, - 0xe7,0xab,0x9f,0, - 0xe7,0x86,0x9f,0, - 0xe8,0x99,0xab,0, - 0xe6,0xb3,0xbd,0, - 0xe8,0x84,0x91,0, - 0xe5,0xa3,0xa4,0, - 0xe7,0xa2,0xb3,0, - 0xe6,0xac,0xa7,0, - 0xe9,0x81,0x8d,0, - 0xe4,0xbe,0xa7,0, - 0xe5,0xaf,0xa8,0, - 0xe6,0x95,0xa2,0, - 0xe5,0xbd,0xbb,0, - 0xe8,0x99,0x91,0, - 0xe6,0x96,0x9c,0, - 0xe8,0x96,0x84,0, - 0xe5,0xba,0xad,0, - 0xe7,0xba,0xb3,0, - 0xe5,0xbc,0xb9,0, - 0xe9,0xa5,0xb2,0, - 0xe4,0xbc,0xb8,0, - 0xe6,0x8a,0x98,0, - 0xe9,0xba,0xa6,0, - 0xe6,0xb9,0xbf,0, - 0xe6,0x9a,0x97,0, - 0xe8,0x8d,0xb7,0, - 0xe7,0x93,0xa6,0, - 0xe5,0xa1,0x9e,0, - 0xe5,0xba,0x8a,0, - 0xe7,0xad,0x91,0, - 0xe6,0x81,0xb6,0, - 0xe6,0x88,0xb7,0, - 0xe8,0xae,0xbf,0, - 0xe5,0xa1,0x94,0, - 0xe5,0xa5,0x87,0, - 0xe9,0x80,0x8f,0, - 0xe6,0xa2,0x81,0, - 0xe5,0x88,0x80,0, - 0xe6,0x97,0x8b,0, - 0xe8,0xbf,0xb9,0, - 0xe5,0x8d,0xa1,0, - 0xe6,0xb0,0xaf,0, - 0xe9,0x81,0x87,0, - 0xe4,0xbb,0xbd,0, - 0xe6,0xaf,0x92,0, - 0xe6,0xb3,0xa5,0, - 0xe9,0x80,0x80,0, - 0xe6,0xb4,0x97,0, - 0xe6,0x91,0x86,0, - 0xe7,0x81,0xb0,0, - 0xe5,0xbd,0xa9,0, - 0xe5,0x8d,0x96,0, - 0xe8,0x80,0x97,0, - 0xe5,0xa4,0x8f,0, - 0xe6,0x8b,0xa9,0, - 0xe5,0xbf,0x99,0, - 0xe9,0x93,0x9c,0, - 0xe7,0x8c,0xae,0, - 0xe7,0xa1,0xac,0, - 0xe4,0xba,0x88,0, - 0xe7,0xb9,0x81,0, - 0xe5,0x9c,0x88,0, - 0xe9,0x9b,0xaa,0, - 0xe5,0x87,0xbd,0, - 0xe4,0xba,0xa6,0, - 0xe6,0x8a,0xbd,0, - 0xe7,0xaf,0x87,0, - 0xe9,0x98,0xb5,0, - 0xe9,0x98,0xb4,0, - 0xe4,0xb8,0x81,0, - 0xe5,0xb0,0xba,0, - 0xe8,0xbf,0xbd,0, - 0xe5,0xa0,0x86,0, - 0xe9,0x9b,0x84,0, - 0xe8,0xbf,0x8e,0, - 0xe6,0xb3,0x9b,0, - 0xe7,0x88,0xb8,0, - 0xe6,0xa5,0xbc,0, - 0xe9,0x81,0xbf,0, - 0xe8,0xb0,0x8b,0, - 0xe5,0x90,0xa8,0, - 0xe9,0x87,0x8e,0, - 0xe7,0x8c,0xaa,0, - 0xe6,0x97,0x97,0, - 0xe7,0xb4,0xaf,0, - 0xe5,0x81,0x8f,0, - 0xe5,0x85,0xb8,0, - 0xe9,0xa6,0x86,0, - 0xe7,0xb4,0xa2,0, - 0xe7,0xa7,0xa6,0, - 0xe8,0x84,0x82,0, - 0xe6,0xbd,0xae,0, - 0xe7,0x88,0xb7,0, - 0xe8,0xb1,0x86,0, - 0xe5,0xbf,0xbd,0, - 0xe6,0x89,0x98,0, - 0xe6,0x83,0x8a,0, - 0xe5,0xa1,0x91,0, - 0xe9,0x81,0x97,0, - 0xe6,0x84,0x88,0, - 0xe6,0x9c,0xb1,0, - 0xe6,0x9b,0xbf,0, - 0xe7,0xba,0xa4,0, - 0xe7,0xb2,0x97,0, - 0xe5,0x80,0xbe,0, - 0xe5,0xb0,0x9a,0, - 0xe7,0x97,0x9b,0, - 0xe6,0xa5,0x9a,0, - 0xe8,0xb0,0xa2,0, - 0xe5,0xa5,0x8b,0, - 0xe8,0xb4,0xad,0, - 0xe7,0xa3,0xa8,0, - 0xe5,0x90,0x9b,0, - 0xe6,0xb1,0xa0,0, - 0xe6,0x97,0x81,0, - 0xe7,0xa2,0x8e,0, - 0xe9,0xaa,0xa8,0, - 0xe7,0x9b,0x91,0, - 0xe6,0x8d,0x95,0, - 0xe5,0xbc,0x9f,0, - 0xe6,0x9a,0xb4,0, - 0xe5,0x89,0xb2,0, - 0xe8,0xb4,0xaf,0, - 0xe6,0xae,0x8a,0, - 0xe9,0x87,0x8a,0, - 0xe8,0xaf,0x8d,0, - 0xe4,0xba,0xa1,0, - 0xe5,0xa3,0x81,0, - 0xe9,0xa1,0xbf,0, - 0xe5,0xae,0x9d,0, - 0xe5,0x8d,0x88,0, - 0xe5,0xb0,0x98,0, - 0xe9,0x97,0xbb,0, - 0xe6,0x8f,0xad,0, - 0xe7,0x82,0xae,0, - 0xe6,0xae,0x8b,0, - 0xe5,0x86,0xac,0, - 0xe6,0xa1,0xa5,0, - 0xe5,0xa6,0x87,0, - 0xe8,0xad,0xa6,0, - 0xe7,0xbb,0xbc,0, - 0xe6,0x8b,0x9b,0, - 0xe5,0x90,0xb4,0, - 0xe4,0xbb,0x98,0, - 0xe6,0xb5,0xae,0, - 0xe9,0x81,0xad,0, - 0xe5,0xbe,0x90,0, - 0xe6,0x82,0xa8,0, - 0xe6,0x91,0x87,0, - 0xe8,0xb0,0xb7,0, - 0xe8,0xb5,0x9e,0, - 0xe7,0xae,0xb1,0, - 0xe9,0x9a,0x94,0, - 0xe8,0xae,0xa2,0, - 0xe7,0x94,0xb7,0, - 0xe5,0x90,0xb9,0, - 0xe5,0x9b,0xad,0, - 0xe7,0xba,0xb7,0, - 0xe5,0x94,0x90,0, - 0xe8,0xb4,0xa5,0, - 0xe5,0xae,0x8b,0, - 0xe7,0x8e,0xbb,0, - 0xe5,0xb7,0xa8,0, - 0xe8,0x80,0x95,0, - 0xe5,0x9d,0xa6,0, - 0xe8,0x8d,0xa3,0, - 0xe9,0x97,0xad,0, - 0xe6,0xb9,0xbe,0, - 0xe9,0x94,0xae,0, - 0xe5,0x87,0xa1,0, - 0xe9,0xa9,0xbb,0, - 0xe9,0x94,0x85,0, - 0xe6,0x95,0x91,0, - 0xe6,0x81,0xa9,0, - 0xe5,0x89,0xa5,0, - 0xe5,0x87,0x9d,0, - 0xe7,0xa2,0xb1,0, - 0xe9,0xbd,0xbf,0, - 0xe6,0x88,0xaa,0, - 0xe7,0x82,0xbc,0, - 0xe9,0xba,0xbb,0, - 0xe7,0xba,0xba,0, - 0xe7,0xa6,0x81,0, - 0xe5,0xba,0x9f,0, - 0xe7,0x9b,0x9b,0, - 0xe7,0x89,0x88,0, - 0xe7,0xbc,0x93,0, - 0xe5,0x87,0x80,0, - 0xe7,0x9d,0x9b,0, - 0xe6,0x98,0x8c,0, - 0xe5,0xa9,0x9a,0, - 0xe6,0xb6,0x89,0, - 0xe7,0xad,0x92,0, - 0xe5,0x98,0xb4,0, - 0xe6,0x8f,0x92,0, - 0xe5,0xb2,0xb8,0, - 0xe6,0x9c,0x97,0, - 0xe5,0xba,0x84,0, - 0xe8,0xa1,0x97,0, - 0xe8,0x97,0x8f,0, - 0xe5,0xa7,0x91,0, - 0xe8,0xb4,0xb8,0, - 0xe8,0x85,0x90,0, - 0xe5,0xa5,0xb4,0, - 0xe5,0x95,0xa6,0, - 0xe6,0x83,0xaf,0, - 0xe4,0xb9,0x98,0, - 0xe4,0xbc,0x99,0, - 0xe6,0x81,0xa2,0, - 0xe5,0x8c,0x80,0, - 0xe7,0xba,0xb1,0, - 0xe6,0x89,0x8e,0, - 0xe8,0xbe,0xa9,0, - 0xe8,0x80,0xb3,0, - 0xe5,0xbd,0xaa,0, - 0xe8,0x87,0xa3,0, - 0xe4,0xba,0xbf,0, - 0xe7,0x92,0x83,0, - 0xe6,0x8a,0xb5,0, - 0xe8,0x84,0x89,0, - 0xe7,0xa7,0x80,0, - 0xe8,0x90,0xa8,0, - 0xe4,0xbf,0x84,0, - 0xe7,0xbd,0x91,0, - 0xe8,0x88,0x9e,0, - 0xe5,0xba,0x97,0, - 0xe5,0x96,0xb7,0, - 0xe7,0xba,0xb5,0, - 0xe5,0xaf,0xb8,0, - 0xe6,0xb1,0x97,0, - 0xe6,0x8c,0x82,0, - 0xe6,0xb4,0xaa,0, - 0xe8,0xb4,0xba,0, - 0xe9,0x97,0xaa,0, - 0xe6,0x9f,0xac,0, - 0xe7,0x88,0x86,0, - 0xe7,0x83,0xaf,0, - 0xe6,0xb4,0xa5,0, - 0xe7,0xa8,0xbb,0, - 0xe5,0xa2,0x99,0, - 0xe8,0xbd,0xaf,0, - 0xe5,0x8b,0x87,0, - 0xe5,0x83,0x8f,0, - 0xe6,0xbb,0x9a,0, - 0xe5,0x8e,0x98,0, - 0xe8,0x92,0x99,0, - 0xe8,0x8a,0xb3,0, - 0xe8,0x82,0xaf,0, - 0xe5,0x9d,0xa1,0, - 0xe6,0x9f,0xb1,0, - 0xe8,0x8d,0xa1,0, - 0xe8,0x85,0xbf,0, - 0xe4,0xbb,0xaa,0, - 0xe6,0x97,0x85,0, - 0xe5,0xb0,0xbe,0, - 0xe8,0xbd,0xa7,0, - 0xe5,0x86,0xb0,0, - 0xe8,0xb4,0xa1,0, - 0xe7,0x99,0xbb,0, - 0xe9,0xbb,0x8e,0, - 0xe5,0x89,0x8a,0, - 0xe9,0x92,0xbb,0, - 0xe5,0x8b,0x92,0, - 0xe9,0x80,0x83,0, - 0xe9,0x9a,0x9c,0, - 0xe6,0xb0,0xa8,0, - 0xe9,0x83,0xad,0, - 0xe5,0xb3,0xb0,0, - 0xe5,0xb8,0x81,0, - 0xe6,0xb8,0xaf,0, - 0xe4,0xbc,0x8f,0, - 0xe8,0xbd,0xa8,0, - 0xe4,0xba,0xa9,0, - 0xe6,0xaf,0x95,0, - 0xe6,0x93,0xa6,0, - 0xe8,0x8e,0xab,0, - 0xe5,0x88,0xba,0, - 0xe6,0xb5,0xaa,0, - 0xe7,0xa7,0x98,0, - 0xe6,0x8f,0xb4,0, - 0xe6,0xa0,0xaa,0, - 0xe5,0x81,0xa5,0, - 0xe5,0x94,0xae,0, - 0xe8,0x82,0xa1,0, - 0xe5,0xb2,0x9b,0, - 0xe7,0x94,0x98,0, - 0xe6,0xb3,0xa1,0, - 0xe7,0x9d,0xa1,0, - 0xe7,0xab,0xa5,0, - 0xe9,0x93,0xb8,0, - 0xe6,0xb1,0xa4,0, - 0xe9,0x98,0x80,0, - 0xe4,0xbc,0x91,0, - 0xe6,0xb1,0x87,0, - 0xe8,0x88,0x8d,0, - 0xe7,0x89,0xa7,0, - 0xe7,0xbb,0x95,0, - 0xe7,0x82,0xb8,0, - 0xe5,0x93,0xb2,0, - 0xe7,0xa3,0xb7,0, - 0xe7,0xbb,0xa9,0, - 0xe6,0x9c,0x8b,0, - 0xe6,0xb7,0xa1,0, - 0xe5,0xb0,0x96,0, - 0xe5,0x90,0xaf,0, - 0xe9,0x99,0xb7,0, - 0xe6,0x9f,0xb4,0, - 0xe5,0x91,0x88,0, - 0xe5,0xbe,0x92,0, - 0xe9,0xa2,0x9c,0, - 0xe6,0xb3,0xaa,0, - 0xe7,0xa8,0x8d,0, - 0xe5,0xbf,0x98,0, - 0xe6,0xb3,0xb5,0, - 0xe8,0x93,0x9d,0, - 0xe6,0x8b,0x96,0, - 0xe6,0xb4,0x9e,0, - 0xe6,0x8e,0x88,0, - 0xe9,0x95,0x9c,0, - 0xe8,0xbe,0x9b,0, - 0xe5,0xa3,0xae,0, - 0xe9,0x94,0x8b,0, - 0xe8,0xb4,0xab,0, - 0xe8,0x99,0x9a,0, - 0xe5,0xbc,0xaf,0, - 0xe6,0x91,0xa9,0, - 0xe6,0xb3,0xb0,0, - 0xe5,0xb9,0xbc,0, - 0xe5,0xbb,0xb7,0, - 0xe5,0xb0,0x8a,0, - 0xe7,0xaa,0x97,0, - 0xe7,0xba,0xb2,0, - 0xe5,0xbc,0x84,0, - 0xe9,0x9a,0xb6,0, - 0xe7,0x96,0x91,0, - 0xe6,0xb0,0x8f,0, - 0xe5,0xae,0xab,0, - 0xe5,0xa7,0x90,0, - 0xe9,0x9c,0x87,0, - 0xe7,0x91,0x9e,0, - 0xe6,0x80,0xaa,0, - 0xe5,0xb0,0xa4,0, - 0xe7,0x90,0xb4,0, - 0xe5,0xbe,0xaa,0, - 0xe6,0x8f,0x8f,0, - 0xe8,0x86,0x9c,0, - 0xe8,0xbf,0x9d,0, - 0xe5,0xa4,0xb9,0, - 0xe8,0x85,0xb0,0, - 0xe7,0xbc,0x98,0, - 0xe7,0x8f,0xa0,0, - 0xe7,0xa9,0xb7,0, - 0xe6,0xa3,0xae,0, - 0xe6,0x9e,0x9d,0, - 0xe7,0xab,0xb9,0, - 0xe6,0xb2,0x9f,0, - 0xe5,0x82,0xac,0, - 0xe7,0xbb,0xb3,0, - 0xe5,0xbf,0x86,0, - 0xe9,0x82,0xa6,0, - 0xe5,0x89,0xa9,0, - 0xe5,0xb9,0xb8,0, - 0xe6,0xb5,0x86,0, - 0xe6,0xa0,0x8f,0, - 0xe6,0x8b,0xa5,0, - 0xe7,0x89,0x99,0, - 0xe8,0xb4,0xae,0, - 0xe7,0xa4,0xbc,0, - 0xe6,0xbb,0xa4,0, - 0xe9,0x92,0xa0,0, - 0xe7,0xba,0xb9,0, - 0xe7,0xbd,0xa2,0, - 0xe6,0x8b,0x8d,0, - 0xe5,0x92,0xb1,0, - 0xe5,0x96,0x8a,0, - 0xe8,0xa2,0x96,0, - 0xe5,0x9f,0x83,0, - 0xe5,0x8b,0xa4,0, - 0xe7,0xbd,0x9a,0, - 0xe7,0x84,0xa6,0, - 0xe6,0xbd,0x9c,0, - 0xe4,0xbc,0x8d,0, - 0xe5,0xa2,0xa8,0, - 0xe6,0xac,0xb2,0, - 0xe7,0xbc,0x9d,0, - 0xe5,0xa7,0x93,0, - 0xe5,0x88,0x8a,0, - 0xe9,0xa5,0xb1,0, - 0xe4,0xbb,0xbf,0, - 0xe5,0xa5,0x96,0, - 0xe9,0x93,0x9d,0, - 0xe9,0xac,0xbc,0, - 0xe4,0xb8,0xbd,0, - 0xe8,0xb7,0xa8,0, - 0xe9,0xbb,0x98,0, - 0xe6,0x8c,0x96,0, - 0xe9,0x93,0xbe,0, - 0xe6,0x89,0xab,0, - 0xe5,0x96,0x9d,0, - 0xe8,0xa2,0x8b,0, - 0xe7,0x82,0xad,0, - 0xe6,0xb1,0xa1,0, - 0xe5,0xb9,0x95,0, - 0xe8,0xaf,0xb8,0, - 0xe5,0xbc,0xa7,0, - 0xe5,0x8a,0xb1,0, - 0xe6,0xa2,0x85,0, - 0xe5,0xa5,0xb6,0, - 0xe6,0xb4,0x81,0, - 0xe7,0x81,0xbe,0, - 0xe8,0x88,0x9f,0, - 0xe9,0x89,0xb4,0, - 0xe8,0x8b,0xaf,0, - 0xe8,0xae,0xbc,0, - 0xe6,0x8a,0xb1,0, - 0xe6,0xaf,0x81,0, - 0xe6,0x87,0x82,0, - 0xe5,0xaf,0x92,0, - 0xe6,0x99,0xba,0, - 0xe5,0x9f,0x94,0, - 0xe5,0xaf,0x84,0, - 0xe5,0xb1,0x8a,0, - 0xe8,0xb7,0x83,0, - 0xe6,0xb8,0xa1,0, - 0xe6,0x8c,0x91,0, - 0xe4,0xb8,0xb9,0, - 0xe8,0x89,0xb0,0, - 0xe8,0xb4,0x9d,0, - 0xe7,0xa2,0xb0,0, - 0xe6,0x8b,0x94,0, - 0xe7,0x88,0xb9,0, - 0xe6,0x88,0xb4,0, - 0xe7,0xa0,0x81,0, - 0xe6,0xa2,0xa6,0, - 0xe8,0x8a,0xbd,0, - 0xe7,0x86,0x94,0, - 0xe8,0xb5,0xa4,0, - 0xe6,0xb8,0x94,0, - 0xe5,0x93,0xad,0, - 0xe6,0x95,0xac,0, - 0xe9,0xa2,0x97,0, - 0xe5,0xa5,0x94,0, - 0xe9,0x93,0x85,0, - 0xe4,0xbb,0xb2,0, - 0xe8,0x99,0x8e,0, - 0xe7,0xa8,0x80,0, - 0xe5,0xa6,0xb9,0, - 0xe4,0xb9,0x8f,0, - 0xe7,0x8f,0x8d,0, - 0xe7,0x94,0xb3,0, - 0xe6,0xa1,0x8c,0, - 0xe9,0x81,0xb5,0, - 0xe5,0x85,0x81,0, - 0xe9,0x9a,0x86,0, - 0xe8,0x9e,0xba,0, - 0xe4,0xbb,0x93,0, - 0xe9,0xad,0x8f,0, - 0xe9,0x94,0x90,0, - 0xe6,0x99,0x93,0, - 0xe6,0xb0,0xae,0, - 0xe5,0x85,0xbc,0, - 0xe9,0x9a,0x90,0, - 0xe7,0xa2,0x8d,0, - 0xe8,0xb5,0xab,0, - 0xe6,0x8b,0xa8,0, - 0xe5,0xbf,0xa0,0, - 0xe8,0x82,0x83,0, - 0xe7,0xbc,0xb8,0, - 0xe7,0x89,0xb5,0, - 0xe6,0x8a,0xa2,0, - 0xe5,0x8d,0x9a,0, - 0xe5,0xb7,0xa7,0, - 0xe5,0xa3,0xb3,0, - 0xe5,0x85,0x84,0, - 0xe6,0x9d,0x9c,0, - 0xe8,0xae,0xaf,0, - 0xe8,0xaf,0x9a,0, - 0xe7,0xa2,0xa7,0, - 0xe7,0xa5,0xa5,0, - 0xe6,0x9f,0xaf,0, - 0xe9,0xa1,0xb5,0, - 0xe5,0xb7,0xa1,0, - 0xe7,0x9f,0xa9,0, - 0xe6,0x82,0xb2,0, - 0xe7,0x81,0x8c,0, - 0xe9,0xbe,0x84,0, - 0xe4,0xbc,0xa6,0, - 0xe7,0xa5,0xa8,0, - 0xe5,0xaf,0xbb,0, - 0xe6,0xa1,0x82,0, - 0xe9,0x93,0xba,0, - 0xe5,0x9c,0xa3,0, - 0xe6,0x81,0x90,0, - 0xe6,0x81,0xb0,0, - 0xe9,0x83,0x91,0, - 0xe8,0xb6,0xa3,0, - 0xe6,0x8a,0xac,0, - 0xe8,0x8d,0x92,0, - 0xe8,0x85,0xbe,0, - 0xe8,0xb4,0xb4,0, - 0xe6,0x9f,0x94,0, - 0xe6,0xbb,0xb4,0, - 0xe7,0x8c,0x9b,0, - 0xe9,0x98,0x94,0, - 0xe8,0xbe,0x86,0, - 0xe5,0xa6,0xbb,0, - 0xe5,0xa1,0xab,0, - 0xe6,0x92,0xa4,0, - 0xe5,0x82,0xa8,0, - 0xe7,0xad,0xbe,0, - 0xe9,0x97,0xb9,0, - 0xe6,0x89,0xb0,0, - 0xe7,0xb4,0xab,0, - 0xe7,0xa0,0x82,0, - 0xe9,0x80,0x92,0, - 0xe6,0x88,0x8f,0, - 0xe5,0x90,0x8a,0, - 0xe9,0x99,0xb6,0, - 0xe4,0xbc,0x90,0, - 0xe5,0x96,0x82,0, - 0xe7,0x96,0x97,0, - 0xe7,0x93,0xb6,0, - 0xe5,0xa9,0x86,0, - 0xe6,0x8a,0x9a,0, - 0xe8,0x87,0x82,0, - 0xe6,0x91,0xb8,0, - 0xe5,0xbf,0x8d,0, - 0xe8,0x99,0xbe,0, - 0xe8,0x9c,0xa1,0, - 0xe9,0x82,0xbb,0, - 0xe8,0x83,0xb8,0, - 0xe5,0xb7,0xa9,0, - 0xe6,0x8c,0xa4,0, - 0xe5,0x81,0xb6,0, - 0xe5,0xbc,0x83,0, - 0xe6,0xa7,0xbd,0, - 0xe5,0x8a,0xb2,0, - 0xe4,0xb9,0xb3,0, - 0xe9,0x82,0x93,0, - 0xe5,0x90,0x89,0, - 0xe4,0xbb,0x81,0, - 0xe7,0x83,0x82,0, - 0xe7,0xa0,0x96,0, - 0xe7,0xa7,0x9f,0, - 0xe4,0xb9,0x8c,0, - 0xe8,0x88,0xb0,0, - 0xe4,0xbc,0xb4,0, - 0xe7,0x93,0x9c,0, - 0xe6,0xb5,0x85,0, - 0xe4,0xb8,0x99,0, - 0xe6,0x9a,0x82,0, - 0xe7,0x87,0xa5,0, - 0xe6,0xa9,0xa1,0, - 0xe6,0x9f,0xb3,0, - 0xe8,0xbf,0xb7,0, - 0xe6,0x9a,0x96,0, - 0xe7,0x89,0x8c,0, - 0xe7,0xa7,0xa7,0, - 0xe8,0x83,0x86,0, - 0xe8,0xaf,0xa6,0, - 0xe7,0xb0,0xa7,0, - 0xe8,0xb8,0x8f,0, - 0xe7,0x93,0xb7,0, - 0xe8,0xb0,0xb1,0, - 0xe5,0x91,0x86,0, - 0xe5,0xae,0xbe,0, - 0xe7,0xb3,0x8a,0, - 0xe6,0xb4,0x9b,0, - 0xe8,0xbe,0x89,0, - 0xe6,0x84,0xa4,0, - 0xe7,0xab,0x9e,0, - 0xe9,0x9a,0x99,0, - 0xe6,0x80,0x92,0, - 0xe7,0xb2,0x98,0, - 0xe4,0xb9,0x83,0, - 0xe7,0xbb,0xaa,0, - 0xe8,0x82,0xa9,0, - 0xe7,0xb1,0x8d,0, - 0xe6,0x95,0x8f,0, - 0xe6,0xb6,0x82,0, - 0xe7,0x86,0x99,0, - 0xe7,0x9a,0x86,0, - 0xe4,0xbe,0xa6,0, - 0xe6,0x82,0xac,0, - 0xe6,0x8e,0x98,0, - 0xe4,0xba,0xab,0, - 0xe7,0xba,0xa0,0, - 0xe9,0x86,0x92,0, - 0xe7,0x8b,0x82,0, - 0xe9,0x94,0x81,0, - 0xe6,0xb7,0x80,0, - 0xe6,0x81,0xa8,0, - 0xe7,0x89,0xb2,0, - 0xe9,0x9c,0xb8,0, - 0xe7,0x88,0xac,0, - 0xe8,0xb5,0x8f,0, - 0xe9,0x80,0x86,0, - 0xe7,0x8e,0xa9,0, - 0xe9,0x99,0xb5,0, - 0xe7,0xa5,0x9d,0, - 0xe7,0xa7,0x92,0, - 0xe6,0xb5,0x99,0, - 0xe8,0xb2,0x8c,0, - 0xe5,0xbd,0xb9,0, - 0xe5,0xbd,0xbc,0, - 0xe6,0x82,0x89,0, - 0xe9,0xb8,0xad,0, - 0xe8,0xb6,0x8b,0, - 0xe5,0x87,0xa4,0, - 0xe6,0x99,0xa8,0, - 0xe7,0x95,0x9c,0, - 0xe8,0xbe,0x88,0, - 0xe7,0xa7,0xa9,0, - 0xe5,0x8d,0xb5,0, - 0xe7,0xbd,0xb2,0, - 0xe6,0xa2,0xaf,0, - 0xe7,0x82,0x8e,0, - 0xe6,0xbb,0xa9,0, - 0xe6,0xa3,0x8b,0, - 0xe9,0xa9,0xb1,0, - 0xe7,0xad,0x9b,0, - 0xe5,0xb3,0xa1,0, - 0xe5,0x86,0x92,0, - 0xe5,0x95,0xa5,0, - 0xe5,0xaf,0xbf,0, - 0xe8,0xaf,0x91,0, - 0xe6,0xb5,0xb8,0, - 0xe6,0xb3,0x89,0, - 0xe5,0xb8,0xbd,0, - 0xe8,0xbf,0x9f,0, - 0xe7,0xa1,0x85,0, - 0xe7,0x96,0x86,0, - 0xe8,0xb4,0xb7,0, - 0xe6,0xbc,0x8f,0, - 0xe7,0xa8,0xbf,0, - 0xe5,0x86,0xa0,0, - 0xe5,0xab,0xa9,0, - 0xe8,0x83,0x81,0, - 0xe8,0x8a,0xaf,0, - 0xe7,0x89,0xa2,0, - 0xe5,0x8f,0x9b,0, - 0xe8,0x9a,0x80,0, - 0xe5,0xa5,0xa5,0, - 0xe9,0xb8,0xa3,0, - 0xe5,0xb2,0xad,0, - 0xe7,0xbe,0x8a,0, - 0xe5,0x87,0xad,0, - 0xe4,0xb8,0xb2,0, - 0xe5,0xa1,0x98,0, - 0xe7,0xbb,0x98,0, - 0xe9,0x85,0xb5,0, - 0xe8,0x9e,0x8d,0, - 0xe7,0x9b,0x86,0, - 0xe9,0x94,0xa1,0, - 0xe5,0xba,0x99,0, - 0xe7,0xad,0xb9,0, - 0xe5,0x86,0xbb,0, - 0xe8,0xbe,0x85,0, - 0xe6,0x91,0x84,0, - 0xe8,0xa2,0xad,0, - 0xe7,0xad,0x8b,0, - 0xe6,0x8b,0x92,0, - 0xe5,0x83,0x9a,0, - 0xe6,0x97,0xb1,0, - 0xe9,0x92,0xbe,0, - 0xe9,0xb8,0x9f,0, - 0xe6,0xbc,0x86,0, - 0xe6,0xb2,0x88,0, - 0xe7,0x9c,0x89,0, - 0xe7,0x96,0x8f,0, - 0xe6,0xb7,0xbb,0, - 0xe6,0xa3,0x92,0, - 0xe7,0xa9,0x97,0, - 0xe7,0xa1,0x9d,0, - 0xe9,0x9f,0xa9,0, - 0xe9,0x80,0xbc,0, - 0xe6,0x89,0xad,0, - 0xe4,0xbe,0xa8,0, - 0xe5,0x87,0x89,0, - 0xe6,0x8c,0xba,0, - 0xe7,0xa2,0x97,0, - 0xe6,0xa0,0xbd,0, - 0xe7,0x82,0x92,0, - 0xe6,0x9d,0xaf,0, - 0xe6,0x82,0xa3,0, - 0xe9,0xa6,0x8f,0, - 0xe5,0x8a,0x9d,0, - 0xe8,0xb1,0xaa,0, - 0xe8,0xbe,0xbd,0, - 0xe5,0x8b,0x83,0, - 0xe9,0xb8,0xbf,0, - 0xe6,0x97,0xa6,0, - 0xe5,0x90,0x8f,0, - 0xe6,0x8b,0x9c,0, - 0xe7,0x8b,0x97,0, - 0xe5,0x9f,0x8b,0, - 0xe8,0xbe,0x8a,0, - 0xe6,0x8e,0xa9,0, - 0xe9,0xa5,0xae,0, - 0xe6,0x90,0xac,0, - 0xe9,0xaa,0x82,0, - 0xe8,0xbe,0x9e,0, - 0xe5,0x8b,0xbe,0, - 0xe6,0x89,0xa3,0, - 0xe4,0xbc,0xb0,0, - 0xe8,0x92,0x8b,0, - 0xe7,0xbb,0x92,0, - 0xe9,0x9b,0xbe,0, - 0xe4,0xb8,0x88,0, - 0xe6,0x9c,0xb5,0, - 0xe5,0xa7,0x86,0, - 0xe6,0x8b,0x9f,0, - 0xe5,0xae,0x87,0, - 0xe8,0xbe,0x91,0, - 0xe9,0x99,0x95,0, - 0xe9,0x9b,0x95,0, - 0xe5,0x81,0xbf,0, - 0xe8,0x93,0x84,0, - 0xe5,0xb4,0x87,0, - 0xe5,0x89,0xaa,0, - 0xe5,0x80,0xa1,0, - 0xe5,0x8e,0x85,0, - 0xe5,0x92,0xac,0, - 0xe9,0xa9,0xb6,0, - 0xe8,0x96,0xaf,0, - 0xe5,0x88,0xb7,0, - 0xe6,0x96,0xa5,0, - 0xe7,0x95,0xaa,0, - 0xe8,0xb5,0x8b,0, - 0xe5,0xa5,0x89,0, - 0xe4,0xbd,0x9b,0, - 0xe6,0xb5,0x87,0, - 0xe6,0xbc,0xab,0, - 0xe6,0x9b,0xbc,0, - 0xe6,0x89,0x87,0, - 0xe9,0x92,0x99,0, - 0xe6,0xa1,0x83,0, - 0xe6,0x89,0xb6,0, - 0xe4,0xbb,0x94,0, - 0xe8,0xbf,0x94,0, - 0xe4,0xbf,0x97,0, - 0xe4,0xba,0x8f,0, - 0xe8,0x85,0x94,0, - 0xe9,0x9e,0x8b,0, - 0xe6,0xa3,0xb1,0, - 0xe8,0xa6,0x86,0, - 0xe6,0xa1,0x86,0, - 0xe6,0x82,0x84,0, - 0xe5,0x8f,0x94,0, - 0xe6,0x92,0x9e,0, - 0xe9,0xaa,0x97,0, - 0xe5,0x8b,0x98,0, - 0xe6,0x97,0xba,0, - 0xe6,0xb2,0xb8,0, - 0xe5,0xad,0xa4,0, - 0xe5,0x90,0x90,0, - 0xe5,0xad,0x9f,0, - 0xe6,0xb8,0xa0,0, - 0xe5,0xb1,0x88,0, - 0xe7,0x96,0xbe,0, - 0xe5,0xa6,0x99,0, - 0xe6,0x83,0x9c,0, - 0xe4,0xbb,0xb0,0, - 0xe7,0x8b,0xa0,0, - 0xe8,0x83,0x80,0, - 0xe8,0xb0,0x90,0, - 0xe6,0x8a,0x9b,0, - 0xe9,0x9c,0x89,0, - 0xe6,0xa1,0x91,0, - 0xe5,0xb2,0x97,0, - 0xe5,0x98,0x9b,0, - 0xe8,0xa1,0xb0,0, - 0xe7,0x9b,0x97,0, - 0xe6,0xb8,0x97,0, - 0xe8,0x84,0x8f,0, - 0xe8,0xb5,0x96,0, - 0xe6,0xb6,0x8c,0, - 0xe7,0x94,0x9c,0, - 0xe6,0x9b,0xb9,0, - 0xe9,0x98,0x85,0, - 0xe8,0x82,0x8c,0, - 0xe5,0x93,0xa9,0, - 0xe5,0x8e,0x89,0, - 0xe7,0x83,0x83,0, - 0xe7,0xba,0xac,0, - 0xe6,0xaf,0x85,0, - 0xe6,0x98,0xa8,0, - 0xe4,0xbc,0xaa,0, - 0xe7,0x97,0x87,0, - 0xe7,0x85,0xae,0, - 0xe5,0x8f,0xb9,0, - 0xe9,0x92,0x89,0, - 0xe6,0x90,0xad,0, - 0xe8,0x8c,0x8e,0, - 0xe7,0xac,0xbc,0, - 0xe9,0x85,0xb7,0, - 0xe5,0x81,0xb7,0, - 0xe5,0xbc,0x93,0, - 0xe9,0x94,0xa5,0, - 0xe6,0x81,0x92,0, - 0xe6,0x9d,0xb0,0, - 0xe5,0x9d,0x91,0, - 0xe9,0xbc,0xbb,0, - 0xe7,0xbf,0xbc,0, - 0xe7,0xba,0xb6,0, - 0xe5,0x8f,0x99,0, - 0xe7,0x8b,0xb1,0, - 0xe9,0x80,0xae,0, - 0xe7,0xbd,0x90,0, - 0xe7,0xbb,0x9c,0, - 0xe6,0xa3,0x9a,0, - 0xe6,0x8a,0x91,0, - 0xe8,0x86,0xa8,0, - 0xe8,0x94,0xac,0, - 0xe5,0xaf,0xba,0, - 0xe9,0xaa,0xa4,0, - 0xe7,0xa9,0x86,0, - 0xe5,0x86,0xb6,0, - 0xe6,0x9e,0xaf,0, - 0xe5,0x86,0x8c,0, - 0xe5,0xb0,0xb8,0, - 0xe5,0x87,0xb8,0, - 0xe7,0xbb,0x85,0, - 0xe5,0x9d,0xaf,0, - 0xe7,0x89,0xba,0, - 0xe7,0x84,0xb0,0, - 0xe8,0xbd,0xb0,0, - 0xe6,0xac,0xa3,0, - 0xe6,0x99,0x8b,0, - 0xe7,0x98,0xa6,0, - 0xe5,0xbe,0xa1,0, - 0xe9,0x94,0xad,0, - 0xe9,0x94,0xa6,0, - 0xe4,0xb8,0xa7,0, - 0xe6,0x97,0xac,0, - 0xe9,0x94,0xbb,0, - 0xe5,0x9e,0x84,0, - 0xe6,0x90,0x9c,0, - 0xe6,0x89,0x91,0, - 0xe9,0x82,0x80,0, - 0xe4,0xba,0xad,0, - 0xe9,0x85,0xaf,0, - 0xe8,0xbf,0x88,0, - 0xe8,0x88,0x92,0, - 0xe8,0x84,0x86,0, - 0xe9,0x85,0xb6,0, - 0xe9,0x97,0xb2,0, - 0xe5,0xbf,0xa7,0, - 0xe9,0x85,0x9a,0, - 0xe9,0xa1,0xbd,0, - 0xe7,0xbe,0xbd,0, - 0xe6,0xb6,0xa8,0, - 0xe5,0x8d,0xb8,0, - 0xe4,0xbb,0x97,0, - 0xe9,0x99,0xaa,0, - 0xe8,0xbe,0x9f,0, - 0xe6,0x83,0xa9,0, - 0xe6,0x9d,0xad,0, - 0xe5,0xa7,0x9a,0, - 0xe8,0x82,0x9a,0, - 0xe6,0x8d,0x89,0, - 0xe9,0xa3,0x98,0, - 0xe6,0xbc,0x82,0, - 0xe6,0x98,0x86,0, - 0xe6,0xac,0xba,0, - 0xe5,0x90,0xbe,0, - 0xe9,0x83,0x8e,0, - 0xe7,0x83,0xb7,0, - 0xe6,0xb1,0x81,0, - 0xe5,0x91,0xb5,0, - 0xe9,0xa5,0xb0,0, - 0xe8,0x90,0xa7,0, - 0xe9,0x9b,0x85,0, - 0xe9,0x82,0xae,0, - 0xe8,0xbf,0x81,0, - 0xe7,0x87,0x95,0, - 0xe6,0x92,0x92,0, - 0xe5,0xa7,0xbb,0, - 0xe8,0xb5,0xb4,0, - 0xe5,0xae,0xb4,0, - 0xe7,0x83,0xa6,0, - 0xe5,0x80,0xba,0, - 0xe5,0xb8,0x90,0, - 0xe6,0x96,0x91,0, - 0xe9,0x93,0x83,0, - 0xe6,0x97,0xa8,0, - 0xe9,0x86,0x87,0, - 0xe8,0x91,0xa3,0, - 0xe9,0xa5,0xbc,0, - 0xe9,0x9b,0x8f,0, - 0xe5,0xa7,0xbf,0, - 0xe6,0x8b,0x8c,0, - 0xe5,0x82,0x85,0, - 0xe8,0x85,0xb9,0, - 0xe5,0xa6,0xa5,0, - 0xe6,0x8f,0x89,0, - 0xe8,0xb4,0xa4,0, - 0xe6,0x8b,0x86,0, - 0xe6,0xad,0xaa,0, - 0xe8,0x91,0xa1,0, - 0xe8,0x83,0xba,0, - 0xe4,0xb8,0xa2,0, - 0xe6,0xb5,0xa9,0, - 0xe5,0xbe,0xbd,0, - 0xe6,0x98,0x82,0, - 0xe5,0x9e,0xab,0, - 0xe6,0x8c,0xa1,0, - 0xe8,0xa7,0x88,0, - 0xe8,0xb4,0xaa,0, - 0xe6,0x85,0xb0,0, - 0xe7,0xbc,0xb4,0, - 0xe6,0xb1,0xaa,0, - 0xe6,0x85,0x8c,0, - 0xe5,0x86,0xaf,0, - 0xe8,0xaf,0xba,0, - 0xe5,0xa7,0x9c,0, - 0xe8,0xb0,0x8a,0, - 0xe5,0x87,0xb6,0, - 0xe5,0x8a,0xa3,0, - 0xe8,0xaf,0xac,0, - 0xe8,0x80,0x80,0, - 0xe6,0x98,0x8f,0, - 0xe8,0xba,0xba,0, - 0xe7,0x9b,0x88,0, - 0xe9,0xaa,0x91,0, - 0xe4,0xb9,0x94,0, - 0xe6,0xba,0xaa,0, - 0xe4,0xb8,0x9b,0, - 0xe5,0x8d,0xa2,0, - 0xe6,0x8a,0xb9,0, - 0xe9,0x97,0xb7,0, - 0xe5,0x92,0xa8,0, - 0xe5,0x88,0xae,0, - 0xe9,0xa9,0xbe,0, - 0xe7,0xbc,0x86,0, - 0xe6,0x82,0x9f,0, - 0xe6,0x91,0x98,0, - 0xe9,0x93,0x92,0, - 0xe6,0x8e,0xb7,0, - 0xe9,0xa2,0x87,0, - 0xe5,0xb9,0xbb,0, - 0xe6,0x9f,0x84,0, - 0xe6,0x83,0xa0,0, - 0xe6,0x83,0xa8,0, - 0xe4,0xbd,0xb3,0, - 0xe4,0xbb,0x87,0, - 0xe8,0x85,0x8a,0, - 0xe7,0xaa,0x9d,0, - 0xe6,0xb6,0xa4,0, - 0xe5,0x89,0x91,0, - 0xe7,0x9e,0xa7,0, - 0xe5,0xa0,0xa1,0, - 0xe6,0xb3,0xbc,0, - 0xe8,0x91,0xb1,0, - 0xe7,0xbd,0xa9,0, - 0xe9,0x9c,0x8d,0, - 0xe6,0x8d,0x9e,0, - 0xe8,0x83,0x8e,0, - 0xe8,0x8b,0x8d,0, - 0xe6,0xbb,0xa8,0, - 0xe4,0xbf,0xa9,0, - 0xe6,0x8d,0x85,0, - 0xe6,0xb9,0x98,0, - 0xe7,0xa0,0x8d,0, - 0xe9,0x9c,0x9e,0, - 0xe9,0x82,0xb5,0, - 0xe8,0x90,0x84,0, - 0xe7,0x96,0xaf,0, - 0xe6,0xb7,0xae,0, - 0xe9,0x81,0x82,0, - 0xe7,0x86,0x8a,0, - 0xe7,0xb2,0xaa,0, - 0xe7,0x83,0x98,0, - 0xe5,0xae,0xbf,0, - 0xe6,0xa1,0xa3,0, - 0xe6,0x88,0x88,0, - 0xe9,0xa9,0xb3,0, - 0xe5,0xab,0x82,0, - 0xe8,0xa3,0x95,0, - 0xe5,0xbe,0x99,0, - 0xe7,0xae,0xad,0, - 0xe6,0x8d,0x90,0, - 0xe8,0x82,0xa0,0, - 0xe6,0x92,0x91,0, - 0xe6,0x99,0x92,0, - 0xe8,0xbe,0xa8,0, - 0xe6,0xae,0xbf,0, - 0xe8,0x8e,0xb2,0, - 0xe6,0x91,0x8a,0, - 0xe6,0x90,0x85,0, - 0xe9,0x85,0xb1,0, - 0xe5,0xb1,0x8f,0, - 0xe7,0x96,0xab,0, - 0xe5,0x93,0x80,0, - 0xe8,0x94,0xa1,0, - 0xe5,0xa0,0xb5,0, - 0xe6,0xb2,0xab,0, - 0xe7,0x9a,0xb1,0, - 0xe7,0x95,0x85,0, - 0xe5,0x8f,0xa0,0, - 0xe9,0x98,0x81,0, - 0xe8,0x8e,0xb1,0, - 0xe6,0x95,0xb2,0, - 0xe8,0xbe,0x96,0, - 0xe9,0x92,0xa9,0, - 0xe7,0x97,0x95,0, - 0xe5,0x9d,0x9d,0, - 0xe5,0xb7,0xb7,0, - 0xe9,0xa5,0xbf,0, - 0xe7,0xa5,0xb8,0, - 0xe4,0xb8,0x98,0, - 0xe7,0x8e,0x84,0, - 0xe6,0xba,0x9c,0, - 0xe6,0x9b,0xb0,0, - 0xe9,0x80,0xbb,0, - 0xe5,0xbd,0xad,0, - 0xe5,0xb0,0x9d,0, - 0xe5,0x8d,0xbf,0, - 0xe5,0xa6,0xa8,0, - 0xe8,0x89,0x87,0, - 0xe5,0x90,0x9e,0, - 0xe9,0x9f,0xa6,0, - 0xe6,0x80,0xa8,0, - 0xe7,0x9f,0xae,0, - 0xe6,0xad,0x87,0, -}; -#define zhs ((const char*)zhs_) -static const char *zhs_i[] = { - zhs+0, zhs+4, zhs+8, zhs+12, zhs+16, zhs+20, - zhs+24, zhs+28, zhs+32, zhs+36, zhs+40, zhs+44, - zhs+48, zhs+52, zhs+56, zhs+60, zhs+64, zhs+68, - zhs+72, zhs+76, zhs+80, zhs+84, zhs+88, zhs+92, - zhs+96, zhs+100, zhs+104, zhs+108, zhs+112, zhs+116, - zhs+120, zhs+124, zhs+128, zhs+132, zhs+136, zhs+140, - zhs+144, zhs+148, zhs+152, zhs+156, zhs+160, zhs+164, - zhs+168, zhs+172, zhs+176, zhs+180, zhs+184, zhs+188, - zhs+192, zhs+196, zhs+200, zhs+204, zhs+208, zhs+212, - zhs+216, zhs+220, zhs+224, zhs+228, zhs+232, zhs+236, - zhs+240, zhs+244, zhs+248, zhs+252, zhs+256, zhs+260, - zhs+264, zhs+268, zhs+272, zhs+276, zhs+280, zhs+284, - zhs+288, zhs+292, zhs+296, zhs+300, zhs+304, zhs+308, - zhs+312, zhs+316, zhs+320, zhs+324, zhs+328, zhs+332, - zhs+336, zhs+340, zhs+344, zhs+348, zhs+352, zhs+356, - zhs+360, zhs+364, zhs+368, zhs+372, zhs+376, zhs+380, - zhs+384, zhs+388, zhs+392, zhs+396, zhs+400, zhs+404, - zhs+408, zhs+412, zhs+416, zhs+420, zhs+424, zhs+428, - zhs+432, zhs+436, zhs+440, zhs+444, zhs+448, zhs+452, - zhs+456, zhs+460, zhs+464, zhs+468, zhs+472, zhs+476, - zhs+480, zhs+484, zhs+488, zhs+492, zhs+496, zhs+500, - zhs+504, zhs+508, zhs+512, zhs+516, zhs+520, zhs+524, - zhs+528, zhs+532, zhs+536, zhs+540, zhs+544, zhs+548, - zhs+552, zhs+556, zhs+560, zhs+564, zhs+568, zhs+572, - zhs+576, zhs+580, zhs+584, zhs+588, zhs+592, zhs+596, - zhs+600, zhs+604, zhs+608, zhs+612, zhs+616, zhs+620, - zhs+624, zhs+628, zhs+632, zhs+636, zhs+640, zhs+644, - zhs+648, zhs+652, zhs+656, zhs+660, zhs+664, zhs+668, - zhs+672, zhs+676, zhs+680, zhs+684, zhs+688, zhs+692, - zhs+696, zhs+700, zhs+704, zhs+708, zhs+712, zhs+716, - zhs+720, zhs+724, zhs+728, zhs+732, zhs+736, zhs+740, - zhs+744, zhs+748, zhs+752, zhs+756, zhs+760, zhs+764, - zhs+768, zhs+772, zhs+776, zhs+780, zhs+784, zhs+788, - zhs+792, zhs+796, zhs+800, zhs+804, zhs+808, zhs+812, - zhs+816, zhs+820, zhs+824, zhs+828, zhs+832, zhs+836, - zhs+840, zhs+844, zhs+848, zhs+852, zhs+856, zhs+860, - zhs+864, zhs+868, zhs+872, zhs+876, zhs+880, zhs+884, - zhs+888, zhs+892, zhs+896, zhs+900, zhs+904, zhs+908, - zhs+912, zhs+916, zhs+920, zhs+924, zhs+928, zhs+932, - zhs+936, zhs+940, zhs+944, zhs+948, zhs+952, zhs+956, - zhs+960, zhs+964, zhs+968, zhs+972, zhs+976, zhs+980, - zhs+984, zhs+988, zhs+992, zhs+996, zhs+1000, zhs+1004, - zhs+1008, zhs+1012, zhs+1016, zhs+1020, zhs+1024, zhs+1028, - zhs+1032, zhs+1036, zhs+1040, zhs+1044, zhs+1048, zhs+1052, - zhs+1056, zhs+1060, zhs+1064, zhs+1068, zhs+1072, zhs+1076, - zhs+1080, zhs+1084, zhs+1088, zhs+1092, zhs+1096, zhs+1100, - zhs+1104, zhs+1108, zhs+1112, zhs+1116, zhs+1120, zhs+1124, - zhs+1128, zhs+1132, zhs+1136, zhs+1140, zhs+1144, zhs+1148, - zhs+1152, zhs+1156, zhs+1160, zhs+1164, zhs+1168, zhs+1172, - zhs+1176, zhs+1180, zhs+1184, zhs+1188, zhs+1192, zhs+1196, - zhs+1200, zhs+1204, zhs+1208, zhs+1212, zhs+1216, zhs+1220, - zhs+1224, zhs+1228, zhs+1232, zhs+1236, zhs+1240, zhs+1244, - zhs+1248, zhs+1252, zhs+1256, zhs+1260, zhs+1264, zhs+1268, - zhs+1272, zhs+1276, zhs+1280, zhs+1284, zhs+1288, zhs+1292, - zhs+1296, zhs+1300, zhs+1304, zhs+1308, zhs+1312, zhs+1316, - zhs+1320, zhs+1324, zhs+1328, zhs+1332, zhs+1336, zhs+1340, - zhs+1344, zhs+1348, zhs+1352, zhs+1356, zhs+1360, zhs+1364, - zhs+1368, zhs+1372, zhs+1376, zhs+1380, zhs+1384, zhs+1388, - zhs+1392, zhs+1396, zhs+1400, zhs+1404, zhs+1408, zhs+1412, - zhs+1416, zhs+1420, zhs+1424, zhs+1428, zhs+1432, zhs+1436, - zhs+1440, zhs+1444, zhs+1448, zhs+1452, zhs+1456, zhs+1460, - zhs+1464, zhs+1468, zhs+1472, zhs+1476, zhs+1480, zhs+1484, - zhs+1488, zhs+1492, zhs+1496, zhs+1500, zhs+1504, zhs+1508, - zhs+1512, zhs+1516, zhs+1520, zhs+1524, zhs+1528, zhs+1532, - zhs+1536, zhs+1540, zhs+1544, zhs+1548, zhs+1552, zhs+1556, - zhs+1560, zhs+1564, zhs+1568, zhs+1572, zhs+1576, zhs+1580, - zhs+1584, zhs+1588, zhs+1592, zhs+1596, zhs+1600, zhs+1604, - zhs+1608, zhs+1612, zhs+1616, zhs+1620, zhs+1624, zhs+1628, - zhs+1632, zhs+1636, zhs+1640, zhs+1644, zhs+1648, zhs+1652, - zhs+1656, zhs+1660, zhs+1664, zhs+1668, zhs+1672, zhs+1676, - zhs+1680, zhs+1684, zhs+1688, zhs+1692, zhs+1696, zhs+1700, - zhs+1704, zhs+1708, zhs+1712, zhs+1716, zhs+1720, zhs+1724, - zhs+1728, zhs+1732, zhs+1736, zhs+1740, zhs+1744, zhs+1748, - zhs+1752, zhs+1756, zhs+1760, zhs+1764, zhs+1768, zhs+1772, - zhs+1776, zhs+1780, zhs+1784, zhs+1788, zhs+1792, zhs+1796, - zhs+1800, zhs+1804, zhs+1808, zhs+1812, zhs+1816, zhs+1820, - zhs+1824, zhs+1828, zhs+1832, zhs+1836, zhs+1840, zhs+1844, - zhs+1848, zhs+1852, zhs+1856, zhs+1860, zhs+1864, zhs+1868, - zhs+1872, zhs+1876, zhs+1880, zhs+1884, zhs+1888, zhs+1892, - zhs+1896, zhs+1900, zhs+1904, zhs+1908, zhs+1912, zhs+1916, - zhs+1920, zhs+1924, zhs+1928, zhs+1932, zhs+1936, zhs+1940, - zhs+1944, zhs+1948, zhs+1952, zhs+1956, zhs+1960, zhs+1964, - zhs+1968, zhs+1972, zhs+1976, zhs+1980, zhs+1984, zhs+1988, - zhs+1992, zhs+1996, zhs+2000, zhs+2004, zhs+2008, zhs+2012, - zhs+2016, zhs+2020, zhs+2024, zhs+2028, zhs+2032, zhs+2036, - zhs+2040, zhs+2044, zhs+2048, zhs+2052, zhs+2056, zhs+2060, - zhs+2064, zhs+2068, zhs+2072, zhs+2076, zhs+2080, zhs+2084, - zhs+2088, zhs+2092, zhs+2096, zhs+2100, zhs+2104, zhs+2108, - zhs+2112, zhs+2116, zhs+2120, zhs+2124, zhs+2128, zhs+2132, - zhs+2136, zhs+2140, zhs+2144, zhs+2148, zhs+2152, zhs+2156, - zhs+2160, zhs+2164, zhs+2168, zhs+2172, zhs+2176, zhs+2180, - zhs+2184, zhs+2188, zhs+2192, zhs+2196, zhs+2200, zhs+2204, - zhs+2208, zhs+2212, zhs+2216, zhs+2220, zhs+2224, zhs+2228, - zhs+2232, zhs+2236, zhs+2240, zhs+2244, zhs+2248, zhs+2252, - zhs+2256, zhs+2260, zhs+2264, zhs+2268, zhs+2272, zhs+2276, - zhs+2280, zhs+2284, zhs+2288, zhs+2292, zhs+2296, zhs+2300, - zhs+2304, zhs+2308, zhs+2312, zhs+2316, zhs+2320, zhs+2324, - zhs+2328, zhs+2332, zhs+2336, zhs+2340, zhs+2344, zhs+2348, - zhs+2352, zhs+2356, zhs+2360, zhs+2364, zhs+2368, zhs+2372, - zhs+2376, zhs+2380, zhs+2384, zhs+2388, zhs+2392, zhs+2396, - zhs+2400, zhs+2404, zhs+2408, zhs+2412, zhs+2416, zhs+2420, - zhs+2424, zhs+2428, zhs+2432, zhs+2436, zhs+2440, zhs+2444, - zhs+2448, zhs+2452, zhs+2456, zhs+2460, zhs+2464, zhs+2468, - zhs+2472, zhs+2476, zhs+2480, zhs+2484, zhs+2488, zhs+2492, - zhs+2496, zhs+2500, zhs+2504, zhs+2508, zhs+2512, zhs+2516, - zhs+2520, zhs+2524, zhs+2528, zhs+2532, zhs+2536, zhs+2540, - zhs+2544, zhs+2548, zhs+2552, zhs+2556, zhs+2560, zhs+2564, - zhs+2568, zhs+2572, zhs+2576, zhs+2580, zhs+2584, zhs+2588, - zhs+2592, zhs+2596, zhs+2600, zhs+2604, zhs+2608, zhs+2612, - zhs+2616, zhs+2620, zhs+2624, zhs+2628, zhs+2632, zhs+2636, - zhs+2640, zhs+2644, zhs+2648, zhs+2652, zhs+2656, zhs+2660, - zhs+2664, zhs+2668, zhs+2672, zhs+2676, zhs+2680, zhs+2684, - zhs+2688, zhs+2692, zhs+2696, zhs+2700, zhs+2704, zhs+2708, - zhs+2712, zhs+2716, zhs+2720, zhs+2724, zhs+2728, zhs+2732, - zhs+2736, zhs+2740, zhs+2744, zhs+2748, zhs+2752, zhs+2756, - zhs+2760, zhs+2764, zhs+2768, zhs+2772, zhs+2776, zhs+2780, - zhs+2784, zhs+2788, zhs+2792, zhs+2796, zhs+2800, zhs+2804, - zhs+2808, zhs+2812, zhs+2816, zhs+2820, zhs+2824, zhs+2828, - zhs+2832, zhs+2836, zhs+2840, zhs+2844, zhs+2848, zhs+2852, - zhs+2856, zhs+2860, zhs+2864, zhs+2868, zhs+2872, zhs+2876, - zhs+2880, zhs+2884, zhs+2888, zhs+2892, zhs+2896, zhs+2900, - zhs+2904, zhs+2908, zhs+2912, zhs+2916, zhs+2920, zhs+2924, - zhs+2928, zhs+2932, zhs+2936, zhs+2940, zhs+2944, zhs+2948, - zhs+2952, zhs+2956, zhs+2960, zhs+2964, zhs+2968, zhs+2972, - zhs+2976, zhs+2980, zhs+2984, zhs+2988, zhs+2992, zhs+2996, - zhs+3000, zhs+3004, zhs+3008, zhs+3012, zhs+3016, zhs+3020, - zhs+3024, zhs+3028, zhs+3032, zhs+3036, zhs+3040, zhs+3044, - zhs+3048, zhs+3052, zhs+3056, zhs+3060, zhs+3064, zhs+3068, - zhs+3072, zhs+3076, zhs+3080, zhs+3084, zhs+3088, zhs+3092, - zhs+3096, zhs+3100, zhs+3104, zhs+3108, zhs+3112, zhs+3116, - zhs+3120, zhs+3124, zhs+3128, zhs+3132, zhs+3136, zhs+3140, - zhs+3144, zhs+3148, zhs+3152, zhs+3156, zhs+3160, zhs+3164, - zhs+3168, zhs+3172, zhs+3176, zhs+3180, zhs+3184, zhs+3188, - zhs+3192, zhs+3196, zhs+3200, zhs+3204, zhs+3208, zhs+3212, - zhs+3216, zhs+3220, zhs+3224, zhs+3228, zhs+3232, zhs+3236, - zhs+3240, zhs+3244, zhs+3248, zhs+3252, zhs+3256, zhs+3260, - zhs+3264, zhs+3268, zhs+3272, zhs+3276, zhs+3280, zhs+3284, - zhs+3288, zhs+3292, zhs+3296, zhs+3300, zhs+3304, zhs+3308, - zhs+3312, zhs+3316, zhs+3320, zhs+3324, zhs+3328, zhs+3332, - zhs+3336, zhs+3340, zhs+3344, zhs+3348, zhs+3352, zhs+3356, - zhs+3360, zhs+3364, zhs+3368, zhs+3372, zhs+3376, zhs+3380, - zhs+3384, zhs+3388, zhs+3392, zhs+3396, zhs+3400, zhs+3404, - zhs+3408, zhs+3412, zhs+3416, zhs+3420, zhs+3424, zhs+3428, - zhs+3432, zhs+3436, zhs+3440, zhs+3444, zhs+3448, zhs+3452, - zhs+3456, zhs+3460, zhs+3464, zhs+3468, zhs+3472, zhs+3476, - zhs+3480, zhs+3484, zhs+3488, zhs+3492, zhs+3496, zhs+3500, - zhs+3504, zhs+3508, zhs+3512, zhs+3516, zhs+3520, zhs+3524, - zhs+3528, zhs+3532, zhs+3536, zhs+3540, zhs+3544, zhs+3548, - zhs+3552, zhs+3556, zhs+3560, zhs+3564, zhs+3568, zhs+3572, - zhs+3576, zhs+3580, zhs+3584, zhs+3588, zhs+3592, zhs+3596, - zhs+3600, zhs+3604, zhs+3608, zhs+3612, zhs+3616, zhs+3620, - zhs+3624, zhs+3628, zhs+3632, zhs+3636, zhs+3640, zhs+3644, - zhs+3648, zhs+3652, zhs+3656, zhs+3660, zhs+3664, zhs+3668, - zhs+3672, zhs+3676, zhs+3680, zhs+3684, zhs+3688, zhs+3692, - zhs+3696, zhs+3700, zhs+3704, zhs+3708, zhs+3712, zhs+3716, - zhs+3720, zhs+3724, zhs+3728, zhs+3732, zhs+3736, zhs+3740, - zhs+3744, zhs+3748, zhs+3752, zhs+3756, zhs+3760, zhs+3764, - zhs+3768, zhs+3772, zhs+3776, zhs+3780, zhs+3784, zhs+3788, - zhs+3792, zhs+3796, zhs+3800, zhs+3804, zhs+3808, zhs+3812, - zhs+3816, zhs+3820, zhs+3824, zhs+3828, zhs+3832, zhs+3836, - zhs+3840, zhs+3844, zhs+3848, zhs+3852, zhs+3856, zhs+3860, - zhs+3864, zhs+3868, zhs+3872, zhs+3876, zhs+3880, zhs+3884, - zhs+3888, zhs+3892, zhs+3896, zhs+3900, zhs+3904, zhs+3908, - zhs+3912, zhs+3916, zhs+3920, zhs+3924, zhs+3928, zhs+3932, - zhs+3936, zhs+3940, zhs+3944, zhs+3948, zhs+3952, zhs+3956, - zhs+3960, zhs+3964, zhs+3968, zhs+3972, zhs+3976, zhs+3980, - zhs+3984, zhs+3988, zhs+3992, zhs+3996, zhs+4000, zhs+4004, - zhs+4008, zhs+4012, zhs+4016, zhs+4020, zhs+4024, zhs+4028, - zhs+4032, zhs+4036, zhs+4040, zhs+4044, zhs+4048, zhs+4052, - zhs+4056, zhs+4060, zhs+4064, zhs+4068, zhs+4072, zhs+4076, - zhs+4080, zhs+4084, zhs+4088, zhs+4092, zhs+4096, zhs+4100, - zhs+4104, zhs+4108, zhs+4112, zhs+4116, zhs+4120, zhs+4124, - zhs+4128, zhs+4132, zhs+4136, zhs+4140, zhs+4144, zhs+4148, - zhs+4152, zhs+4156, zhs+4160, zhs+4164, zhs+4168, zhs+4172, - zhs+4176, zhs+4180, zhs+4184, zhs+4188, zhs+4192, zhs+4196, - zhs+4200, zhs+4204, zhs+4208, zhs+4212, zhs+4216, zhs+4220, - zhs+4224, zhs+4228, zhs+4232, zhs+4236, zhs+4240, zhs+4244, - zhs+4248, zhs+4252, zhs+4256, zhs+4260, zhs+4264, zhs+4268, - zhs+4272, zhs+4276, zhs+4280, zhs+4284, zhs+4288, zhs+4292, - zhs+4296, zhs+4300, zhs+4304, zhs+4308, zhs+4312, zhs+4316, - zhs+4320, zhs+4324, zhs+4328, zhs+4332, zhs+4336, zhs+4340, - zhs+4344, zhs+4348, zhs+4352, zhs+4356, zhs+4360, zhs+4364, - zhs+4368, zhs+4372, zhs+4376, zhs+4380, zhs+4384, zhs+4388, - zhs+4392, zhs+4396, zhs+4400, zhs+4404, zhs+4408, zhs+4412, - zhs+4416, zhs+4420, zhs+4424, zhs+4428, zhs+4432, zhs+4436, - zhs+4440, zhs+4444, zhs+4448, zhs+4452, zhs+4456, zhs+4460, - zhs+4464, zhs+4468, zhs+4472, zhs+4476, zhs+4480, zhs+4484, - zhs+4488, zhs+4492, zhs+4496, zhs+4500, zhs+4504, zhs+4508, - zhs+4512, zhs+4516, zhs+4520, zhs+4524, zhs+4528, zhs+4532, - zhs+4536, zhs+4540, zhs+4544, zhs+4548, zhs+4552, zhs+4556, - zhs+4560, zhs+4564, zhs+4568, zhs+4572, zhs+4576, zhs+4580, - zhs+4584, zhs+4588, zhs+4592, zhs+4596, zhs+4600, zhs+4604, - zhs+4608, zhs+4612, zhs+4616, zhs+4620, zhs+4624, zhs+4628, - zhs+4632, zhs+4636, zhs+4640, zhs+4644, zhs+4648, zhs+4652, - zhs+4656, zhs+4660, zhs+4664, zhs+4668, zhs+4672, zhs+4676, - zhs+4680, zhs+4684, zhs+4688, zhs+4692, zhs+4696, zhs+4700, - zhs+4704, zhs+4708, zhs+4712, zhs+4716, zhs+4720, zhs+4724, - zhs+4728, zhs+4732, zhs+4736, zhs+4740, zhs+4744, zhs+4748, - zhs+4752, zhs+4756, zhs+4760, zhs+4764, zhs+4768, zhs+4772, - zhs+4776, zhs+4780, zhs+4784, zhs+4788, zhs+4792, zhs+4796, - zhs+4800, zhs+4804, zhs+4808, zhs+4812, zhs+4816, zhs+4820, - zhs+4824, zhs+4828, zhs+4832, zhs+4836, zhs+4840, zhs+4844, - zhs+4848, zhs+4852, zhs+4856, zhs+4860, zhs+4864, zhs+4868, - zhs+4872, zhs+4876, zhs+4880, zhs+4884, zhs+4888, zhs+4892, - zhs+4896, zhs+4900, zhs+4904, zhs+4908, zhs+4912, zhs+4916, - zhs+4920, zhs+4924, zhs+4928, zhs+4932, zhs+4936, zhs+4940, - zhs+4944, zhs+4948, zhs+4952, zhs+4956, zhs+4960, zhs+4964, - zhs+4968, zhs+4972, zhs+4976, zhs+4980, zhs+4984, zhs+4988, - zhs+4992, zhs+4996, zhs+5000, zhs+5004, zhs+5008, zhs+5012, - zhs+5016, zhs+5020, zhs+5024, zhs+5028, zhs+5032, zhs+5036, - zhs+5040, zhs+5044, zhs+5048, zhs+5052, zhs+5056, zhs+5060, - zhs+5064, zhs+5068, zhs+5072, zhs+5076, zhs+5080, zhs+5084, - zhs+5088, zhs+5092, zhs+5096, zhs+5100, zhs+5104, zhs+5108, - zhs+5112, zhs+5116, zhs+5120, zhs+5124, zhs+5128, zhs+5132, - zhs+5136, zhs+5140, zhs+5144, zhs+5148, zhs+5152, zhs+5156, - zhs+5160, zhs+5164, zhs+5168, zhs+5172, zhs+5176, zhs+5180, - zhs+5184, zhs+5188, zhs+5192, zhs+5196, zhs+5200, zhs+5204, - zhs+5208, zhs+5212, zhs+5216, zhs+5220, zhs+5224, zhs+5228, - zhs+5232, zhs+5236, zhs+5240, zhs+5244, zhs+5248, zhs+5252, - zhs+5256, zhs+5260, zhs+5264, zhs+5268, zhs+5272, zhs+5276, - zhs+5280, zhs+5284, zhs+5288, zhs+5292, zhs+5296, zhs+5300, - zhs+5304, zhs+5308, zhs+5312, zhs+5316, zhs+5320, zhs+5324, - zhs+5328, zhs+5332, zhs+5336, zhs+5340, zhs+5344, zhs+5348, - zhs+5352, zhs+5356, zhs+5360, zhs+5364, zhs+5368, zhs+5372, - zhs+5376, zhs+5380, zhs+5384, zhs+5388, zhs+5392, zhs+5396, - zhs+5400, zhs+5404, zhs+5408, zhs+5412, zhs+5416, zhs+5420, - zhs+5424, zhs+5428, zhs+5432, zhs+5436, zhs+5440, zhs+5444, - zhs+5448, zhs+5452, zhs+5456, zhs+5460, zhs+5464, zhs+5468, - zhs+5472, zhs+5476, zhs+5480, zhs+5484, zhs+5488, zhs+5492, - zhs+5496, zhs+5500, zhs+5504, zhs+5508, zhs+5512, zhs+5516, - zhs+5520, zhs+5524, zhs+5528, zhs+5532, zhs+5536, zhs+5540, - zhs+5544, zhs+5548, zhs+5552, zhs+5556, zhs+5560, zhs+5564, - zhs+5568, zhs+5572, zhs+5576, zhs+5580, zhs+5584, zhs+5588, - zhs+5592, zhs+5596, zhs+5600, zhs+5604, zhs+5608, zhs+5612, - zhs+5616, zhs+5620, zhs+5624, zhs+5628, zhs+5632, zhs+5636, - zhs+5640, zhs+5644, zhs+5648, zhs+5652, zhs+5656, zhs+5660, - zhs+5664, zhs+5668, zhs+5672, zhs+5676, zhs+5680, zhs+5684, - zhs+5688, zhs+5692, zhs+5696, zhs+5700, zhs+5704, zhs+5708, - zhs+5712, zhs+5716, zhs+5720, zhs+5724, zhs+5728, zhs+5732, - zhs+5736, zhs+5740, zhs+5744, zhs+5748, zhs+5752, zhs+5756, - zhs+5760, zhs+5764, zhs+5768, zhs+5772, zhs+5776, zhs+5780, - zhs+5784, zhs+5788, zhs+5792, zhs+5796, zhs+5800, zhs+5804, - zhs+5808, zhs+5812, zhs+5816, zhs+5820, zhs+5824, zhs+5828, - zhs+5832, zhs+5836, zhs+5840, zhs+5844, zhs+5848, zhs+5852, - zhs+5856, zhs+5860, zhs+5864, zhs+5868, zhs+5872, zhs+5876, - zhs+5880, zhs+5884, zhs+5888, zhs+5892, zhs+5896, zhs+5900, - zhs+5904, zhs+5908, zhs+5912, zhs+5916, zhs+5920, zhs+5924, - zhs+5928, zhs+5932, zhs+5936, zhs+5940, zhs+5944, zhs+5948, - zhs+5952, zhs+5956, zhs+5960, zhs+5964, zhs+5968, zhs+5972, - zhs+5976, zhs+5980, zhs+5984, zhs+5988, zhs+5992, zhs+5996, - zhs+6000, zhs+6004, zhs+6008, zhs+6012, zhs+6016, zhs+6020, - zhs+6024, zhs+6028, zhs+6032, zhs+6036, zhs+6040, zhs+6044, - zhs+6048, zhs+6052, zhs+6056, zhs+6060, zhs+6064, zhs+6068, - zhs+6072, zhs+6076, zhs+6080, zhs+6084, zhs+6088, zhs+6092, - zhs+6096, zhs+6100, zhs+6104, zhs+6108, zhs+6112, zhs+6116, - zhs+6120, zhs+6124, zhs+6128, zhs+6132, zhs+6136, zhs+6140, - zhs+6144, zhs+6148, zhs+6152, zhs+6156, zhs+6160, zhs+6164, - zhs+6168, zhs+6172, zhs+6176, zhs+6180, zhs+6184, zhs+6188, - zhs+6192, zhs+6196, zhs+6200, zhs+6204, zhs+6208, zhs+6212, - zhs+6216, zhs+6220, zhs+6224, zhs+6228, zhs+6232, zhs+6236, - zhs+6240, zhs+6244, zhs+6248, zhs+6252, zhs+6256, zhs+6260, - zhs+6264, zhs+6268, zhs+6272, zhs+6276, zhs+6280, zhs+6284, - zhs+6288, zhs+6292, zhs+6296, zhs+6300, zhs+6304, zhs+6308, - zhs+6312, zhs+6316, zhs+6320, zhs+6324, zhs+6328, zhs+6332, - zhs+6336, zhs+6340, zhs+6344, zhs+6348, zhs+6352, zhs+6356, - zhs+6360, zhs+6364, zhs+6368, zhs+6372, zhs+6376, zhs+6380, - zhs+6384, zhs+6388, zhs+6392, zhs+6396, zhs+6400, zhs+6404, - zhs+6408, zhs+6412, zhs+6416, zhs+6420, zhs+6424, zhs+6428, - zhs+6432, zhs+6436, zhs+6440, zhs+6444, zhs+6448, zhs+6452, - zhs+6456, zhs+6460, zhs+6464, zhs+6468, zhs+6472, zhs+6476, - zhs+6480, zhs+6484, zhs+6488, zhs+6492, zhs+6496, zhs+6500, - zhs+6504, zhs+6508, zhs+6512, zhs+6516, zhs+6520, zhs+6524, - zhs+6528, zhs+6532, zhs+6536, zhs+6540, zhs+6544, zhs+6548, - zhs+6552, zhs+6556, zhs+6560, zhs+6564, zhs+6568, zhs+6572, - zhs+6576, zhs+6580, zhs+6584, zhs+6588, zhs+6592, zhs+6596, - zhs+6600, zhs+6604, zhs+6608, zhs+6612, zhs+6616, zhs+6620, - zhs+6624, zhs+6628, zhs+6632, zhs+6636, zhs+6640, zhs+6644, - zhs+6648, zhs+6652, zhs+6656, zhs+6660, zhs+6664, zhs+6668, - zhs+6672, zhs+6676, zhs+6680, zhs+6684, zhs+6688, zhs+6692, - zhs+6696, zhs+6700, zhs+6704, zhs+6708, zhs+6712, zhs+6716, - zhs+6720, zhs+6724, zhs+6728, zhs+6732, zhs+6736, zhs+6740, - zhs+6744, zhs+6748, zhs+6752, zhs+6756, zhs+6760, zhs+6764, - zhs+6768, zhs+6772, zhs+6776, zhs+6780, zhs+6784, zhs+6788, - zhs+6792, zhs+6796, zhs+6800, zhs+6804, zhs+6808, zhs+6812, - zhs+6816, zhs+6820, zhs+6824, zhs+6828, zhs+6832, zhs+6836, - zhs+6840, zhs+6844, zhs+6848, zhs+6852, zhs+6856, zhs+6860, - zhs+6864, zhs+6868, zhs+6872, zhs+6876, zhs+6880, zhs+6884, - zhs+6888, zhs+6892, zhs+6896, zhs+6900, zhs+6904, zhs+6908, - zhs+6912, zhs+6916, zhs+6920, zhs+6924, zhs+6928, zhs+6932, - zhs+6936, zhs+6940, zhs+6944, zhs+6948, zhs+6952, zhs+6956, - zhs+6960, zhs+6964, zhs+6968, zhs+6972, zhs+6976, zhs+6980, - zhs+6984, zhs+6988, zhs+6992, zhs+6996, zhs+7000, zhs+7004, - zhs+7008, zhs+7012, zhs+7016, zhs+7020, zhs+7024, zhs+7028, - zhs+7032, zhs+7036, zhs+7040, zhs+7044, zhs+7048, zhs+7052, - zhs+7056, zhs+7060, zhs+7064, zhs+7068, zhs+7072, zhs+7076, - zhs+7080, zhs+7084, zhs+7088, zhs+7092, zhs+7096, zhs+7100, - zhs+7104, zhs+7108, zhs+7112, zhs+7116, zhs+7120, zhs+7124, - zhs+7128, zhs+7132, zhs+7136, zhs+7140, zhs+7144, zhs+7148, - zhs+7152, zhs+7156, zhs+7160, zhs+7164, zhs+7168, zhs+7172, - zhs+7176, zhs+7180, zhs+7184, zhs+7188, zhs+7192, zhs+7196, - zhs+7200, zhs+7204, zhs+7208, zhs+7212, zhs+7216, zhs+7220, - zhs+7224, zhs+7228, zhs+7232, zhs+7236, zhs+7240, zhs+7244, - zhs+7248, zhs+7252, zhs+7256, zhs+7260, zhs+7264, zhs+7268, - zhs+7272, zhs+7276, zhs+7280, zhs+7284, zhs+7288, zhs+7292, - zhs+7296, zhs+7300, zhs+7304, zhs+7308, zhs+7312, zhs+7316, - zhs+7320, zhs+7324, zhs+7328, zhs+7332, zhs+7336, zhs+7340, - zhs+7344, zhs+7348, zhs+7352, zhs+7356, zhs+7360, zhs+7364, - zhs+7368, zhs+7372, zhs+7376, zhs+7380, zhs+7384, zhs+7388, - zhs+7392, zhs+7396, zhs+7400, zhs+7404, zhs+7408, zhs+7412, - zhs+7416, zhs+7420, zhs+7424, zhs+7428, zhs+7432, zhs+7436, - zhs+7440, zhs+7444, zhs+7448, zhs+7452, zhs+7456, zhs+7460, - zhs+7464, zhs+7468, zhs+7472, zhs+7476, zhs+7480, zhs+7484, - zhs+7488, zhs+7492, zhs+7496, zhs+7500, zhs+7504, zhs+7508, - zhs+7512, zhs+7516, zhs+7520, zhs+7524, zhs+7528, zhs+7532, - zhs+7536, zhs+7540, zhs+7544, zhs+7548, zhs+7552, zhs+7556, - zhs+7560, zhs+7564, zhs+7568, zhs+7572, zhs+7576, zhs+7580, - zhs+7584, zhs+7588, zhs+7592, zhs+7596, zhs+7600, zhs+7604, - zhs+7608, zhs+7612, zhs+7616, zhs+7620, zhs+7624, zhs+7628, - zhs+7632, zhs+7636, zhs+7640, zhs+7644, zhs+7648, zhs+7652, - zhs+7656, zhs+7660, zhs+7664, zhs+7668, zhs+7672, zhs+7676, - zhs+7680, zhs+7684, zhs+7688, zhs+7692, zhs+7696, zhs+7700, - zhs+7704, zhs+7708, zhs+7712, zhs+7716, zhs+7720, zhs+7724, - zhs+7728, zhs+7732, zhs+7736, zhs+7740, zhs+7744, zhs+7748, - zhs+7752, zhs+7756, zhs+7760, zhs+7764, zhs+7768, zhs+7772, - zhs+7776, zhs+7780, zhs+7784, zhs+7788, zhs+7792, zhs+7796, - zhs+7800, zhs+7804, zhs+7808, zhs+7812, zhs+7816, zhs+7820, - zhs+7824, zhs+7828, zhs+7832, zhs+7836, zhs+7840, zhs+7844, - zhs+7848, zhs+7852, zhs+7856, zhs+7860, zhs+7864, zhs+7868, - zhs+7872, zhs+7876, zhs+7880, zhs+7884, zhs+7888, zhs+7892, - zhs+7896, zhs+7900, zhs+7904, zhs+7908, zhs+7912, zhs+7916, - zhs+7920, zhs+7924, zhs+7928, zhs+7932, zhs+7936, zhs+7940, - zhs+7944, zhs+7948, zhs+7952, zhs+7956, zhs+7960, zhs+7964, - zhs+7968, zhs+7972, zhs+7976, zhs+7980, zhs+7984, zhs+7988, - zhs+7992, zhs+7996, zhs+8000, zhs+8004, zhs+8008, zhs+8012, - zhs+8016, zhs+8020, zhs+8024, zhs+8028, zhs+8032, zhs+8036, - zhs+8040, zhs+8044, zhs+8048, zhs+8052, zhs+8056, zhs+8060, - zhs+8064, zhs+8068, zhs+8072, zhs+8076, zhs+8080, zhs+8084, - zhs+8088, zhs+8092, zhs+8096, zhs+8100, zhs+8104, zhs+8108, - zhs+8112, zhs+8116, zhs+8120, zhs+8124, zhs+8128, zhs+8132, - zhs+8136, zhs+8140, zhs+8144, zhs+8148, zhs+8152, zhs+8156, - zhs+8160, zhs+8164, zhs+8168, zhs+8172, zhs+8176, zhs+8180, - zhs+8184, zhs+8188, zhs+8192, - }; -#undef zhs - -static const struct words zhs_words = { - 2048, - 11, - false, - (const char *)zhs_, - 0, /* Constant string */ - zhs_i -}; diff --git a/external/libwally-core/src/data/wordlists/chinese_simplified.txt b/external/libwally-core/src/data/wordlists/chinese_simplified.txt deleted file mode 100644 index b90f1ed85..000000000 --- a/external/libwally-core/src/data/wordlists/chinese_simplified.txt +++ /dev/null @@ -1,2048 +0,0 @@ -的 -一 -是 -在 -不 -了 -有 -和 -人 -这 -中 -大 -为 -上 -个 -国 -我 -以 -要 -他 -时 -来 -用 -们 -生 -到 -作 -地 -于 -出 -就 -分 -对 -成 -会 -可 -主 -发 -年 -动 -同 -工 -也 -能 -下 -过 -子 -说 -产 -种 -面 -而 -方 -后 -多 -定 -行 -学 -法 -所 -民 -得 -经 -十 -三 -之 -进 -着 -等 -部 -度 -家 -电 -力 -里 -如 -水 -化 -高 -自 -二 -理 -起 -小 -物 -现 -实 -加 -量 -都 -两 -体 -制 -机 -当 -使 -点 -从 -业 -本 -去 -把 -性 -好 -应 -开 -它 -合 -还 -因 -由 -其 -些 -然 -前 -外 -天 -政 -四 -日 -那 -社 -义 -事 -平 -形 -相 -全 -表 -间 -样 -与 -关 -各 -重 -新 -线 -内 -数 -正 -心 -反 -你 -明 -看 -原 -又 -么 -利 -比 -或 -但 -质 -气 -第 -向 -道 -命 -此 -变 -条 -只 -没 -结 -解 -问 -意 -建 -月 -公 -无 -系 -军 -很 -情 -者 -最 -立 -代 -想 -已 -通 -并 -提 -直 -题 -党 -程 -展 -五 -果 -料 -象 -员 -革 -位 -入 -常 -文 -总 -次 -品 -式 -活 -设 -及 -管 -特 -件 -长 -求 -老 -头 -基 -资 -边 -流 -路 -级 -少 -图 -山 -统 -接 -知 -较 -将 -组 -见 -计 -别 -她 -手 -角 -期 -根 -论 -运 -农 -指 -几 -九 -区 -强 -放 -决 -西 -被 -干 -做 -必 -战 -先 -回 -则 -任 -取 -据 -处 -队 -南 -给 -色 -光 -门 -即 -保 -治 -北 -造 -百 -规 -热 -领 -七 -海 -口 -东 -导 -器 -压 -志 -世 -金 -增 -争 -济 -阶 -油 -思 -术 -极 -交 -受 -联 -什 -认 -六 -共 -权 -收 -证 -改 -清 -美 -再 -采 -转 -更 -单 -风 -切 -打 -白 -教 -速 -花 -带 -安 -场 -身 -车 -例 -真 -务 -具 -万 -每 -目 -至 -达 -走 -积 -示 -议 -声 -报 -斗 -完 -类 -八 -离 -华 -名 -确 -才 -科 -张 -信 -马 -节 -话 -米 -整 -空 -元 -况 -今 -集 -温 -传 -土 -许 -步 -群 -广 -石 -记 -需 -段 -研 -界 -拉 -林 -律 -叫 -且 -究 -观 -越 -织 -装 -影 -算 -低 -持 -音 -众 -书 -布 -复 -容 -儿 -须 -际 -商 -非 -验 -连 -断 -深 -难 -近 -矿 -千 -周 -委 -素 -技 -备 -半 -办 -青 -省 -列 -习 -响 -约 -支 -般 -史 -感 -劳 -便 -团 -往 -酸 -历 -市 -克 -何 -除 -消 -构 -府 -称 -太 -准 -精 -值 -号 -率 -族 -维 -划 -选 -标 -写 -存 -候 -毛 -亲 -快 -效 -斯 -院 -查 -江 -型 -眼 -王 -按 -格 -养 -易 -置 -派 -层 -片 -始 -却 -专 -状 -育 -厂 -京 -识 -适 -属 -圆 -包 -火 -住 -调 -满 -县 -局 -照 -参 -红 -细 -引 -听 -该 -铁 -价 -严 -首 -底 -液 -官 -德 -随 -病 -苏 -失 -尔 -死 -讲 -配 -女 -黄 -推 -显 -谈 -罪 -神 -艺 -呢 -席 -含 -企 -望 -密 -批 -营 -项 -防 -举 -球 -英 -氧 -势 -告 -李 -台 -落 -木 -帮 -轮 -破 -亚 -师 -围 -注 -远 -字 -材 -排 -供 -河 -态 -封 -另 -施 -减 -树 -溶 -怎 -止 -案 -言 -士 -均 -武 -固 -叶 -鱼 -波 -视 -仅 -费 -紧 -爱 -左 -章 -早 -朝 -害 -续 -轻 -服 -试 -食 -充 -兵 -源 -判 -护 -司 -足 -某 -练 -差 -致 -板 -田 -降 -黑 -犯 -负 -击 -范 -继 -兴 -似 -余 -坚 -曲 -输 -修 -故 -城 -夫 -够 -送 -笔 -船 -占 -右 -财 -吃 -富 -春 -职 -觉 -汉 -画 -功 -巴 -跟 -虽 -杂 -飞 -检 -吸 -助 -升 -阳 -互 -初 -创 -抗 -考 -投 -坏 -策 -古 -径 -换 -未 -跑 -留 -钢 -曾 -端 -责 -站 -简 -述 -钱 -副 -尽 -帝 -射 -草 -冲 -承 -独 -令 -限 -阿 -宣 -环 -双 -请 -超 -微 -让 -控 -州 -良 -轴 -找 -否 -纪 -益 -依 -优 -顶 -础 -载 -倒 -房 -突 -坐 -粉 -敌 -略 -客 -袁 -冷 -胜 -绝 -析 -块 -剂 -测 -丝 -协 -诉 -念 -陈 -仍 -罗 -盐 -友 -洋 -错 -苦 -夜 -刑 -移 -频 -逐 -靠 -混 -母 -短 -皮 -终 -聚 -汽 -村 -云 -哪 -既 -距 -卫 -停 -烈 -央 -察 -烧 -迅 -境 -若 -印 -洲 -刻 -括 -激 -孔 -搞 -甚 -室 -待 -核 -校 -散 -侵 -吧 -甲 -游 -久 -菜 -味 -旧 -模 -湖 -货 -损 -预 -阻 -毫 -普 -稳 -乙 -妈 -植 -息 -扩 -银 -语 -挥 -酒 -守 -拿 -序 -纸 -医 -缺 -雨 -吗 -针 -刘 -啊 -急 -唱 -误 -训 -愿 -审 -附 -获 -茶 -鲜 -粮 -斤 -孩 -脱 -硫 -肥 -善 -龙 -演 -父 -渐 -血 -欢 -械 -掌 -歌 -沙 -刚 -攻 -谓 -盾 -讨 -晚 -粒 -乱 -燃 -矛 -乎 -杀 -药 -宁 -鲁 -贵 -钟 -煤 -读 -班 -伯 -香 -介 -迫 -句 -丰 -培 -握 -兰 -担 -弦 -蛋 -沉 -假 -穿 -执 -答 -乐 -谁 -顺 -烟 -缩 -征 -脸 -喜 -松 -脚 -困 -异 -免 -背 -星 -福 -买 -染 -井 -概 -慢 -怕 -磁 -倍 -祖 -皇 -促 -静 -补 -评 -翻 -肉 -践 -尼 -衣 -宽 -扬 -棉 -希 -伤 -操 -垂 -秋 -宜 -氢 -套 -督 -振 -架 -亮 -末 -宪 -庆 -编 -牛 -触 -映 -雷 -销 -诗 -座 -居 -抓 -裂 -胞 -呼 -娘 -景 -威 -绿 -晶 -厚 -盟 -衡 -鸡 -孙 -延 -危 -胶 -屋 -乡 -临 -陆 -顾 -掉 -呀 -灯 -岁 -措 -束 -耐 -剧 -玉 -赵 -跳 -哥 -季 -课 -凯 -胡 -额 -款 -绍 -卷 -齐 -伟 -蒸 -殖 -永 -宗 -苗 -川 -炉 -岩 -弱 -零 -杨 -奏 -沿 -露 -杆 -探 -滑 -镇 -饭 -浓 -航 -怀 -赶 -库 -夺 -伊 -灵 -税 -途 -灭 -赛 -归 -召 -鼓 -播 -盘 -裁 -险 -康 -唯 -录 -菌 -纯 -借 -糖 -盖 -横 -符 -私 -努 -堂 -域 -枪 -润 -幅 -哈 -竟 -熟 -虫 -泽 -脑 -壤 -碳 -欧 -遍 -侧 -寨 -敢 -彻 -虑 -斜 -薄 -庭 -纳 -弹 -饲 -伸 -折 -麦 -湿 -暗 -荷 -瓦 -塞 -床 -筑 -恶 -户 -访 -塔 -奇 -透 -梁 -刀 -旋 -迹 -卡 -氯 -遇 -份 -毒 -泥 -退 -洗 -摆 -灰 -彩 -卖 -耗 -夏 -择 -忙 -铜 -献 -硬 -予 -繁 -圈 -雪 -函 -亦 -抽 -篇 -阵 -阴 -丁 -尺 -追 -堆 -雄 -迎 -泛 -爸 -楼 -避 -谋 -吨 -野 -猪 -旗 -累 -偏 -典 -馆 -索 -秦 -脂 -潮 -爷 -豆 -忽 -托 -惊 -塑 -遗 -愈 -朱 -替 -纤 -粗 -倾 -尚 -痛 -楚 -谢 -奋 -购 -磨 -君 -池 -旁 -碎 -骨 -监 -捕 -弟 -暴 -割 -贯 -殊 -释 -词 -亡 -壁 -顿 -宝 -午 -尘 -闻 -揭 -炮 -残 -冬 -桥 -妇 -警 -综 -招 -吴 -付 -浮 -遭 -徐 -您 -摇 -谷 -赞 -箱 -隔 -订 -男 -吹 -园 -纷 -唐 -败 -宋 -玻 -巨 -耕 -坦 -荣 -闭 -湾 -键 -凡 -驻 -锅 -救 -恩 -剥 -凝 -碱 -齿 -截 -炼 -麻 -纺 -禁 -废 -盛 -版 -缓 -净 -睛 -昌 -婚 -涉 -筒 -嘴 -插 -岸 -朗 -庄 -街 -藏 -姑 -贸 -腐 -奴 -啦 -惯 -乘 -伙 -恢 -匀 -纱 -扎 -辩 -耳 -彪 -臣 -亿 -璃 -抵 -脉 -秀 -萨 -俄 -网 -舞 -店 -喷 -纵 -寸 -汗 -挂 -洪 -贺 -闪 -柬 -爆 -烯 -津 -稻 -墙 -软 -勇 -像 -滚 -厘 -蒙 -芳 -肯 -坡 -柱 -荡 -腿 -仪 -旅 -尾 -轧 -冰 -贡 -登 -黎 -削 -钻 -勒 -逃 -障 -氨 -郭 -峰 -币 -港 -伏 -轨 -亩 -毕 -擦 -莫 -刺 -浪 -秘 -援 -株 -健 -售 -股 -岛 -甘 -泡 -睡 -童 -铸 -汤 -阀 -休 -汇 -舍 -牧 -绕 -炸 -哲 -磷 -绩 -朋 -淡 -尖 -启 -陷 -柴 -呈 -徒 -颜 -泪 -稍 -忘 -泵 -蓝 -拖 -洞 -授 -镜 -辛 -壮 -锋 -贫 -虚 -弯 -摩 -泰 -幼 -廷 -尊 -窗 -纲 -弄 -隶 -疑 -氏 -宫 -姐 -震 -瑞 -怪 -尤 -琴 -循 -描 -膜 -违 -夹 -腰 -缘 -珠 -穷 -森 -枝 -竹 -沟 -催 -绳 -忆 -邦 -剩 -幸 -浆 -栏 -拥 -牙 -贮 -礼 -滤 -钠 -纹 -罢 -拍 -咱 -喊 -袖 -埃 -勤 -罚 -焦 -潜 -伍 -墨 -欲 -缝 -姓 -刊 -饱 -仿 -奖 -铝 -鬼 -丽 -跨 -默 -挖 -链 -扫 -喝 -袋 -炭 -污 -幕 -诸 -弧 -励 -梅 -奶 -洁 -灾 -舟 -鉴 -苯 -讼 -抱 -毁 -懂 -寒 -智 -埔 -寄 -届 -跃 -渡 -挑 -丹 -艰 -贝 -碰 -拔 -爹 -戴 -码 -梦 -芽 -熔 -赤 -渔 -哭 -敬 -颗 -奔 -铅 -仲 -虎 -稀 -妹 -乏 -珍 -申 -桌 -遵 -允 -隆 -螺 -仓 -魏 -锐 -晓 -氮 -兼 -隐 -碍 -赫 -拨 -忠 -肃 -缸 -牵 -抢 -博 -巧 -壳 -兄 -杜 -讯 -诚 -碧 -祥 -柯 -页 -巡 -矩 -悲 -灌 -龄 -伦 -票 -寻 -桂 -铺 -圣 -恐 -恰 -郑 -趣 -抬 -荒 -腾 -贴 -柔 -滴 -猛 -阔 -辆 -妻 -填 -撤 -储 -签 -闹 -扰 -紫 -砂 -递 -戏 -吊 -陶 -伐 -喂 -疗 -瓶 -婆 -抚 -臂 -摸 -忍 -虾 -蜡 -邻 -胸 -巩 -挤 -偶 -弃 -槽 -劲 -乳 -邓 -吉 -仁 -烂 -砖 -租 -乌 -舰 -伴 -瓜 -浅 -丙 -暂 -燥 -橡 -柳 -迷 -暖 -牌 -秧 -胆 -详 -簧 -踏 -瓷 -谱 -呆 -宾 -糊 -洛 -辉 -愤 -竞 -隙 -怒 -粘 -乃 -绪 -肩 -籍 -敏 -涂 -熙 -皆 -侦 -悬 -掘 -享 -纠 -醒 -狂 -锁 -淀 -恨 -牲 -霸 -爬 -赏 -逆 -玩 -陵 -祝 -秒 -浙 -貌 -役 -彼 -悉 -鸭 -趋 -凤 -晨 -畜 -辈 -秩 -卵 -署 -梯 -炎 -滩 -棋 -驱 -筛 -峡 -冒 -啥 -寿 -译 -浸 -泉 -帽 -迟 -硅 -疆 -贷 -漏 -稿 -冠 -嫩 -胁 -芯 -牢 -叛 -蚀 -奥 -鸣 -岭 -羊 -凭 -串 -塘 -绘 -酵 -融 -盆 -锡 -庙 -筹 -冻 -辅 -摄 -袭 -筋 -拒 -僚 -旱 -钾 -鸟 -漆 -沈 -眉 -疏 -添 -棒 -穗 -硝 -韩 -逼 -扭 -侨 -凉 -挺 -碗 -栽 -炒 -杯 -患 -馏 -劝 -豪 -辽 -勃 -鸿 -旦 -吏 -拜 -狗 -埋 -辊 -掩 -饮 -搬 -骂 -辞 -勾 -扣 -估 -蒋 -绒 -雾 -丈 -朵 -姆 -拟 -宇 -辑 -陕 -雕 -偿 -蓄 -崇 -剪 -倡 -厅 -咬 -驶 -薯 -刷 -斥 -番 -赋 -奉 -佛 -浇 -漫 -曼 -扇 -钙 -桃 -扶 -仔 -返 -俗 -亏 -腔 -鞋 -棱 -覆 -框 -悄 -叔 -撞 -骗 -勘 -旺 -沸 -孤 -吐 -孟 -渠 -屈 -疾 -妙 -惜 -仰 -狠 -胀 -谐 -抛 -霉 -桑 -岗 -嘛 -衰 -盗 -渗 -脏 -赖 -涌 -甜 -曹 -阅 -肌 -哩 -厉 -烃 -纬 -毅 -昨 -伪 -症 -煮 -叹 -钉 -搭 -茎 -笼 -酷 -偷 -弓 -锥 -恒 -杰 -坑 -鼻 -翼 -纶 -叙 -狱 -逮 -罐 -络 -棚 -抑 -膨 -蔬 -寺 -骤 -穆 -冶 -枯 -册 -尸 -凸 -绅 -坯 -牺 -焰 -轰 -欣 -晋 -瘦 -御 -锭 -锦 -丧 -旬 -锻 -垄 -搜 -扑 -邀 -亭 -酯 -迈 -舒 -脆 -酶 -闲 -忧 -酚 -顽 -羽 -涨 -卸 -仗 -陪 -辟 -惩 -杭 -姚 -肚 -捉 -飘 -漂 -昆 -欺 -吾 -郎 -烷 -汁 -呵 -饰 -萧 -雅 -邮 -迁 -燕 -撒 -姻 -赴 -宴 -烦 -债 -帐 -斑 -铃 -旨 -醇 -董 -饼 -雏 -姿 -拌 -傅 -腹 -妥 -揉 -贤 -拆 -歪 -葡 -胺 -丢 -浩 -徽 -昂 -垫 -挡 -览 -贪 -慰 -缴 -汪 -慌 -冯 -诺 -姜 -谊 -凶 -劣 -诬 -耀 -昏 -躺 -盈 -骑 -乔 -溪 -丛 -卢 -抹 -闷 -咨 -刮 -驾 -缆 -悟 -摘 -铒 -掷 -颇 -幻 -柄 -惠 -惨 -佳 -仇 -腊 -窝 -涤 -剑 -瞧 -堡 -泼 -葱 -罩 -霍 -捞 -胎 -苍 -滨 -俩 -捅 -湘 -砍 -霞 -邵 -萄 -疯 -淮 -遂 -熊 -粪 -烘 -宿 -档 -戈 -驳 -嫂 -裕 -徙 -箭 -捐 -肠 -撑 -晒 -辨 -殿 -莲 -摊 -搅 -酱 -屏 -疫 -哀 -蔡 -堵 -沫 -皱 -畅 -叠 -阁 -莱 -敲 -辖 -钩 -痕 -坝 -巷 -饿 -祸 -丘 -玄 -溜 -曰 -逻 -彭 -尝 -卿 -妨 -艇 -吞 -韦 -怨 -矮 -歇 diff --git a/external/libwally-core/src/data/wordlists/chinese_traditional.c b/external/libwally-core/src/data/wordlists/chinese_traditional.c deleted file mode 100644 index 1e4955056..000000000 --- a/external/libwally-core/src/data/wordlists/chinese_traditional.c +++ /dev/null @@ -1,2408 +0,0 @@ -/* Generated file - do not edit! */ -#include - -static const unsigned char zht_[] = { - 0xe7,0x9a,0x84,0, - 0xe4,0xb8,0x80,0, - 0xe6,0x98,0xaf,0, - 0xe5,0x9c,0xa8,0, - 0xe4,0xb8,0x8d,0, - 0xe4,0xba,0x86,0, - 0xe6,0x9c,0x89,0, - 0xe5,0x92,0x8c,0, - 0xe4,0xba,0xba,0, - 0xe9,0x80,0x99,0, - 0xe4,0xb8,0xad,0, - 0xe5,0xa4,0xa7,0, - 0xe7,0x82,0xba,0, - 0xe4,0xb8,0x8a,0, - 0xe5,0x80,0x8b,0, - 0xe5,0x9c,0x8b,0, - 0xe6,0x88,0x91,0, - 0xe4,0xbb,0xa5,0, - 0xe8,0xa6,0x81,0, - 0xe4,0xbb,0x96,0, - 0xe6,0x99,0x82,0, - 0xe4,0xbe,0x86,0, - 0xe7,0x94,0xa8,0, - 0xe5,0x80,0x91,0, - 0xe7,0x94,0x9f,0, - 0xe5,0x88,0xb0,0, - 0xe4,0xbd,0x9c,0, - 0xe5,0x9c,0xb0,0, - 0xe6,0x96,0xbc,0, - 0xe5,0x87,0xba,0, - 0xe5,0xb0,0xb1,0, - 0xe5,0x88,0x86,0, - 0xe5,0xb0,0x8d,0, - 0xe6,0x88,0x90,0, - 0xe6,0x9c,0x83,0, - 0xe5,0x8f,0xaf,0, - 0xe4,0xb8,0xbb,0, - 0xe7,0x99,0xbc,0, - 0xe5,0xb9,0xb4,0, - 0xe5,0x8b,0x95,0, - 0xe5,0x90,0x8c,0, - 0xe5,0xb7,0xa5,0, - 0xe4,0xb9,0x9f,0, - 0xe8,0x83,0xbd,0, - 0xe4,0xb8,0x8b,0, - 0xe9,0x81,0x8e,0, - 0xe5,0xad,0x90,0, - 0xe8,0xaa,0xaa,0, - 0xe7,0x94,0xa2,0, - 0xe7,0xa8,0xae,0, - 0xe9,0x9d,0xa2,0, - 0xe8,0x80,0x8c,0, - 0xe6,0x96,0xb9,0, - 0xe5,0xbe,0x8c,0, - 0xe5,0xa4,0x9a,0, - 0xe5,0xae,0x9a,0, - 0xe8,0xa1,0x8c,0, - 0xe5,0xad,0xb8,0, - 0xe6,0xb3,0x95,0, - 0xe6,0x89,0x80,0, - 0xe6,0xb0,0x91,0, - 0xe5,0xbe,0x97,0, - 0xe7,0xb6,0x93,0, - 0xe5,0x8d,0x81,0, - 0xe4,0xb8,0x89,0, - 0xe4,0xb9,0x8b,0, - 0xe9,0x80,0xb2,0, - 0xe8,0x91,0x97,0, - 0xe7,0xad,0x89,0, - 0xe9,0x83,0xa8,0, - 0xe5,0xba,0xa6,0, - 0xe5,0xae,0xb6,0, - 0xe9,0x9b,0xbb,0, - 0xe5,0x8a,0x9b,0, - 0xe8,0xa3,0xa1,0, - 0xe5,0xa6,0x82,0, - 0xe6,0xb0,0xb4,0, - 0xe5,0x8c,0x96,0, - 0xe9,0xab,0x98,0, - 0xe8,0x87,0xaa,0, - 0xe4,0xba,0x8c,0, - 0xe7,0x90,0x86,0, - 0xe8,0xb5,0xb7,0, - 0xe5,0xb0,0x8f,0, - 0xe7,0x89,0xa9,0, - 0xe7,0x8f,0xbe,0, - 0xe5,0xaf,0xa6,0, - 0xe5,0x8a,0xa0,0, - 0xe9,0x87,0x8f,0, - 0xe9,0x83,0xbd,0, - 0xe5,0x85,0xa9,0, - 0xe9,0xab,0x94,0, - 0xe5,0x88,0xb6,0, - 0xe6,0xa9,0x9f,0, - 0xe7,0x95,0xb6,0, - 0xe4,0xbd,0xbf,0, - 0xe9,0xbb,0x9e,0, - 0xe5,0xbe,0x9e,0, - 0xe6,0xa5,0xad,0, - 0xe6,0x9c,0xac,0, - 0xe5,0x8e,0xbb,0, - 0xe6,0x8a,0x8a,0, - 0xe6,0x80,0xa7,0, - 0xe5,0xa5,0xbd,0, - 0xe6,0x87,0x89,0, - 0xe9,0x96,0x8b,0, - 0xe5,0xae,0x83,0, - 0xe5,0x90,0x88,0, - 0xe9,0x82,0x84,0, - 0xe5,0x9b,0xa0,0, - 0xe7,0x94,0xb1,0, - 0xe5,0x85,0xb6,0, - 0xe4,0xba,0x9b,0, - 0xe7,0x84,0xb6,0, - 0xe5,0x89,0x8d,0, - 0xe5,0xa4,0x96,0, - 0xe5,0xa4,0xa9,0, - 0xe6,0x94,0xbf,0, - 0xe5,0x9b,0x9b,0, - 0xe6,0x97,0xa5,0, - 0xe9,0x82,0xa3,0, - 0xe7,0xa4,0xbe,0, - 0xe7,0xbe,0xa9,0, - 0xe4,0xba,0x8b,0, - 0xe5,0xb9,0xb3,0, - 0xe5,0xbd,0xa2,0, - 0xe7,0x9b,0xb8,0, - 0xe5,0x85,0xa8,0, - 0xe8,0xa1,0xa8,0, - 0xe9,0x96,0x93,0, - 0xe6,0xa8,0xa3,0, - 0xe8,0x88,0x87,0, - 0xe9,0x97,0x9c,0, - 0xe5,0x90,0x84,0, - 0xe9,0x87,0x8d,0, - 0xe6,0x96,0xb0,0, - 0xe7,0xb7,0x9a,0, - 0xe5,0x85,0xa7,0, - 0xe6,0x95,0xb8,0, - 0xe6,0xad,0xa3,0, - 0xe5,0xbf,0x83,0, - 0xe5,0x8f,0x8d,0, - 0xe4,0xbd,0xa0,0, - 0xe6,0x98,0x8e,0, - 0xe7,0x9c,0x8b,0, - 0xe5,0x8e,0x9f,0, - 0xe5,0x8f,0x88,0, - 0xe9,0xba,0xbc,0, - 0xe5,0x88,0xa9,0, - 0xe6,0xaf,0x94,0, - 0xe6,0x88,0x96,0, - 0xe4,0xbd,0x86,0, - 0xe8,0xb3,0xaa,0, - 0xe6,0xb0,0xa3,0, - 0xe7,0xac,0xac,0, - 0xe5,0x90,0x91,0, - 0xe9,0x81,0x93,0, - 0xe5,0x91,0xbd,0, - 0xe6,0xad,0xa4,0, - 0xe8,0xae,0x8a,0, - 0xe6,0xa2,0x9d,0, - 0xe5,0x8f,0xaa,0, - 0xe6,0xb2,0x92,0, - 0xe7,0xb5,0x90,0, - 0xe8,0xa7,0xa3,0, - 0xe5,0x95,0x8f,0, - 0xe6,0x84,0x8f,0, - 0xe5,0xbb,0xba,0, - 0xe6,0x9c,0x88,0, - 0xe5,0x85,0xac,0, - 0xe7,0x84,0xa1,0, - 0xe7,0xb3,0xbb,0, - 0xe8,0xbb,0x8d,0, - 0xe5,0xbe,0x88,0, - 0xe6,0x83,0x85,0, - 0xe8,0x80,0x85,0, - 0xe6,0x9c,0x80,0, - 0xe7,0xab,0x8b,0, - 0xe4,0xbb,0xa3,0, - 0xe6,0x83,0xb3,0, - 0xe5,0xb7,0xb2,0, - 0xe9,0x80,0x9a,0, - 0xe4,0xb8,0xa6,0, - 0xe6,0x8f,0x90,0, - 0xe7,0x9b,0xb4,0, - 0xe9,0xa1,0x8c,0, - 0xe9,0xbb,0xa8,0, - 0xe7,0xa8,0x8b,0, - 0xe5,0xb1,0x95,0, - 0xe4,0xba,0x94,0, - 0xe6,0x9e,0x9c,0, - 0xe6,0x96,0x99,0, - 0xe8,0xb1,0xa1,0, - 0xe5,0x93,0xa1,0, - 0xe9,0x9d,0xa9,0, - 0xe4,0xbd,0x8d,0, - 0xe5,0x85,0xa5,0, - 0xe5,0xb8,0xb8,0, - 0xe6,0x96,0x87,0, - 0xe7,0xb8,0xbd,0, - 0xe6,0xac,0xa1,0, - 0xe5,0x93,0x81,0, - 0xe5,0xbc,0x8f,0, - 0xe6,0xb4,0xbb,0, - 0xe8,0xa8,0xad,0, - 0xe5,0x8f,0x8a,0, - 0xe7,0xae,0xa1,0, - 0xe7,0x89,0xb9,0, - 0xe4,0xbb,0xb6,0, - 0xe9,0x95,0xb7,0, - 0xe6,0xb1,0x82,0, - 0xe8,0x80,0x81,0, - 0xe9,0xa0,0xad,0, - 0xe5,0x9f,0xba,0, - 0xe8,0xb3,0x87,0, - 0xe9,0x82,0x8a,0, - 0xe6,0xb5,0x81,0, - 0xe8,0xb7,0xaf,0, - 0xe7,0xb4,0x9a,0, - 0xe5,0xb0,0x91,0, - 0xe5,0x9c,0x96,0, - 0xe5,0xb1,0xb1,0, - 0xe7,0xb5,0xb1,0, - 0xe6,0x8e,0xa5,0, - 0xe7,0x9f,0xa5,0, - 0xe8,0xbc,0x83,0, - 0xe5,0xb0,0x87,0, - 0xe7,0xb5,0x84,0, - 0xe8,0xa6,0x8b,0, - 0xe8,0xa8,0x88,0, - 0xe5,0x88,0xa5,0, - 0xe5,0xa5,0xb9,0, - 0xe6,0x89,0x8b,0, - 0xe8,0xa7,0x92,0, - 0xe6,0x9c,0x9f,0, - 0xe6,0xa0,0xb9,0, - 0xe8,0xab,0x96,0, - 0xe9,0x81,0x8b,0, - 0xe8,0xbe,0xb2,0, - 0xe6,0x8c,0x87,0, - 0xe5,0xb9,0xbe,0, - 0xe4,0xb9,0x9d,0, - 0xe5,0x8d,0x80,0, - 0xe5,0xbc,0xb7,0, - 0xe6,0x94,0xbe,0, - 0xe6,0xb1,0xba,0, - 0xe8,0xa5,0xbf,0, - 0xe8,0xa2,0xab,0, - 0xe5,0xb9,0xb9,0, - 0xe5,0x81,0x9a,0, - 0xe5,0xbf,0x85,0, - 0xe6,0x88,0xb0,0, - 0xe5,0x85,0x88,0, - 0xe5,0x9b,0x9e,0, - 0xe5,0x89,0x87,0, - 0xe4,0xbb,0xbb,0, - 0xe5,0x8f,0x96,0, - 0xe6,0x93,0x9a,0, - 0xe8,0x99,0x95,0, - 0xe9,0x9a,0x8a,0, - 0xe5,0x8d,0x97,0, - 0xe7,0xb5,0xa6,0, - 0xe8,0x89,0xb2,0, - 0xe5,0x85,0x89,0, - 0xe9,0x96,0x80,0, - 0xe5,0x8d,0xb3,0, - 0xe4,0xbf,0x9d,0, - 0xe6,0xb2,0xbb,0, - 0xe5,0x8c,0x97,0, - 0xe9,0x80,0xa0,0, - 0xe7,0x99,0xbe,0, - 0xe8,0xa6,0x8f,0, - 0xe7,0x86,0xb1,0, - 0xe9,0xa0,0x98,0, - 0xe4,0xb8,0x83,0, - 0xe6,0xb5,0xb7,0, - 0xe5,0x8f,0xa3,0, - 0xe6,0x9d,0xb1,0, - 0xe5,0xb0,0x8e,0, - 0xe5,0x99,0xa8,0, - 0xe5,0xa3,0x93,0, - 0xe5,0xbf,0x97,0, - 0xe4,0xb8,0x96,0, - 0xe9,0x87,0x91,0, - 0xe5,0xa2,0x9e,0, - 0xe7,0x88,0xad,0, - 0xe6,0xbf,0x9f,0, - 0xe9,0x9a,0x8e,0, - 0xe6,0xb2,0xb9,0, - 0xe6,0x80,0x9d,0, - 0xe8,0xa1,0x93,0, - 0xe6,0xa5,0xb5,0, - 0xe4,0xba,0xa4,0, - 0xe5,0x8f,0x97,0, - 0xe8,0x81,0xaf,0, - 0xe4,0xbb,0x80,0, - 0xe8,0xaa,0x8d,0, - 0xe5,0x85,0xad,0, - 0xe5,0x85,0xb1,0, - 0xe6,0xac,0x8a,0, - 0xe6,0x94,0xb6,0, - 0xe8,0xad,0x89,0, - 0xe6,0x94,0xb9,0, - 0xe6,0xb8,0x85,0, - 0xe7,0xbe,0x8e,0, - 0xe5,0x86,0x8d,0, - 0xe6,0x8e,0xa1,0, - 0xe8,0xbd,0x89,0, - 0xe6,0x9b,0xb4,0, - 0xe5,0x96,0xae,0, - 0xe9,0xa2,0xa8,0, - 0xe5,0x88,0x87,0, - 0xe6,0x89,0x93,0, - 0xe7,0x99,0xbd,0, - 0xe6,0x95,0x99,0, - 0xe9,0x80,0x9f,0, - 0xe8,0x8a,0xb1,0, - 0xe5,0xb8,0xb6,0, - 0xe5,0xae,0x89,0, - 0xe5,0xa0,0xb4,0, - 0xe8,0xba,0xab,0, - 0xe8,0xbb,0x8a,0, - 0xe4,0xbe,0x8b,0, - 0xe7,0x9c,0x9f,0, - 0xe5,0x8b,0x99,0, - 0xe5,0x85,0xb7,0, - 0xe8,0x90,0xac,0, - 0xe6,0xaf,0x8f,0, - 0xe7,0x9b,0xae,0, - 0xe8,0x87,0xb3,0, - 0xe9,0x81,0x94,0, - 0xe8,0xb5,0xb0,0, - 0xe7,0xa9,0x8d,0, - 0xe7,0xa4,0xba,0, - 0xe8,0xad,0xb0,0, - 0xe8,0x81,0xb2,0, - 0xe5,0xa0,0xb1,0, - 0xe9,0xac,0xa5,0, - 0xe5,0xae,0x8c,0, - 0xe9,0xa1,0x9e,0, - 0xe5,0x85,0xab,0, - 0xe9,0x9b,0xa2,0, - 0xe8,0x8f,0xaf,0, - 0xe5,0x90,0x8d,0, - 0xe7,0xa2,0xba,0, - 0xe6,0x89,0x8d,0, - 0xe7,0xa7,0x91,0, - 0xe5,0xbc,0xb5,0, - 0xe4,0xbf,0xa1,0, - 0xe9,0xa6,0xac,0, - 0xe7,0xaf,0x80,0, - 0xe8,0xa9,0xb1,0, - 0xe7,0xb1,0xb3,0, - 0xe6,0x95,0xb4,0, - 0xe7,0xa9,0xba,0, - 0xe5,0x85,0x83,0, - 0xe6,0xb3,0x81,0, - 0xe4,0xbb,0x8a,0, - 0xe9,0x9b,0x86,0, - 0xe6,0xba,0xab,0, - 0xe5,0x82,0xb3,0, - 0xe5,0x9c,0x9f,0, - 0xe8,0xa8,0xb1,0, - 0xe6,0xad,0xa5,0, - 0xe7,0xbe,0xa4,0, - 0xe5,0xbb,0xa3,0, - 0xe7,0x9f,0xb3,0, - 0xe8,0xa8,0x98,0, - 0xe9,0x9c,0x80,0, - 0xe6,0xae,0xb5,0, - 0xe7,0xa0,0x94,0, - 0xe7,0x95,0x8c,0, - 0xe6,0x8b,0x89,0, - 0xe6,0x9e,0x97,0, - 0xe5,0xbe,0x8b,0, - 0xe5,0x8f,0xab,0, - 0xe4,0xb8,0x94,0, - 0xe7,0xa9,0xb6,0, - 0xe8,0xa7,0x80,0, - 0xe8,0xb6,0x8a,0, - 0xe7,0xb9,0x94,0, - 0xe8,0xa3,0x9d,0, - 0xe5,0xbd,0xb1,0, - 0xe7,0xae,0x97,0, - 0xe4,0xbd,0x8e,0, - 0xe6,0x8c,0x81,0, - 0xe9,0x9f,0xb3,0, - 0xe7,0x9c,0xbe,0, - 0xe6,0x9b,0xb8,0, - 0xe5,0xb8,0x83,0, - 0xe5,0xa4,0x8d,0, - 0xe5,0xae,0xb9,0, - 0xe5,0x85,0x92,0, - 0xe9,0xa0,0x88,0, - 0xe9,0x9a,0x9b,0, - 0xe5,0x95,0x86,0, - 0xe9,0x9d,0x9e,0, - 0xe9,0xa9,0x97,0, - 0xe9,0x80,0xa3,0, - 0xe6,0x96,0xb7,0, - 0xe6,0xb7,0xb1,0, - 0xe9,0x9b,0xa3,0, - 0xe8,0xbf,0x91,0, - 0xe7,0xa4,0xa6,0, - 0xe5,0x8d,0x83,0, - 0xe9,0x80,0xb1,0, - 0xe5,0xa7,0x94,0, - 0xe7,0xb4,0xa0,0, - 0xe6,0x8a,0x80,0, - 0xe5,0x82,0x99,0, - 0xe5,0x8d,0x8a,0, - 0xe8,0xbe,0xa6,0, - 0xe9,0x9d,0x92,0, - 0xe7,0x9c,0x81,0, - 0xe5,0x88,0x97,0, - 0xe7,0xbf,0x92,0, - 0xe9,0x9f,0xbf,0, - 0xe7,0xb4,0x84,0, - 0xe6,0x94,0xaf,0, - 0xe8,0x88,0xac,0, - 0xe5,0x8f,0xb2,0, - 0xe6,0x84,0x9f,0, - 0xe5,0x8b,0x9e,0, - 0xe4,0xbe,0xbf,0, - 0xe5,0x9c,0x98,0, - 0xe5,0xbe,0x80,0, - 0xe9,0x85,0xb8,0, - 0xe6,0xad,0xb7,0, - 0xe5,0xb8,0x82,0, - 0xe5,0x85,0x8b,0, - 0xe4,0xbd,0x95,0, - 0xe9,0x99,0xa4,0, - 0xe6,0xb6,0x88,0, - 0xe6,0xa7,0x8b,0, - 0xe5,0xba,0x9c,0, - 0xe7,0xa8,0xb1,0, - 0xe5,0xa4,0xaa,0, - 0xe6,0xba,0x96,0, - 0xe7,0xb2,0xbe,0, - 0xe5,0x80,0xbc,0, - 0xe8,0x99,0x9f,0, - 0xe7,0x8e,0x87,0, - 0xe6,0x97,0x8f,0, - 0xe7,0xb6,0xad,0, - 0xe5,0x8a,0x83,0, - 0xe9,0x81,0xb8,0, - 0xe6,0xa8,0x99,0, - 0xe5,0xaf,0xab,0, - 0xe5,0xad,0x98,0, - 0xe5,0x80,0x99,0, - 0xe6,0xaf,0x9b,0, - 0xe8,0xa6,0xaa,0, - 0xe5,0xbf,0xab,0, - 0xe6,0x95,0x88,0, - 0xe6,0x96,0xaf,0, - 0xe9,0x99,0xa2,0, - 0xe6,0x9f,0xa5,0, - 0xe6,0xb1,0x9f,0, - 0xe5,0x9e,0x8b,0, - 0xe7,0x9c,0xbc,0, - 0xe7,0x8e,0x8b,0, - 0xe6,0x8c,0x89,0, - 0xe6,0xa0,0xbc,0, - 0xe9,0xa4,0x8a,0, - 0xe6,0x98,0x93,0, - 0xe7,0xbd,0xae,0, - 0xe6,0xb4,0xbe,0, - 0xe5,0xb1,0xa4,0, - 0xe7,0x89,0x87,0, - 0xe5,0xa7,0x8b,0, - 0xe5,0x8d,0xbb,0, - 0xe5,0xb0,0x88,0, - 0xe7,0x8b,0x80,0, - 0xe8,0x82,0xb2,0, - 0xe5,0xbb,0xa0,0, - 0xe4,0xba,0xac,0, - 0xe8,0xad,0x98,0, - 0xe9,0x81,0xa9,0, - 0xe5,0xb1,0xac,0, - 0xe5,0x9c,0x93,0, - 0xe5,0x8c,0x85,0, - 0xe7,0x81,0xab,0, - 0xe4,0xbd,0x8f,0, - 0xe8,0xaa,0xbf,0, - 0xe6,0xbb,0xbf,0, - 0xe7,0xb8,0xa3,0, - 0xe5,0xb1,0x80,0, - 0xe7,0x85,0xa7,0, - 0xe5,0x8f,0x83,0, - 0xe7,0xb4,0x85,0, - 0xe7,0xb4,0xb0,0, - 0xe5,0xbc,0x95,0, - 0xe8,0x81,0xbd,0, - 0xe8,0xa9,0xb2,0, - 0xe9,0x90,0xb5,0, - 0xe5,0x83,0xb9,0, - 0xe5,0x9a,0xb4,0, - 0xe9,0xa6,0x96,0, - 0xe5,0xba,0x95,0, - 0xe6,0xb6,0xb2,0, - 0xe5,0xae,0x98,0, - 0xe5,0xbe,0xb7,0, - 0xe9,0x9a,0xa8,0, - 0xe7,0x97,0x85,0, - 0xe8,0x98,0x87,0, - 0xe5,0xa4,0xb1,0, - 0xe7,0x88,0xbe,0, - 0xe6,0xad,0xbb,0, - 0xe8,0xac,0x9b,0, - 0xe9,0x85,0x8d,0, - 0xe5,0xa5,0xb3,0, - 0xe9,0xbb,0x83,0, - 0xe6,0x8e,0xa8,0, - 0xe9,0xa1,0xaf,0, - 0xe8,0xab,0x87,0, - 0xe7,0xbd,0xaa,0, - 0xe7,0xa5,0x9e,0, - 0xe8,0x97,0x9d,0, - 0xe5,0x91,0xa2,0, - 0xe5,0xb8,0xad,0, - 0xe5,0x90,0xab,0, - 0xe4,0xbc,0x81,0, - 0xe6,0x9c,0x9b,0, - 0xe5,0xaf,0x86,0, - 0xe6,0x89,0xb9,0, - 0xe7,0x87,0x9f,0, - 0xe9,0xa0,0x85,0, - 0xe9,0x98,0xb2,0, - 0xe8,0x88,0x89,0, - 0xe7,0x90,0x83,0, - 0xe8,0x8b,0xb1,0, - 0xe6,0xb0,0xa7,0, - 0xe5,0x8b,0xa2,0, - 0xe5,0x91,0x8a,0, - 0xe6,0x9d,0x8e,0, - 0xe5,0x8f,0xb0,0, - 0xe8,0x90,0xbd,0, - 0xe6,0x9c,0xa8,0, - 0xe5,0xb9,0xab,0, - 0xe8,0xbc,0xaa,0, - 0xe7,0xa0,0xb4,0, - 0xe4,0xba,0x9e,0, - 0xe5,0xb8,0xab,0, - 0xe5,0x9c,0x8d,0, - 0xe6,0xb3,0xa8,0, - 0xe9,0x81,0xa0,0, - 0xe5,0xad,0x97,0, - 0xe6,0x9d,0x90,0, - 0xe6,0x8e,0x92,0, - 0xe4,0xbe,0x9b,0, - 0xe6,0xb2,0xb3,0, - 0xe6,0x85,0x8b,0, - 0xe5,0xb0,0x81,0, - 0xe5,0x8f,0xa6,0, - 0xe6,0x96,0xbd,0, - 0xe6,0xb8,0x9b,0, - 0xe6,0xa8,0xb9,0, - 0xe6,0xba,0xb6,0, - 0xe6,0x80,0x8e,0, - 0xe6,0xad,0xa2,0, - 0xe6,0xa1,0x88,0, - 0xe8,0xa8,0x80,0, - 0xe5,0xa3,0xab,0, - 0xe5,0x9d,0x87,0, - 0xe6,0xad,0xa6,0, - 0xe5,0x9b,0xba,0, - 0xe8,0x91,0x89,0, - 0xe9,0xad,0x9a,0, - 0xe6,0xb3,0xa2,0, - 0xe8,0xa6,0x96,0, - 0xe5,0x83,0x85,0, - 0xe8,0xb2,0xbb,0, - 0xe7,0xb7,0x8a,0, - 0xe6,0x84,0x9b,0, - 0xe5,0xb7,0xa6,0, - 0xe7,0xab,0xa0,0, - 0xe6,0x97,0xa9,0, - 0xe6,0x9c,0x9d,0, - 0xe5,0xae,0xb3,0, - 0xe7,0xba,0x8c,0, - 0xe8,0xbc,0x95,0, - 0xe6,0x9c,0x8d,0, - 0xe8,0xa9,0xa6,0, - 0xe9,0xa3,0x9f,0, - 0xe5,0x85,0x85,0, - 0xe5,0x85,0xb5,0, - 0xe6,0xba,0x90,0, - 0xe5,0x88,0xa4,0, - 0xe8,0xad,0xb7,0, - 0xe5,0x8f,0xb8,0, - 0xe8,0xb6,0xb3,0, - 0xe6,0x9f,0x90,0, - 0xe7,0xb7,0xb4,0, - 0xe5,0xb7,0xae,0, - 0xe8,0x87,0xb4,0, - 0xe6,0x9d,0xbf,0, - 0xe7,0x94,0xb0,0, - 0xe9,0x99,0x8d,0, - 0xe9,0xbb,0x91,0, - 0xe7,0x8a,0xaf,0, - 0xe8,0xb2,0xa0,0, - 0xe6,0x93,0x8a,0, - 0xe8,0x8c,0x83,0, - 0xe7,0xb9,0xbc,0, - 0xe8,0x88,0x88,0, - 0xe4,0xbc,0xbc,0, - 0xe9,0xa4,0x98,0, - 0xe5,0xa0,0x85,0, - 0xe6,0x9b,0xb2,0, - 0xe8,0xbc,0xb8,0, - 0xe4,0xbf,0xae,0, - 0xe6,0x95,0x85,0, - 0xe5,0x9f,0x8e,0, - 0xe5,0xa4,0xab,0, - 0xe5,0xa4,0xa0,0, - 0xe9,0x80,0x81,0, - 0xe7,0xad,0x86,0, - 0xe8,0x88,0xb9,0, - 0xe4,0xbd,0x94,0, - 0xe5,0x8f,0xb3,0, - 0xe8,0xb2,0xa1,0, - 0xe5,0x90,0x83,0, - 0xe5,0xaf,0x8c,0, - 0xe6,0x98,0xa5,0, - 0xe8,0x81,0xb7,0, - 0xe8,0xa6,0xba,0, - 0xe6,0xbc,0xa2,0, - 0xe7,0x95,0xab,0, - 0xe5,0x8a,0x9f,0, - 0xe5,0xb7,0xb4,0, - 0xe8,0xb7,0x9f,0, - 0xe9,0x9b,0x96,0, - 0xe9,0x9b,0x9c,0, - 0xe9,0xa3,0x9b,0, - 0xe6,0xaa,0xa2,0, - 0xe5,0x90,0xb8,0, - 0xe5,0x8a,0xa9,0, - 0xe6,0x98,0x87,0, - 0xe9,0x99,0xbd,0, - 0xe4,0xba,0x92,0, - 0xe5,0x88,0x9d,0, - 0xe5,0x89,0xb5,0, - 0xe6,0x8a,0x97,0, - 0xe8,0x80,0x83,0, - 0xe6,0x8a,0x95,0, - 0xe5,0xa3,0x9e,0, - 0xe7,0xad,0x96,0, - 0xe5,0x8f,0xa4,0, - 0xe5,0xbe,0x91,0, - 0xe6,0x8f,0x9b,0, - 0xe6,0x9c,0xaa,0, - 0xe8,0xb7,0x91,0, - 0xe7,0x95,0x99,0, - 0xe9,0x8b,0xbc,0, - 0xe6,0x9b,0xbe,0, - 0xe7,0xab,0xaf,0, - 0xe8,0xb2,0xac,0, - 0xe7,0xab,0x99,0, - 0xe7,0xb0,0xa1,0, - 0xe8,0xbf,0xb0,0, - 0xe9,0x8c,0xa2,0, - 0xe5,0x89,0xaf,0, - 0xe7,0x9b,0xa1,0, - 0xe5,0xb8,0x9d,0, - 0xe5,0xb0,0x84,0, - 0xe8,0x8d,0x89,0, - 0xe8,0xa1,0x9d,0, - 0xe6,0x89,0xbf,0, - 0xe7,0x8d,0xa8,0, - 0xe4,0xbb,0xa4,0, - 0xe9,0x99,0x90,0, - 0xe9,0x98,0xbf,0, - 0xe5,0xae,0xa3,0, - 0xe7,0x92,0xb0,0, - 0xe9,0x9b,0x99,0, - 0xe8,0xab,0x8b,0, - 0xe8,0xb6,0x85,0, - 0xe5,0xbe,0xae,0, - 0xe8,0xae,0x93,0, - 0xe6,0x8e,0xa7,0, - 0xe5,0xb7,0x9e,0, - 0xe8,0x89,0xaf,0, - 0xe8,0xbb,0xb8,0, - 0xe6,0x89,0xbe,0, - 0xe5,0x90,0xa6,0, - 0xe7,0xb4,0x80,0, - 0xe7,0x9b,0x8a,0, - 0xe4,0xbe,0x9d,0, - 0xe5,0x84,0xaa,0, - 0xe9,0xa0,0x82,0, - 0xe7,0xa4,0x8e,0, - 0xe8,0xbc,0x89,0, - 0xe5,0x80,0x92,0, - 0xe6,0x88,0xbf,0, - 0xe7,0xaa,0x81,0, - 0xe5,0x9d,0x90,0, - 0xe7,0xb2,0x89,0, - 0xe6,0x95,0xb5,0, - 0xe7,0x95,0xa5,0, - 0xe5,0xae,0xa2,0, - 0xe8,0xa2,0x81,0, - 0xe5,0x86,0xb7,0, - 0xe5,0x8b,0x9d,0, - 0xe7,0xb5,0x95,0, - 0xe6,0x9e,0x90,0, - 0xe5,0xa1,0x8a,0, - 0xe5,0x8a,0x91,0, - 0xe6,0xb8,0xac,0, - 0xe7,0xb5,0xb2,0, - 0xe5,0x8d,0x94,0, - 0xe8,0xa8,0xb4,0, - 0xe5,0xbf,0xb5,0, - 0xe9,0x99,0xb3,0, - 0xe4,0xbb,0x8d,0, - 0xe7,0xbe,0x85,0, - 0xe9,0xb9,0xbd,0, - 0xe5,0x8f,0x8b,0, - 0xe6,0xb4,0x8b,0, - 0xe9,0x8c,0xaf,0, - 0xe8,0x8b,0xa6,0, - 0xe5,0xa4,0x9c,0, - 0xe5,0x88,0x91,0, - 0xe7,0xa7,0xbb,0, - 0xe9,0xa0,0xbb,0, - 0xe9,0x80,0x90,0, - 0xe9,0x9d,0xa0,0, - 0xe6,0xb7,0xb7,0, - 0xe6,0xaf,0x8d,0, - 0xe7,0x9f,0xad,0, - 0xe7,0x9a,0xae,0, - 0xe7,0xb5,0x82,0, - 0xe8,0x81,0x9a,0, - 0xe6,0xb1,0xbd,0, - 0xe6,0x9d,0x91,0, - 0xe9,0x9b,0xb2,0, - 0xe5,0x93,0xaa,0, - 0xe6,0x97,0xa2,0, - 0xe8,0xb7,0x9d,0, - 0xe8,0xa1,0x9b,0, - 0xe5,0x81,0x9c,0, - 0xe7,0x83,0x88,0, - 0xe5,0xa4,0xae,0, - 0xe5,0xaf,0x9f,0, - 0xe7,0x87,0x92,0, - 0xe8,0xbf,0x85,0, - 0xe5,0xa2,0x83,0, - 0xe8,0x8b,0xa5,0, - 0xe5,0x8d,0xb0,0, - 0xe6,0xb4,0xb2,0, - 0xe5,0x88,0xbb,0, - 0xe6,0x8b,0xac,0, - 0xe6,0xbf,0x80,0, - 0xe5,0xad,0x94,0, - 0xe6,0x90,0x9e,0, - 0xe7,0x94,0x9a,0, - 0xe5,0xae,0xa4,0, - 0xe5,0xbe,0x85,0, - 0xe6,0xa0,0xb8,0, - 0xe6,0xa0,0xa1,0, - 0xe6,0x95,0xa3,0, - 0xe4,0xbe,0xb5,0, - 0xe5,0x90,0xa7,0, - 0xe7,0x94,0xb2,0, - 0xe9,0x81,0x8a,0, - 0xe4,0xb9,0x85,0, - 0xe8,0x8f,0x9c,0, - 0xe5,0x91,0xb3,0, - 0xe8,0x88,0x8a,0, - 0xe6,0xa8,0xa1,0, - 0xe6,0xb9,0x96,0, - 0xe8,0xb2,0xa8,0, - 0xe6,0x90,0x8d,0, - 0xe9,0xa0,0x90,0, - 0xe9,0x98,0xbb,0, - 0xe6,0xaf,0xab,0, - 0xe6,0x99,0xae,0, - 0xe7,0xa9,0xa9,0, - 0xe4,0xb9,0x99,0, - 0xe5,0xaa,0xbd,0, - 0xe6,0xa4,0x8d,0, - 0xe6,0x81,0xaf,0, - 0xe6,0x93,0xb4,0, - 0xe9,0x8a,0x80,0, - 0xe8,0xaa,0x9e,0, - 0xe6,0x8f,0xae,0, - 0xe9,0x85,0x92,0, - 0xe5,0xae,0x88,0, - 0xe6,0x8b,0xbf,0, - 0xe5,0xba,0x8f,0, - 0xe7,0xb4,0x99,0, - 0xe9,0x86,0xab,0, - 0xe7,0xbc,0xba,0, - 0xe9,0x9b,0xa8,0, - 0xe5,0x97,0x8e,0, - 0xe9,0x87,0x9d,0, - 0xe5,0x8a,0x89,0, - 0xe5,0x95,0x8a,0, - 0xe6,0x80,0xa5,0, - 0xe5,0x94,0xb1,0, - 0xe8,0xaa,0xa4,0, - 0xe8,0xa8,0x93,0, - 0xe9,0xa1,0x98,0, - 0xe5,0xaf,0xa9,0, - 0xe9,0x99,0x84,0, - 0xe7,0x8d,0xb2,0, - 0xe8,0x8c,0xb6,0, - 0xe9,0xae,0xae,0, - 0xe7,0xb3,0xa7,0, - 0xe6,0x96,0xa4,0, - 0xe5,0xad,0xa9,0, - 0xe8,0x84,0xab,0, - 0xe7,0xa1,0xab,0, - 0xe8,0x82,0xa5,0, - 0xe5,0x96,0x84,0, - 0xe9,0xbe,0x8d,0, - 0xe6,0xbc,0x94,0, - 0xe7,0x88,0xb6,0, - 0xe6,0xbc,0xb8,0, - 0xe8,0xa1,0x80,0, - 0xe6,0xad,0xa1,0, - 0xe6,0xa2,0xb0,0, - 0xe6,0x8e,0x8c,0, - 0xe6,0xad,0x8c,0, - 0xe6,0xb2,0x99,0, - 0xe5,0x89,0x9b,0, - 0xe6,0x94,0xbb,0, - 0xe8,0xac,0x82,0, - 0xe7,0x9b,0xbe,0, - 0xe8,0xa8,0x8e,0, - 0xe6,0x99,0x9a,0, - 0xe7,0xb2,0x92,0, - 0xe4,0xba,0x82,0, - 0xe7,0x87,0x83,0, - 0xe7,0x9f,0x9b,0, - 0xe4,0xb9,0x8e,0, - 0xe6,0xae,0xba,0, - 0xe8,0x97,0xa5,0, - 0xe5,0xaf,0xa7,0, - 0xe9,0xad,0xaf,0, - 0xe8,0xb2,0xb4,0, - 0xe9,0x90,0x98,0, - 0xe7,0x85,0xa4,0, - 0xe8,0xae,0x80,0, - 0xe7,0x8f,0xad,0, - 0xe4,0xbc,0xaf,0, - 0xe9,0xa6,0x99,0, - 0xe4,0xbb,0x8b,0, - 0xe8,0xbf,0xab,0, - 0xe5,0x8f,0xa5,0, - 0xe8,0xb1,0x90,0, - 0xe5,0x9f,0xb9,0, - 0xe6,0x8f,0xa1,0, - 0xe8,0x98,0xad,0, - 0xe6,0x93,0x94,0, - 0xe5,0xbc,0xa6,0, - 0xe8,0x9b,0x8b,0, - 0xe6,0xb2,0x89,0, - 0xe5,0x81,0x87,0, - 0xe7,0xa9,0xbf,0, - 0xe5,0x9f,0xb7,0, - 0xe7,0xad,0x94,0, - 0xe6,0xa8,0x82,0, - 0xe8,0xaa,0xb0,0, - 0xe9,0xa0,0x86,0, - 0xe7,0x85,0x99,0, - 0xe7,0xb8,0xae,0, - 0xe5,0xbe,0xb5,0, - 0xe8,0x87,0x89,0, - 0xe5,0x96,0x9c,0, - 0xe6,0x9d,0xbe,0, - 0xe8,0x85,0xb3,0, - 0xe5,0x9b,0xb0,0, - 0xe7,0x95,0xb0,0, - 0xe5,0x85,0x8d,0, - 0xe8,0x83,0x8c,0, - 0xe6,0x98,0x9f,0, - 0xe7,0xa6,0x8f,0, - 0xe8,0xb2,0xb7,0, - 0xe6,0x9f,0x93,0, - 0xe4,0xba,0x95,0, - 0xe6,0xa6,0x82,0, - 0xe6,0x85,0xa2,0, - 0xe6,0x80,0x95,0, - 0xe7,0xa3,0x81,0, - 0xe5,0x80,0x8d,0, - 0xe7,0xa5,0x96,0, - 0xe7,0x9a,0x87,0, - 0xe4,0xbf,0x83,0, - 0xe9,0x9d,0x9c,0, - 0xe8,0xa3,0x9c,0, - 0xe8,0xa9,0x95,0, - 0xe7,0xbf,0xbb,0, - 0xe8,0x82,0x89,0, - 0xe8,0xb8,0x90,0, - 0xe5,0xb0,0xbc,0, - 0xe8,0xa1,0xa3,0, - 0xe5,0xaf,0xac,0, - 0xe6,0x8f,0x9a,0, - 0xe6,0xa3,0x89,0, - 0xe5,0xb8,0x8c,0, - 0xe5,0x82,0xb7,0, - 0xe6,0x93,0x8d,0, - 0xe5,0x9e,0x82,0, - 0xe7,0xa7,0x8b,0, - 0xe5,0xae,0x9c,0, - 0xe6,0xb0,0xab,0, - 0xe5,0xa5,0x97,0, - 0xe7,0x9d,0xa3,0, - 0xe6,0x8c,0xaf,0, - 0xe6,0x9e,0xb6,0, - 0xe4,0xba,0xae,0, - 0xe6,0x9c,0xab,0, - 0xe6,0x86,0xb2,0, - 0xe6,0x85,0xb6,0, - 0xe7,0xb7,0xa8,0, - 0xe7,0x89,0x9b,0, - 0xe8,0xa7,0xb8,0, - 0xe6,0x98,0xa0,0, - 0xe9,0x9b,0xb7,0, - 0xe9,0x8a,0xb7,0, - 0xe8,0xa9,0xa9,0, - 0xe5,0xba,0xa7,0, - 0xe5,0xb1,0x85,0, - 0xe6,0x8a,0x93,0, - 0xe8,0xa3,0x82,0, - 0xe8,0x83,0x9e,0, - 0xe5,0x91,0xbc,0, - 0xe5,0xa8,0x98,0, - 0xe6,0x99,0xaf,0, - 0xe5,0xa8,0x81,0, - 0xe7,0xb6,0xa0,0, - 0xe6,0x99,0xb6,0, - 0xe5,0x8e,0x9a,0, - 0xe7,0x9b,0x9f,0, - 0xe8,0xa1,0xa1,0, - 0xe9,0x9b,0x9e,0, - 0xe5,0xad,0xab,0, - 0xe5,0xbb,0xb6,0, - 0xe5,0x8d,0xb1,0, - 0xe8,0x86,0xa0,0, - 0xe5,0xb1,0x8b,0, - 0xe9,0x84,0x89,0, - 0xe8,0x87,0xa8,0, - 0xe9,0x99,0xb8,0, - 0xe9,0xa1,0xa7,0, - 0xe6,0x8e,0x89,0, - 0xe5,0x91,0x80,0, - 0xe7,0x87,0x88,0, - 0xe6,0xad,0xb2,0, - 0xe6,0x8e,0xaa,0, - 0xe6,0x9d,0x9f,0, - 0xe8,0x80,0x90,0, - 0xe5,0x8a,0x87,0, - 0xe7,0x8e,0x89,0, - 0xe8,0xb6,0x99,0, - 0xe8,0xb7,0xb3,0, - 0xe5,0x93,0xa5,0, - 0xe5,0xad,0xa3,0, - 0xe8,0xaa,0xb2,0, - 0xe5,0x87,0xb1,0, - 0xe8,0x83,0xa1,0, - 0xe9,0xa1,0x8d,0, - 0xe6,0xac,0xbe,0, - 0xe7,0xb4,0xb9,0, - 0xe5,0x8d,0xb7,0, - 0xe9,0xbd,0x8a,0, - 0xe5,0x81,0x89,0, - 0xe8,0x92,0xb8,0, - 0xe6,0xae,0x96,0, - 0xe6,0xb0,0xb8,0, - 0xe5,0xae,0x97,0, - 0xe8,0x8b,0x97,0, - 0xe5,0xb7,0x9d,0, - 0xe7,0x88,0x90,0, - 0xe5,0xb2,0xa9,0, - 0xe5,0xbc,0xb1,0, - 0xe9,0x9b,0xb6,0, - 0xe6,0xa5,0x8a,0, - 0xe5,0xa5,0x8f,0, - 0xe6,0xb2,0xbf,0, - 0xe9,0x9c,0xb2,0, - 0xe6,0xa1,0xbf,0, - 0xe6,0x8e,0xa2,0, - 0xe6,0xbb,0x91,0, - 0xe9,0x8e,0xae,0, - 0xe9,0xa3,0xaf,0, - 0xe6,0xbf,0x83,0, - 0xe8,0x88,0xaa,0, - 0xe6,0x87,0xb7,0, - 0xe8,0xb6,0x95,0, - 0xe5,0xba,0xab,0, - 0xe5,0xa5,0xaa,0, - 0xe4,0xbc,0x8a,0, - 0xe9,0x9d,0x88,0, - 0xe7,0xa8,0x85,0, - 0xe9,0x80,0x94,0, - 0xe6,0xbb,0x85,0, - 0xe8,0xb3,0xbd,0, - 0xe6,0xad,0xb8,0, - 0xe5,0x8f,0xac,0, - 0xe9,0xbc,0x93,0, - 0xe6,0x92,0xad,0, - 0xe7,0x9b,0xa4,0, - 0xe8,0xa3,0x81,0, - 0xe9,0x9a,0xaa,0, - 0xe5,0xba,0xb7,0, - 0xe5,0x94,0xaf,0, - 0xe9,0x8c,0x84,0, - 0xe8,0x8f,0x8c,0, - 0xe7,0xb4,0x94,0, - 0xe5,0x80,0x9f,0, - 0xe7,0xb3,0x96,0, - 0xe8,0x93,0x8b,0, - 0xe6,0xa9,0xab,0, - 0xe7,0xac,0xa6,0, - 0xe7,0xa7,0x81,0, - 0xe5,0x8a,0xaa,0, - 0xe5,0xa0,0x82,0, - 0xe5,0x9f,0x9f,0, - 0xe6,0xa7,0x8d,0, - 0xe6,0xbd,0xa4,0, - 0xe5,0xb9,0x85,0, - 0xe5,0x93,0x88,0, - 0xe7,0xab,0x9f,0, - 0xe7,0x86,0x9f,0, - 0xe8,0x9f,0xb2,0, - 0xe6,0xbe,0xa4,0, - 0xe8,0x85,0xa6,0, - 0xe5,0xa3,0xa4,0, - 0xe7,0xa2,0xb3,0, - 0xe6,0xad,0x90,0, - 0xe9,0x81,0x8d,0, - 0xe5,0x81,0xb4,0, - 0xe5,0xaf,0xa8,0, - 0xe6,0x95,0xa2,0, - 0xe5,0xbe,0xb9,0, - 0xe6,0x85,0xae,0, - 0xe6,0x96,0x9c,0, - 0xe8,0x96,0x84,0, - 0xe5,0xba,0xad,0, - 0xe7,0xb4,0x8d,0, - 0xe5,0xbd,0x88,0, - 0xe9,0xa3,0xbc,0, - 0xe4,0xbc,0xb8,0, - 0xe6,0x8a,0x98,0, - 0xe9,0xba,0xa5,0, - 0xe6,0xbf,0x95,0, - 0xe6,0x9a,0x97,0, - 0xe8,0x8d,0xb7,0, - 0xe7,0x93,0xa6,0, - 0xe5,0xa1,0x9e,0, - 0xe5,0xba,0x8a,0, - 0xe7,0xaf,0x89,0, - 0xe6,0x83,0xa1,0, - 0xe6,0x88,0xb6,0, - 0xe8,0xa8,0xaa,0, - 0xe5,0xa1,0x94,0, - 0xe5,0xa5,0x87,0, - 0xe9,0x80,0x8f,0, - 0xe6,0xa2,0x81,0, - 0xe5,0x88,0x80,0, - 0xe6,0x97,0x8b,0, - 0xe8,0xb7,0xa1,0, - 0xe5,0x8d,0xa1,0, - 0xe6,0xb0,0xaf,0, - 0xe9,0x81,0x87,0, - 0xe4,0xbb,0xbd,0, - 0xe6,0xaf,0x92,0, - 0xe6,0xb3,0xa5,0, - 0xe9,0x80,0x80,0, - 0xe6,0xb4,0x97,0, - 0xe6,0x93,0xba,0, - 0xe7,0x81,0xb0,0, - 0xe5,0xbd,0xa9,0, - 0xe8,0xb3,0xa3,0, - 0xe8,0x80,0x97,0, - 0xe5,0xa4,0x8f,0, - 0xe6,0x93,0x87,0, - 0xe5,0xbf,0x99,0, - 0xe9,0x8a,0x85,0, - 0xe7,0x8d,0xbb,0, - 0xe7,0xa1,0xac,0, - 0xe4,0xba,0x88,0, - 0xe7,0xb9,0x81,0, - 0xe5,0x9c,0x88,0, - 0xe9,0x9b,0xaa,0, - 0xe5,0x87,0xbd,0, - 0xe4,0xba,0xa6,0, - 0xe6,0x8a,0xbd,0, - 0xe7,0xaf,0x87,0, - 0xe9,0x99,0xa3,0, - 0xe9,0x99,0xb0,0, - 0xe4,0xb8,0x81,0, - 0xe5,0xb0,0xba,0, - 0xe8,0xbf,0xbd,0, - 0xe5,0xa0,0x86,0, - 0xe9,0x9b,0x84,0, - 0xe8,0xbf,0x8e,0, - 0xe6,0xb3,0x9b,0, - 0xe7,0x88,0xb8,0, - 0xe6,0xa8,0x93,0, - 0xe9,0x81,0xbf,0, - 0xe8,0xac,0x80,0, - 0xe5,0x99,0xb8,0, - 0xe9,0x87,0x8e,0, - 0xe8,0xb1,0xac,0, - 0xe6,0x97,0x97,0, - 0xe7,0xb4,0xaf,0, - 0xe5,0x81,0x8f,0, - 0xe5,0x85,0xb8,0, - 0xe9,0xa4,0xa8,0, - 0xe7,0xb4,0xa2,0, - 0xe7,0xa7,0xa6,0, - 0xe8,0x84,0x82,0, - 0xe6,0xbd,0xae,0, - 0xe7,0x88,0xba,0, - 0xe8,0xb1,0x86,0, - 0xe5,0xbf,0xbd,0, - 0xe6,0x89,0x98,0, - 0xe9,0xa9,0x9a,0, - 0xe5,0xa1,0x91,0, - 0xe9,0x81,0xba,0, - 0xe6,0x84,0x88,0, - 0xe6,0x9c,0xb1,0, - 0xe6,0x9b,0xbf,0, - 0xe7,0xba,0x96,0, - 0xe7,0xb2,0x97,0, - 0xe5,0x82,0xbe,0, - 0xe5,0xb0,0x9a,0, - 0xe7,0x97,0x9b,0, - 0xe6,0xa5,0x9a,0, - 0xe8,0xac,0x9d,0, - 0xe5,0xa5,0xae,0, - 0xe8,0xb3,0xbc,0, - 0xe7,0xa3,0xa8,0, - 0xe5,0x90,0x9b,0, - 0xe6,0xb1,0xa0,0, - 0xe6,0x97,0x81,0, - 0xe7,0xa2,0x8e,0, - 0xe9,0xaa,0xa8,0, - 0xe7,0x9b,0xa3,0, - 0xe6,0x8d,0x95,0, - 0xe5,0xbc,0x9f,0, - 0xe6,0x9a,0xb4,0, - 0xe5,0x89,0xb2,0, - 0xe8,0xb2,0xab,0, - 0xe6,0xae,0x8a,0, - 0xe9,0x87,0x8b,0, - 0xe8,0xa9,0x9e,0, - 0xe4,0xba,0xa1,0, - 0xe5,0xa3,0x81,0, - 0xe9,0xa0,0x93,0, - 0xe5,0xaf,0xb6,0, - 0xe5,0x8d,0x88,0, - 0xe5,0xa1,0xb5,0, - 0xe8,0x81,0x9e,0, - 0xe6,0x8f,0xad,0, - 0xe7,0x82,0xae,0, - 0xe6,0xae,0x98,0, - 0xe5,0x86,0xac,0, - 0xe6,0xa9,0x8b,0, - 0xe5,0xa9,0xa6,0, - 0xe8,0xad,0xa6,0, - 0xe7,0xb6,0x9c,0, - 0xe6,0x8b,0x9b,0, - 0xe5,0x90,0xb3,0, - 0xe4,0xbb,0x98,0, - 0xe6,0xb5,0xae,0, - 0xe9,0x81,0xad,0, - 0xe5,0xbe,0x90,0, - 0xe6,0x82,0xa8,0, - 0xe6,0x90,0x96,0, - 0xe8,0xb0,0xb7,0, - 0xe8,0xb4,0x8a,0, - 0xe7,0xae,0xb1,0, - 0xe9,0x9a,0x94,0, - 0xe8,0xa8,0x82,0, - 0xe7,0x94,0xb7,0, - 0xe5,0x90,0xb9,0, - 0xe5,0x9c,0x92,0, - 0xe7,0xb4,0x9b,0, - 0xe5,0x94,0x90,0, - 0xe6,0x95,0x97,0, - 0xe5,0xae,0x8b,0, - 0xe7,0x8e,0xbb,0, - 0xe5,0xb7,0xa8,0, - 0xe8,0x80,0x95,0, - 0xe5,0x9d,0xa6,0, - 0xe6,0xa6,0xae,0, - 0xe9,0x96,0x89,0, - 0xe7,0x81,0xa3,0, - 0xe9,0x8d,0xb5,0, - 0xe5,0x87,0xa1,0, - 0xe9,0xa7,0x90,0, - 0xe9,0x8d,0x8b,0, - 0xe6,0x95,0x91,0, - 0xe6,0x81,0xa9,0, - 0xe5,0x89,0x9d,0, - 0xe5,0x87,0x9d,0, - 0xe9,0xb9,0xbc,0, - 0xe9,0xbd,0x92,0, - 0xe6,0x88,0xaa,0, - 0xe7,0x85,0x89,0, - 0xe9,0xba,0xbb,0, - 0xe7,0xb4,0xa1,0, - 0xe7,0xa6,0x81,0, - 0xe5,0xbb,0xa2,0, - 0xe7,0x9b,0x9b,0, - 0xe7,0x89,0x88,0, - 0xe7,0xb7,0xa9,0, - 0xe6,0xb7,0xa8,0, - 0xe7,0x9d,0x9b,0, - 0xe6,0x98,0x8c,0, - 0xe5,0xa9,0x9a,0, - 0xe6,0xb6,0x89,0, - 0xe7,0xad,0x92,0, - 0xe5,0x98,0xb4,0, - 0xe6,0x8f,0x92,0, - 0xe5,0xb2,0xb8,0, - 0xe6,0x9c,0x97,0, - 0xe8,0x8e,0x8a,0, - 0xe8,0xa1,0x97,0, - 0xe8,0x97,0x8f,0, - 0xe5,0xa7,0x91,0, - 0xe8,0xb2,0xbf,0, - 0xe8,0x85,0x90,0, - 0xe5,0xa5,0xb4,0, - 0xe5,0x95,0xa6,0, - 0xe6,0x85,0xa3,0, - 0xe4,0xb9,0x98,0, - 0xe5,0xa4,0xa5,0, - 0xe6,0x81,0xa2,0, - 0xe5,0x8b,0xbb,0, - 0xe7,0xb4,0x97,0, - 0xe6,0x89,0x8e,0, - 0xe8,0xbe,0xaf,0, - 0xe8,0x80,0xb3,0, - 0xe5,0xbd,0xaa,0, - 0xe8,0x87,0xa3,0, - 0xe5,0x84,0x84,0, - 0xe7,0x92,0x83,0, - 0xe6,0x8a,0xb5,0, - 0xe8,0x84,0x88,0, - 0xe7,0xa7,0x80,0, - 0xe8,0x96,0xa9,0, - 0xe4,0xbf,0x84,0, - 0xe7,0xb6,0xb2,0, - 0xe8,0x88,0x9e,0, - 0xe5,0xba,0x97,0, - 0xe5,0x99,0xb4,0, - 0xe7,0xb8,0xb1,0, - 0xe5,0xaf,0xb8,0, - 0xe6,0xb1,0x97,0, - 0xe6,0x8e,0x9b,0, - 0xe6,0xb4,0xaa,0, - 0xe8,0xb3,0x80,0, - 0xe9,0x96,0x83,0, - 0xe6,0x9f,0xac,0, - 0xe7,0x88,0x86,0, - 0xe7,0x83,0xaf,0, - 0xe6,0xb4,0xa5,0, - 0xe7,0xa8,0xbb,0, - 0xe7,0x89,0x86,0, - 0xe8,0xbb,0x9f,0, - 0xe5,0x8b,0x87,0, - 0xe5,0x83,0x8f,0, - 0xe6,0xbb,0xbe,0, - 0xe5,0x8e,0x98,0, - 0xe8,0x92,0x99,0, - 0xe8,0x8a,0xb3,0, - 0xe8,0x82,0xaf,0, - 0xe5,0x9d,0xa1,0, - 0xe6,0x9f,0xb1,0, - 0xe7,0x9b,0xaa,0, - 0xe8,0x85,0xbf,0, - 0xe5,0x84,0x80,0, - 0xe6,0x97,0x85,0, - 0xe5,0xb0,0xbe,0, - 0xe8,0xbb,0x8b,0, - 0xe5,0x86,0xb0,0, - 0xe8,0xb2,0xa2,0, - 0xe7,0x99,0xbb,0, - 0xe9,0xbb,0x8e,0, - 0xe5,0x89,0x8a,0, - 0xe9,0x91,0xbd,0, - 0xe5,0x8b,0x92,0, - 0xe9,0x80,0x83,0, - 0xe9,0x9a,0x9c,0, - 0xe6,0xb0,0xa8,0, - 0xe9,0x83,0xad,0, - 0xe5,0xb3,0xb0,0, - 0xe5,0xb9,0xa3,0, - 0xe6,0xb8,0xaf,0, - 0xe4,0xbc,0x8f,0, - 0xe8,0xbb,0x8c,0, - 0xe7,0x95,0x9d,0, - 0xe7,0x95,0xa2,0, - 0xe6,0x93,0xa6,0, - 0xe8,0x8e,0xab,0, - 0xe5,0x88,0xba,0, - 0xe6,0xb5,0xaa,0, - 0xe7,0xa7,0x98,0, - 0xe6,0x8f,0xb4,0, - 0xe6,0xa0,0xaa,0, - 0xe5,0x81,0xa5,0, - 0xe5,0x94,0xae,0, - 0xe8,0x82,0xa1,0, - 0xe5,0xb3,0xb6,0, - 0xe7,0x94,0x98,0, - 0xe6,0xb3,0xa1,0, - 0xe7,0x9d,0xa1,0, - 0xe7,0xab,0xa5,0, - 0xe9,0x91,0x84,0, - 0xe6,0xb9,0xaf,0, - 0xe9,0x96,0xa5,0, - 0xe4,0xbc,0x91,0, - 0xe5,0x8c,0xaf,0, - 0xe8,0x88,0x8d,0, - 0xe7,0x89,0xa7,0, - 0xe7,0xb9,0x9e,0, - 0xe7,0x82,0xb8,0, - 0xe5,0x93,0xb2,0, - 0xe7,0xa3,0xb7,0, - 0xe7,0xb8,0xbe,0, - 0xe6,0x9c,0x8b,0, - 0xe6,0xb7,0xa1,0, - 0xe5,0xb0,0x96,0, - 0xe5,0x95,0x9f,0, - 0xe9,0x99,0xb7,0, - 0xe6,0x9f,0xb4,0, - 0xe5,0x91,0x88,0, - 0xe5,0xbe,0x92,0, - 0xe9,0xa1,0x8f,0, - 0xe6,0xb7,0x9a,0, - 0xe7,0xa8,0x8d,0, - 0xe5,0xbf,0x98,0, - 0xe6,0xb3,0xb5,0, - 0xe8,0x97,0x8d,0, - 0xe6,0x8b,0x96,0, - 0xe6,0xb4,0x9e,0, - 0xe6,0x8e,0x88,0, - 0xe9,0x8f,0xa1,0, - 0xe8,0xbe,0x9b,0, - 0xe5,0xa3,0xaf,0, - 0xe9,0x8b,0x92,0, - 0xe8,0xb2,0xa7,0, - 0xe8,0x99,0x9b,0, - 0xe5,0xbd,0x8e,0, - 0xe6,0x91,0xa9,0, - 0xe6,0xb3,0xb0,0, - 0xe5,0xb9,0xbc,0, - 0xe5,0xbb,0xb7,0, - 0xe5,0xb0,0x8a,0, - 0xe7,0xaa,0x97,0, - 0xe7,0xb6,0xb1,0, - 0xe5,0xbc,0x84,0, - 0xe9,0x9a,0xb8,0, - 0xe7,0x96,0x91,0, - 0xe6,0xb0,0x8f,0, - 0xe5,0xae,0xae,0, - 0xe5,0xa7,0x90,0, - 0xe9,0x9c,0x87,0, - 0xe7,0x91,0x9e,0, - 0xe6,0x80,0xaa,0, - 0xe5,0xb0,0xa4,0, - 0xe7,0x90,0xb4,0, - 0xe5,0xbe,0xaa,0, - 0xe6,0x8f,0x8f,0, - 0xe8,0x86,0x9c,0, - 0xe9,0x81,0x95,0, - 0xe5,0xa4,0xbe,0, - 0xe8,0x85,0xb0,0, - 0xe7,0xb7,0xa3,0, - 0xe7,0x8f,0xa0,0, - 0xe7,0xaa,0xae,0, - 0xe6,0xa3,0xae,0, - 0xe6,0x9e,0x9d,0, - 0xe7,0xab,0xb9,0, - 0xe6,0xba,0x9d,0, - 0xe5,0x82,0xac,0, - 0xe7,0xb9,0xa9,0, - 0xe6,0x86,0xb6,0, - 0xe9,0x82,0xa6,0, - 0xe5,0x89,0xa9,0, - 0xe5,0xb9,0xb8,0, - 0xe6,0xbc,0xbf,0, - 0xe6,0xac,0x84,0, - 0xe6,0x93,0x81,0, - 0xe7,0x89,0x99,0, - 0xe8,0xb2,0xaf,0, - 0xe7,0xa6,0xae,0, - 0xe6,0xbf,0xbe,0, - 0xe9,0x88,0x89,0, - 0xe7,0xb4,0x8b,0, - 0xe7,0xbd,0xb7,0, - 0xe6,0x8b,0x8d,0, - 0xe5,0x92,0xb1,0, - 0xe5,0x96,0x8a,0, - 0xe8,0xa2,0x96,0, - 0xe5,0x9f,0x83,0, - 0xe5,0x8b,0xa4,0, - 0xe7,0xbd,0xb0,0, - 0xe7,0x84,0xa6,0, - 0xe6,0xbd,0x9b,0, - 0xe4,0xbc,0x8d,0, - 0xe5,0xa2,0xa8,0, - 0xe6,0xac,0xb2,0, - 0xe7,0xb8,0xab,0, - 0xe5,0xa7,0x93,0, - 0xe5,0x88,0x8a,0, - 0xe9,0xa3,0xbd,0, - 0xe4,0xbb,0xbf,0, - 0xe7,0x8d,0x8e,0, - 0xe9,0x8b,0x81,0, - 0xe9,0xac,0xbc,0, - 0xe9,0xba,0x97,0, - 0xe8,0xb7,0xa8,0, - 0xe9,0xbb,0x98,0, - 0xe6,0x8c,0x96,0, - 0xe9,0x8f,0x88,0, - 0xe6,0x8e,0x83,0, - 0xe5,0x96,0x9d,0, - 0xe8,0xa2,0x8b,0, - 0xe7,0x82,0xad,0, - 0xe6,0xb1,0xa1,0, - 0xe5,0xb9,0x95,0, - 0xe8,0xab,0xb8,0, - 0xe5,0xbc,0xa7,0, - 0xe5,0x8b,0xb5,0, - 0xe6,0xa2,0x85,0, - 0xe5,0xa5,0xb6,0, - 0xe6,0xbd,0x94,0, - 0xe7,0x81,0xbd,0, - 0xe8,0x88,0x9f,0, - 0xe9,0x91,0x91,0, - 0xe8,0x8b,0xaf,0, - 0xe8,0xa8,0x9f,0, - 0xe6,0x8a,0xb1,0, - 0xe6,0xaf,0x80,0, - 0xe6,0x87,0x82,0, - 0xe5,0xaf,0x92,0, - 0xe6,0x99,0xba,0, - 0xe5,0x9f,0x94,0, - 0xe5,0xaf,0x84,0, - 0xe5,0xb1,0x86,0, - 0xe8,0xba,0x8d,0, - 0xe6,0xb8,0xa1,0, - 0xe6,0x8c,0x91,0, - 0xe4,0xb8,0xb9,0, - 0xe8,0x89,0xb1,0, - 0xe8,0xb2,0x9d,0, - 0xe7,0xa2,0xb0,0, - 0xe6,0x8b,0x94,0, - 0xe7,0x88,0xb9,0, - 0xe6,0x88,0xb4,0, - 0xe7,0xa2,0xbc,0, - 0xe5,0xa4,0xa2,0, - 0xe8,0x8a,0xbd,0, - 0xe7,0x86,0x94,0, - 0xe8,0xb5,0xa4,0, - 0xe6,0xbc,0x81,0, - 0xe5,0x93,0xad,0, - 0xe6,0x95,0xac,0, - 0xe9,0xa1,0x86,0, - 0xe5,0xa5,0x94,0, - 0xe9,0x89,0x9b,0, - 0xe4,0xbb,0xb2,0, - 0xe8,0x99,0x8e,0, - 0xe7,0xa8,0x80,0, - 0xe5,0xa6,0xb9,0, - 0xe4,0xb9,0x8f,0, - 0xe7,0x8f,0x8d,0, - 0xe7,0x94,0xb3,0, - 0xe6,0xa1,0x8c,0, - 0xe9,0x81,0xb5,0, - 0xe5,0x85,0x81,0, - 0xe9,0x9a,0x86,0, - 0xe8,0x9e,0xba,0, - 0xe5,0x80,0x89,0, - 0xe9,0xad,0x8f,0, - 0xe9,0x8a,0xb3,0, - 0xe6,0x9b,0x89,0, - 0xe6,0xb0,0xae,0, - 0xe5,0x85,0xbc,0, - 0xe9,0x9a,0xb1,0, - 0xe7,0xa4,0x99,0, - 0xe8,0xb5,0xab,0, - 0xe6,0x92,0xa5,0, - 0xe5,0xbf,0xa0,0, - 0xe8,0x82,0x85,0, - 0xe7,0xbc,0xb8,0, - 0xe7,0x89,0xbd,0, - 0xe6,0x90,0xb6,0, - 0xe5,0x8d,0x9a,0, - 0xe5,0xb7,0xa7,0, - 0xe6,0xae,0xbc,0, - 0xe5,0x85,0x84,0, - 0xe6,0x9d,0x9c,0, - 0xe8,0xa8,0x8a,0, - 0xe8,0xaa,0xa0,0, - 0xe7,0xa2,0xa7,0, - 0xe7,0xa5,0xa5,0, - 0xe6,0x9f,0xaf,0, - 0xe9,0xa0,0x81,0, - 0xe5,0xb7,0xa1,0, - 0xe7,0x9f,0xa9,0, - 0xe6,0x82,0xb2,0, - 0xe7,0x81,0x8c,0, - 0xe9,0xbd,0xa1,0, - 0xe5,0x80,0xab,0, - 0xe7,0xa5,0xa8,0, - 0xe5,0xb0,0x8b,0, - 0xe6,0xa1,0x82,0, - 0xe9,0x8b,0xaa,0, - 0xe8,0x81,0x96,0, - 0xe6,0x81,0x90,0, - 0xe6,0x81,0xb0,0, - 0xe9,0x84,0xad,0, - 0xe8,0xb6,0xa3,0, - 0xe6,0x8a,0xac,0, - 0xe8,0x8d,0x92,0, - 0xe9,0xa8,0xb0,0, - 0xe8,0xb2,0xbc,0, - 0xe6,0x9f,0x94,0, - 0xe6,0xbb,0xb4,0, - 0xe7,0x8c,0x9b,0, - 0xe9,0x97,0x8a,0, - 0xe8,0xbc,0x9b,0, - 0xe5,0xa6,0xbb,0, - 0xe5,0xa1,0xab,0, - 0xe6,0x92,0xa4,0, - 0xe5,0x84,0xb2,0, - 0xe7,0xb0,0xbd,0, - 0xe9,0xac,0xa7,0, - 0xe6,0x93,0xbe,0, - 0xe7,0xb4,0xab,0, - 0xe7,0xa0,0x82,0, - 0xe9,0x81,0x9e,0, - 0xe6,0x88,0xb2,0, - 0xe5,0x90,0x8a,0, - 0xe9,0x99,0xb6,0, - 0xe4,0xbc,0x90,0, - 0xe9,0xa4,0xb5,0, - 0xe7,0x99,0x82,0, - 0xe7,0x93,0xb6,0, - 0xe5,0xa9,0x86,0, - 0xe6,0x92,0xab,0, - 0xe8,0x87,0x82,0, - 0xe6,0x91,0xb8,0, - 0xe5,0xbf,0x8d,0, - 0xe8,0x9d,0xa6,0, - 0xe8,0xa0,0x9f,0, - 0xe9,0x84,0xb0,0, - 0xe8,0x83,0xb8,0, - 0xe9,0x9e,0x8f,0, - 0xe6,0x93,0xa0,0, - 0xe5,0x81,0xb6,0, - 0xe6,0xa3,0x84,0, - 0xe6,0xa7,0xbd,0, - 0xe5,0x8b,0x81,0, - 0xe4,0xb9,0xb3,0, - 0xe9,0x84,0xa7,0, - 0xe5,0x90,0x89,0, - 0xe4,0xbb,0x81,0, - 0xe7,0x88,0x9b,0, - 0xe7,0xa3,0x9a,0, - 0xe7,0xa7,0x9f,0, - 0xe7,0x83,0x8f,0, - 0xe8,0x89,0xa6,0, - 0xe4,0xbc,0xb4,0, - 0xe7,0x93,0x9c,0, - 0xe6,0xb7,0xba,0, - 0xe4,0xb8,0x99,0, - 0xe6,0x9a,0xab,0, - 0xe7,0x87,0xa5,0, - 0xe6,0xa9,0xa1,0, - 0xe6,0x9f,0xb3,0, - 0xe8,0xbf,0xb7,0, - 0xe6,0x9a,0x96,0, - 0xe7,0x89,0x8c,0, - 0xe7,0xa7,0xa7,0, - 0xe8,0x86,0xbd,0, - 0xe8,0xa9,0xb3,0, - 0xe7,0xb0,0xa7,0, - 0xe8,0xb8,0x8f,0, - 0xe7,0x93,0xb7,0, - 0xe8,0xad,0x9c,0, - 0xe5,0x91,0x86,0, - 0xe8,0xb3,0x93,0, - 0xe7,0xb3,0x8a,0, - 0xe6,0xb4,0x9b,0, - 0xe8,0xbc,0x9d,0, - 0xe6,0x86,0xa4,0, - 0xe7,0xab,0xb6,0, - 0xe9,0x9a,0x99,0, - 0xe6,0x80,0x92,0, - 0xe7,0xb2,0x98,0, - 0xe4,0xb9,0x83,0, - 0xe7,0xb7,0x92,0, - 0xe8,0x82,0xa9,0, - 0xe7,0xb1,0x8d,0, - 0xe6,0x95,0x8f,0, - 0xe5,0xa1,0x97,0, - 0xe7,0x86,0x99,0, - 0xe7,0x9a,0x86,0, - 0xe5,0x81,0xb5,0, - 0xe6,0x87,0xb8,0, - 0xe6,0x8e,0x98,0, - 0xe4,0xba,0xab,0, - 0xe7,0xb3,0xbe,0, - 0xe9,0x86,0x92,0, - 0xe7,0x8b,0x82,0, - 0xe9,0x8e,0x96,0, - 0xe6,0xb7,0x80,0, - 0xe6,0x81,0xa8,0, - 0xe7,0x89,0xb2,0, - 0xe9,0x9c,0xb8,0, - 0xe7,0x88,0xac,0, - 0xe8,0xb3,0x9e,0, - 0xe9,0x80,0x86,0, - 0xe7,0x8e,0xa9,0, - 0xe9,0x99,0xb5,0, - 0xe7,0xa5,0x9d,0, - 0xe7,0xa7,0x92,0, - 0xe6,0xb5,0x99,0, - 0xe8,0xb2,0x8c,0, - 0xe5,0xbd,0xb9,0, - 0xe5,0xbd,0xbc,0, - 0xe6,0x82,0x89,0, - 0xe9,0xb4,0xa8,0, - 0xe8,0xb6,0xa8,0, - 0xe9,0xb3,0xb3,0, - 0xe6,0x99,0xa8,0, - 0xe7,0x95,0x9c,0, - 0xe8,0xbc,0xa9,0, - 0xe7,0xa7,0xa9,0, - 0xe5,0x8d,0xb5,0, - 0xe7,0xbd,0xb2,0, - 0xe6,0xa2,0xaf,0, - 0xe7,0x82,0x8e,0, - 0xe7,0x81,0x98,0, - 0xe6,0xa3,0x8b,0, - 0xe9,0xa9,0x85,0, - 0xe7,0xaf,0xa9,0, - 0xe5,0xb3,0xbd,0, - 0xe5,0x86,0x92,0, - 0xe5,0x95,0xa5,0, - 0xe5,0xa3,0xbd,0, - 0xe8,0xad,0xaf,0, - 0xe6,0xb5,0xb8,0, - 0xe6,0xb3,0x89,0, - 0xe5,0xb8,0xbd,0, - 0xe9,0x81,0xb2,0, - 0xe7,0x9f,0xbd,0, - 0xe7,0x96,0x86,0, - 0xe8,0xb2,0xb8,0, - 0xe6,0xbc,0x8f,0, - 0xe7,0xa8,0xbf,0, - 0xe5,0x86,0xa0,0, - 0xe5,0xab,0xa9,0, - 0xe8,0x84,0x85,0, - 0xe8,0x8a,0xaf,0, - 0xe7,0x89,0xa2,0, - 0xe5,0x8f,0x9b,0, - 0xe8,0x9d,0x95,0, - 0xe5,0xa5,0xa7,0, - 0xe9,0xb3,0xb4,0, - 0xe5,0xb6,0xba,0, - 0xe7,0xbe,0x8a,0, - 0xe6,0x86,0x91,0, - 0xe4,0xb8,0xb2,0, - 0xe5,0xa1,0x98,0, - 0xe7,0xb9,0xaa,0, - 0xe9,0x85,0xb5,0, - 0xe8,0x9e,0x8d,0, - 0xe7,0x9b,0x86,0, - 0xe9,0x8c,0xab,0, - 0xe5,0xbb,0x9f,0, - 0xe7,0xb1,0x8c,0, - 0xe5,0x87,0x8d,0, - 0xe8,0xbc,0x94,0, - 0xe6,0x94,0x9d,0, - 0xe8,0xa5,0xb2,0, - 0xe7,0xad,0x8b,0, - 0xe6,0x8b,0x92,0, - 0xe5,0x83,0x9a,0, - 0xe6,0x97,0xb1,0, - 0xe9,0x89,0x80,0, - 0xe9,0xb3,0xa5,0, - 0xe6,0xbc,0x86,0, - 0xe6,0xb2,0x88,0, - 0xe7,0x9c,0x89,0, - 0xe7,0x96,0x8f,0, - 0xe6,0xb7,0xbb,0, - 0xe6,0xa3,0x92,0, - 0xe7,0xa9,0x97,0, - 0xe7,0xa1,0x9d,0, - 0xe9,0x9f,0x93,0, - 0xe9,0x80,0xbc,0, - 0xe6,0x89,0xad,0, - 0xe5,0x83,0x91,0, - 0xe6,0xb6,0xbc,0, - 0xe6,0x8c,0xba,0, - 0xe7,0xa2,0x97,0, - 0xe6,0xa0,0xbd,0, - 0xe7,0x82,0x92,0, - 0xe6,0x9d,0xaf,0, - 0xe6,0x82,0xa3,0, - 0xe9,0xa4,0xbe,0, - 0xe5,0x8b,0xb8,0, - 0xe8,0xb1,0xaa,0, - 0xe9,0x81,0xbc,0, - 0xe5,0x8b,0x83,0, - 0xe9,0xb4,0xbb,0, - 0xe6,0x97,0xa6,0, - 0xe5,0x90,0x8f,0, - 0xe6,0x8b,0x9c,0, - 0xe7,0x8b,0x97,0, - 0xe5,0x9f,0x8b,0, - 0xe8,0xbc,0xa5,0, - 0xe6,0x8e,0xa9,0, - 0xe9,0xa3,0xb2,0, - 0xe6,0x90,0xac,0, - 0xe7,0xbd,0xb5,0, - 0xe8,0xbe,0xad,0, - 0xe5,0x8b,0xbe,0, - 0xe6,0x89,0xa3,0, - 0xe4,0xbc,0xb0,0, - 0xe8,0x94,0xa3,0, - 0xe7,0xb5,0xa8,0, - 0xe9,0x9c,0xa7,0, - 0xe4,0xb8,0x88,0, - 0xe6,0x9c,0xb5,0, - 0xe5,0xa7,0x86,0, - 0xe6,0x93,0xac,0, - 0xe5,0xae,0x87,0, - 0xe8,0xbc,0xaf,0, - 0xe9,0x99,0x9d,0, - 0xe9,0x9b,0x95,0, - 0xe5,0x84,0x9f,0, - 0xe8,0x93,0x84,0, - 0xe5,0xb4,0x87,0, - 0xe5,0x89,0xaa,0, - 0xe5,0x80,0xa1,0, - 0xe5,0xbb,0xb3,0, - 0xe5,0x92,0xac,0, - 0xe9,0xa7,0x9b,0, - 0xe8,0x96,0xaf,0, - 0xe5,0x88,0xb7,0, - 0xe6,0x96,0xa5,0, - 0xe7,0x95,0xaa,0, - 0xe8,0xb3,0xa6,0, - 0xe5,0xa5,0x89,0, - 0xe4,0xbd,0x9b,0, - 0xe6,0xbe,0x86,0, - 0xe6,0xbc,0xab,0, - 0xe6,0x9b,0xbc,0, - 0xe6,0x89,0x87,0, - 0xe9,0x88,0xa3,0, - 0xe6,0xa1,0x83,0, - 0xe6,0x89,0xb6,0, - 0xe4,0xbb,0x94,0, - 0xe8,0xbf,0x94,0, - 0xe4,0xbf,0x97,0, - 0xe8,0x99,0xa7,0, - 0xe8,0x85,0x94,0, - 0xe9,0x9e,0x8b,0, - 0xe6,0xa3,0xb1,0, - 0xe8,0xa6,0x86,0, - 0xe6,0xa1,0x86,0, - 0xe6,0x82,0x84,0, - 0xe5,0x8f,0x94,0, - 0xe6,0x92,0x9e,0, - 0xe9,0xa8,0x99,0, - 0xe5,0x8b,0x98,0, - 0xe6,0x97,0xba,0, - 0xe6,0xb2,0xb8,0, - 0xe5,0xad,0xa4,0, - 0xe5,0x90,0x90,0, - 0xe5,0xad,0x9f,0, - 0xe6,0xb8,0xa0,0, - 0xe5,0xb1,0x88,0, - 0xe7,0x96,0xbe,0, - 0xe5,0xa6,0x99,0, - 0xe6,0x83,0x9c,0, - 0xe4,0xbb,0xb0,0, - 0xe7,0x8b,0xa0,0, - 0xe8,0x84,0xb9,0, - 0xe8,0xab,0xa7,0, - 0xe6,0x8b,0x8b,0, - 0xe9,0xbb,0xb4,0, - 0xe6,0xa1,0x91,0, - 0xe5,0xb4,0x97,0, - 0xe5,0x98,0x9b,0, - 0xe8,0xa1,0xb0,0, - 0xe7,0x9b,0x9c,0, - 0xe6,0xbb,0xb2,0, - 0xe8,0x87,0x9f,0, - 0xe8,0xb3,0xb4,0, - 0xe6,0xb9,0xa7,0, - 0xe7,0x94,0x9c,0, - 0xe6,0x9b,0xb9,0, - 0xe9,0x96,0xb1,0, - 0xe8,0x82,0x8c,0, - 0xe5,0x93,0xa9,0, - 0xe5,0x8e,0xb2,0, - 0xe7,0x83,0xb4,0, - 0xe7,0xb7,0xaf,0, - 0xe6,0xaf,0x85,0, - 0xe6,0x98,0xa8,0, - 0xe5,0x81,0xbd,0, - 0xe7,0x97,0x87,0, - 0xe7,0x85,0xae,0, - 0xe5,0x98,0x86,0, - 0xe9,0x87,0x98,0, - 0xe6,0x90,0xad,0, - 0xe8,0x8e,0x96,0, - 0xe7,0xb1,0xa0,0, - 0xe9,0x85,0xb7,0, - 0xe5,0x81,0xb7,0, - 0xe5,0xbc,0x93,0, - 0xe9,0x8c,0x90,0, - 0xe6,0x81,0x86,0, - 0xe5,0x82,0x91,0, - 0xe5,0x9d,0x91,0, - 0xe9,0xbc,0xbb,0, - 0xe7,0xbf,0xbc,0, - 0xe7,0xb6,0xb8,0, - 0xe6,0x95,0x98,0, - 0xe7,0x8d,0x84,0, - 0xe9,0x80,0xae,0, - 0xe7,0xbd,0x90,0, - 0xe7,0xb5,0xa1,0, - 0xe6,0xa3,0x9a,0, - 0xe6,0x8a,0x91,0, - 0xe8,0x86,0xa8,0, - 0xe8,0x94,0xac,0, - 0xe5,0xaf,0xba,0, - 0xe9,0xa9,0x9f,0, - 0xe7,0xa9,0x86,0, - 0xe5,0x86,0xb6,0, - 0xe6,0x9e,0xaf,0, - 0xe5,0x86,0x8a,0, - 0xe5,0xb1,0x8d,0, - 0xe5,0x87,0xb8,0, - 0xe7,0xb4,0xb3,0, - 0xe5,0x9d,0xaf,0, - 0xe7,0x8a,0xa7,0, - 0xe7,0x84,0xb0,0, - 0xe8,0xbd,0x9f,0, - 0xe6,0xac,0xa3,0, - 0xe6,0x99,0x89,0, - 0xe7,0x98,0xa6,0, - 0xe7,0xa6,0xa6,0, - 0xe9,0x8c,0xa0,0, - 0xe9,0x8c,0xa6,0, - 0xe5,0x96,0xaa,0, - 0xe6,0x97,0xac,0, - 0xe9,0x8d,0x9b,0, - 0xe5,0xa3,0x9f,0, - 0xe6,0x90,0x9c,0, - 0xe6,0x92,0xb2,0, - 0xe9,0x82,0x80,0, - 0xe4,0xba,0xad,0, - 0xe9,0x85,0xaf,0, - 0xe9,0x82,0x81,0, - 0xe8,0x88,0x92,0, - 0xe8,0x84,0x86,0, - 0xe9,0x85,0xb6,0, - 0xe9,0x96,0x92,0, - 0xe6,0x86,0x82,0, - 0xe9,0x85,0x9a,0, - 0xe9,0xa0,0x91,0, - 0xe7,0xbe,0xbd,0, - 0xe6,0xbc,0xb2,0, - 0xe5,0x8d,0xb8,0, - 0xe4,0xbb,0x97,0, - 0xe9,0x99,0xaa,0, - 0xe9,0x97,0xa2,0, - 0xe6,0x87,0xb2,0, - 0xe6,0x9d,0xad,0, - 0xe5,0xa7,0x9a,0, - 0xe8,0x82,0x9a,0, - 0xe6,0x8d,0x89,0, - 0xe9,0xa3,0x84,0, - 0xe6,0xbc,0x82,0, - 0xe6,0x98,0x86,0, - 0xe6,0xac,0xba,0, - 0xe5,0x90,0xbe,0, - 0xe9,0x83,0x8e,0, - 0xe7,0x83,0xb7,0, - 0xe6,0xb1,0x81,0, - 0xe5,0x91,0xb5,0, - 0xe9,0xa3,0xbe,0, - 0xe8,0x95,0xad,0, - 0xe9,0x9b,0x85,0, - 0xe9,0x83,0xb5,0, - 0xe9,0x81,0xb7,0, - 0xe7,0x87,0x95,0, - 0xe6,0x92,0x92,0, - 0xe5,0xa7,0xbb,0, - 0xe8,0xb5,0xb4,0, - 0xe5,0xae,0xb4,0, - 0xe7,0x85,0xa9,0, - 0xe5,0x82,0xb5,0, - 0xe5,0xb8,0xb3,0, - 0xe6,0x96,0x91,0, - 0xe9,0x88,0xb4,0, - 0xe6,0x97,0xa8,0, - 0xe9,0x86,0x87,0, - 0xe8,0x91,0xa3,0, - 0xe9,0xa4,0x85,0, - 0xe9,0x9b,0x9b,0, - 0xe5,0xa7,0xbf,0, - 0xe6,0x8b,0x8c,0, - 0xe5,0x82,0x85,0, - 0xe8,0x85,0xb9,0, - 0xe5,0xa6,0xa5,0, - 0xe6,0x8f,0x89,0, - 0xe8,0xb3,0xa2,0, - 0xe6,0x8b,0x86,0, - 0xe6,0xad,0xaa,0, - 0xe8,0x91,0xa1,0, - 0xe8,0x83,0xba,0, - 0xe4,0xb8,0x9f,0, - 0xe6,0xb5,0xa9,0, - 0xe5,0xbe,0xbd,0, - 0xe6,0x98,0x82,0, - 0xe5,0xa2,0x8a,0, - 0xe6,0x93,0x8b,0, - 0xe8,0xa6,0xbd,0, - 0xe8,0xb2,0xaa,0, - 0xe6,0x85,0xb0,0, - 0xe7,0xb9,0xb3,0, - 0xe6,0xb1,0xaa,0, - 0xe6,0x85,0x8c,0, - 0xe9,0xa6,0xae,0, - 0xe8,0xab,0xbe,0, - 0xe5,0xa7,0x9c,0, - 0xe8,0xaa,0xbc,0, - 0xe5,0x85,0x87,0, - 0xe5,0x8a,0xa3,0, - 0xe8,0xaa,0xa3,0, - 0xe8,0x80,0x80,0, - 0xe6,0x98,0x8f,0, - 0xe8,0xba,0xba,0, - 0xe7,0x9b,0x88,0, - 0xe9,0xa8,0x8e,0, - 0xe5,0x96,0xac,0, - 0xe6,0xba,0xaa,0, - 0xe5,0x8f,0xa2,0, - 0xe7,0x9b,0xa7,0, - 0xe6,0x8a,0xb9,0, - 0xe6,0x82,0xb6,0, - 0xe8,0xab,0xae,0, - 0xe5,0x88,0xae,0, - 0xe9,0xa7,0x95,0, - 0xe7,0xba,0x9c,0, - 0xe6,0x82,0x9f,0, - 0xe6,0x91,0x98,0, - 0xe9,0x89,0xba,0, - 0xe6,0x93,0xb2,0, - 0xe9,0xa0,0x97,0, - 0xe5,0xb9,0xbb,0, - 0xe6,0x9f,0x84,0, - 0xe6,0x83,0xa0,0, - 0xe6,0x85,0x98,0, - 0xe4,0xbd,0xb3,0, - 0xe4,0xbb,0x87,0, - 0xe8,0x87,0x98,0, - 0xe7,0xaa,0xa9,0, - 0xe6,0xbb,0x8c,0, - 0xe5,0x8a,0x8d,0, - 0xe7,0x9e,0xa7,0, - 0xe5,0xa0,0xa1,0, - 0xe6,0xbd,0x91,0, - 0xe8,0x94,0xa5,0, - 0xe7,0xbd,0xa9,0, - 0xe9,0x9c,0x8d,0, - 0xe6,0x92,0x88,0, - 0xe8,0x83,0x8e,0, - 0xe8,0x92,0xbc,0, - 0xe6,0xbf,0xb1,0, - 0xe5,0x80,0x86,0, - 0xe6,0x8d,0x85,0, - 0xe6,0xb9,0x98,0, - 0xe7,0xa0,0x8d,0, - 0xe9,0x9c,0x9e,0, - 0xe9,0x82,0xb5,0, - 0xe8,0x90,0x84,0, - 0xe7,0x98,0x8b,0, - 0xe6,0xb7,0xae,0, - 0xe9,0x81,0x82,0, - 0xe7,0x86,0x8a,0, - 0xe7,0xb3,0x9e,0, - 0xe7,0x83,0x98,0, - 0xe5,0xae,0xbf,0, - 0xe6,0xaa,0x94,0, - 0xe6,0x88,0x88,0, - 0xe9,0xa7,0x81,0, - 0xe5,0xab,0x82,0, - 0xe8,0xa3,0x95,0, - 0xe5,0xbe,0x99,0, - 0xe7,0xae,0xad,0, - 0xe6,0x8d,0x90,0, - 0xe8,0x85,0xb8,0, - 0xe6,0x92,0x90,0, - 0xe6,0x9b,0xac,0, - 0xe8,0xbe,0xa8,0, - 0xe6,0xae,0xbf,0, - 0xe8,0x93,0xae,0, - 0xe6,0x94,0xa4,0, - 0xe6,0x94,0xaa,0, - 0xe9,0x86,0xac,0, - 0xe5,0xb1,0x8f,0, - 0xe7,0x96,0xab,0, - 0xe5,0x93,0x80,0, - 0xe8,0x94,0xa1,0, - 0xe5,0xa0,0xb5,0, - 0xe6,0xb2,0xab,0, - 0xe7,0x9a,0xba,0, - 0xe6,0x9a,0xa2,0, - 0xe7,0x96,0x8a,0, - 0xe9,0x96,0xa3,0, - 0xe8,0x90,0x8a,0, - 0xe6,0x95,0xb2,0, - 0xe8,0xbd,0x84,0, - 0xe9,0x89,0xa4,0, - 0xe7,0x97,0x95,0, - 0xe5,0xa3,0xa9,0, - 0xe5,0xb7,0xb7,0, - 0xe9,0xa4,0x93,0, - 0xe7,0xa6,0x8d,0, - 0xe4,0xb8,0x98,0, - 0xe7,0x8e,0x84,0, - 0xe6,0xba,0x9c,0, - 0xe6,0x9b,0xb0,0, - 0xe9,0x82,0x8f,0, - 0xe5,0xbd,0xad,0, - 0xe5,0x98,0x97,0, - 0xe5,0x8d,0xbf,0, - 0xe5,0xa6,0xa8,0, - 0xe8,0x89,0x87,0, - 0xe5,0x90,0x9e,0, - 0xe9,0x9f,0x8b,0, - 0xe6,0x80,0xa8,0, - 0xe7,0x9f,0xae,0, - 0xe6,0xad,0x87,0, -}; -#define zht ((const char*)zht_) -static const char *zht_i[] = { - zht+0, zht+4, zht+8, zht+12, zht+16, zht+20, - zht+24, zht+28, zht+32, zht+36, zht+40, zht+44, - zht+48, zht+52, zht+56, zht+60, zht+64, zht+68, - zht+72, zht+76, zht+80, zht+84, zht+88, zht+92, - zht+96, zht+100, zht+104, zht+108, zht+112, zht+116, - zht+120, zht+124, zht+128, zht+132, zht+136, zht+140, - zht+144, zht+148, zht+152, zht+156, zht+160, zht+164, - zht+168, zht+172, zht+176, zht+180, zht+184, zht+188, - zht+192, zht+196, zht+200, zht+204, zht+208, zht+212, - zht+216, zht+220, zht+224, zht+228, zht+232, zht+236, - zht+240, zht+244, zht+248, zht+252, zht+256, zht+260, - zht+264, zht+268, zht+272, zht+276, zht+280, zht+284, - zht+288, zht+292, zht+296, zht+300, zht+304, zht+308, - zht+312, zht+316, zht+320, zht+324, zht+328, zht+332, - zht+336, zht+340, zht+344, zht+348, zht+352, zht+356, - zht+360, zht+364, zht+368, zht+372, zht+376, zht+380, - zht+384, zht+388, zht+392, zht+396, zht+400, zht+404, - zht+408, zht+412, zht+416, zht+420, zht+424, zht+428, - zht+432, zht+436, zht+440, zht+444, zht+448, zht+452, - zht+456, zht+460, zht+464, zht+468, zht+472, zht+476, - zht+480, zht+484, zht+488, zht+492, zht+496, zht+500, - zht+504, zht+508, zht+512, zht+516, zht+520, zht+524, - zht+528, zht+532, zht+536, zht+540, zht+544, zht+548, - zht+552, zht+556, zht+560, zht+564, zht+568, zht+572, - zht+576, zht+580, zht+584, zht+588, zht+592, zht+596, - zht+600, zht+604, zht+608, zht+612, zht+616, zht+620, - zht+624, zht+628, zht+632, zht+636, zht+640, zht+644, - zht+648, zht+652, zht+656, zht+660, zht+664, zht+668, - zht+672, zht+676, zht+680, zht+684, zht+688, zht+692, - zht+696, zht+700, zht+704, zht+708, zht+712, zht+716, - zht+720, zht+724, zht+728, zht+732, zht+736, zht+740, - zht+744, zht+748, zht+752, zht+756, zht+760, zht+764, - zht+768, zht+772, zht+776, zht+780, zht+784, zht+788, - zht+792, zht+796, zht+800, zht+804, zht+808, zht+812, - zht+816, zht+820, zht+824, zht+828, zht+832, zht+836, - zht+840, zht+844, zht+848, zht+852, zht+856, zht+860, - zht+864, zht+868, zht+872, zht+876, zht+880, zht+884, - zht+888, zht+892, zht+896, zht+900, zht+904, zht+908, - zht+912, zht+916, zht+920, zht+924, zht+928, zht+932, - zht+936, zht+940, zht+944, zht+948, zht+952, zht+956, - zht+960, zht+964, zht+968, zht+972, zht+976, zht+980, - zht+984, zht+988, zht+992, zht+996, zht+1000, zht+1004, - zht+1008, zht+1012, zht+1016, zht+1020, zht+1024, zht+1028, - zht+1032, zht+1036, zht+1040, zht+1044, zht+1048, zht+1052, - zht+1056, zht+1060, zht+1064, zht+1068, zht+1072, zht+1076, - zht+1080, zht+1084, zht+1088, zht+1092, zht+1096, zht+1100, - zht+1104, zht+1108, zht+1112, zht+1116, zht+1120, zht+1124, - zht+1128, zht+1132, zht+1136, zht+1140, zht+1144, zht+1148, - zht+1152, zht+1156, zht+1160, zht+1164, zht+1168, zht+1172, - zht+1176, zht+1180, zht+1184, zht+1188, zht+1192, zht+1196, - zht+1200, zht+1204, zht+1208, zht+1212, zht+1216, zht+1220, - zht+1224, zht+1228, zht+1232, zht+1236, zht+1240, zht+1244, - zht+1248, zht+1252, zht+1256, zht+1260, zht+1264, zht+1268, - zht+1272, zht+1276, zht+1280, zht+1284, zht+1288, zht+1292, - zht+1296, zht+1300, zht+1304, zht+1308, zht+1312, zht+1316, - zht+1320, zht+1324, zht+1328, zht+1332, zht+1336, zht+1340, - zht+1344, zht+1348, zht+1352, zht+1356, zht+1360, zht+1364, - zht+1368, zht+1372, zht+1376, zht+1380, zht+1384, zht+1388, - zht+1392, zht+1396, zht+1400, zht+1404, zht+1408, zht+1412, - zht+1416, zht+1420, zht+1424, zht+1428, zht+1432, zht+1436, - zht+1440, zht+1444, zht+1448, zht+1452, zht+1456, zht+1460, - zht+1464, zht+1468, zht+1472, zht+1476, zht+1480, zht+1484, - zht+1488, zht+1492, zht+1496, zht+1500, zht+1504, zht+1508, - zht+1512, zht+1516, zht+1520, zht+1524, zht+1528, zht+1532, - zht+1536, zht+1540, zht+1544, zht+1548, zht+1552, zht+1556, - zht+1560, zht+1564, zht+1568, zht+1572, zht+1576, zht+1580, - zht+1584, zht+1588, zht+1592, zht+1596, zht+1600, zht+1604, - zht+1608, zht+1612, zht+1616, zht+1620, zht+1624, zht+1628, - zht+1632, zht+1636, zht+1640, zht+1644, zht+1648, zht+1652, - zht+1656, zht+1660, zht+1664, zht+1668, zht+1672, zht+1676, - zht+1680, zht+1684, zht+1688, zht+1692, zht+1696, zht+1700, - zht+1704, zht+1708, zht+1712, zht+1716, zht+1720, zht+1724, - zht+1728, zht+1732, zht+1736, zht+1740, zht+1744, zht+1748, - zht+1752, zht+1756, zht+1760, zht+1764, zht+1768, zht+1772, - zht+1776, zht+1780, zht+1784, zht+1788, zht+1792, zht+1796, - zht+1800, zht+1804, zht+1808, zht+1812, zht+1816, zht+1820, - zht+1824, zht+1828, zht+1832, zht+1836, zht+1840, zht+1844, - zht+1848, zht+1852, zht+1856, zht+1860, zht+1864, zht+1868, - zht+1872, zht+1876, zht+1880, zht+1884, zht+1888, zht+1892, - zht+1896, zht+1900, zht+1904, zht+1908, zht+1912, zht+1916, - zht+1920, zht+1924, zht+1928, zht+1932, zht+1936, zht+1940, - zht+1944, zht+1948, zht+1952, zht+1956, zht+1960, zht+1964, - zht+1968, zht+1972, zht+1976, zht+1980, zht+1984, zht+1988, - zht+1992, zht+1996, zht+2000, zht+2004, zht+2008, zht+2012, - zht+2016, zht+2020, zht+2024, zht+2028, zht+2032, zht+2036, - zht+2040, zht+2044, zht+2048, zht+2052, zht+2056, zht+2060, - zht+2064, zht+2068, zht+2072, zht+2076, zht+2080, zht+2084, - zht+2088, zht+2092, zht+2096, zht+2100, zht+2104, zht+2108, - zht+2112, zht+2116, zht+2120, zht+2124, zht+2128, zht+2132, - zht+2136, zht+2140, zht+2144, zht+2148, zht+2152, zht+2156, - zht+2160, zht+2164, zht+2168, zht+2172, zht+2176, zht+2180, - zht+2184, zht+2188, zht+2192, zht+2196, zht+2200, zht+2204, - zht+2208, zht+2212, zht+2216, zht+2220, zht+2224, zht+2228, - zht+2232, zht+2236, zht+2240, zht+2244, zht+2248, zht+2252, - zht+2256, zht+2260, zht+2264, zht+2268, zht+2272, zht+2276, - zht+2280, zht+2284, zht+2288, zht+2292, zht+2296, zht+2300, - zht+2304, zht+2308, zht+2312, zht+2316, zht+2320, zht+2324, - zht+2328, zht+2332, zht+2336, zht+2340, zht+2344, zht+2348, - zht+2352, zht+2356, zht+2360, zht+2364, zht+2368, zht+2372, - zht+2376, zht+2380, zht+2384, zht+2388, zht+2392, zht+2396, - zht+2400, zht+2404, zht+2408, zht+2412, zht+2416, zht+2420, - zht+2424, zht+2428, zht+2432, zht+2436, zht+2440, zht+2444, - zht+2448, zht+2452, zht+2456, zht+2460, zht+2464, zht+2468, - zht+2472, zht+2476, zht+2480, zht+2484, zht+2488, zht+2492, - zht+2496, zht+2500, zht+2504, zht+2508, zht+2512, zht+2516, - zht+2520, zht+2524, zht+2528, zht+2532, zht+2536, zht+2540, - zht+2544, zht+2548, zht+2552, zht+2556, zht+2560, zht+2564, - zht+2568, zht+2572, zht+2576, zht+2580, zht+2584, zht+2588, - zht+2592, zht+2596, zht+2600, zht+2604, zht+2608, zht+2612, - zht+2616, zht+2620, zht+2624, zht+2628, zht+2632, zht+2636, - zht+2640, zht+2644, zht+2648, zht+2652, zht+2656, zht+2660, - zht+2664, zht+2668, zht+2672, zht+2676, zht+2680, zht+2684, - zht+2688, zht+2692, zht+2696, zht+2700, zht+2704, zht+2708, - zht+2712, zht+2716, zht+2720, zht+2724, zht+2728, zht+2732, - zht+2736, zht+2740, zht+2744, zht+2748, zht+2752, zht+2756, - zht+2760, zht+2764, zht+2768, zht+2772, zht+2776, zht+2780, - zht+2784, zht+2788, zht+2792, zht+2796, zht+2800, zht+2804, - zht+2808, zht+2812, zht+2816, zht+2820, zht+2824, zht+2828, - zht+2832, zht+2836, zht+2840, zht+2844, zht+2848, zht+2852, - zht+2856, zht+2860, zht+2864, zht+2868, zht+2872, zht+2876, - zht+2880, zht+2884, zht+2888, zht+2892, zht+2896, zht+2900, - zht+2904, zht+2908, zht+2912, zht+2916, zht+2920, zht+2924, - zht+2928, zht+2932, zht+2936, zht+2940, zht+2944, zht+2948, - zht+2952, zht+2956, zht+2960, zht+2964, zht+2968, zht+2972, - zht+2976, zht+2980, zht+2984, zht+2988, zht+2992, zht+2996, - zht+3000, zht+3004, zht+3008, zht+3012, zht+3016, zht+3020, - zht+3024, zht+3028, zht+3032, zht+3036, zht+3040, zht+3044, - zht+3048, zht+3052, zht+3056, zht+3060, zht+3064, zht+3068, - zht+3072, zht+3076, zht+3080, zht+3084, zht+3088, zht+3092, - zht+3096, zht+3100, zht+3104, zht+3108, zht+3112, zht+3116, - zht+3120, zht+3124, zht+3128, zht+3132, zht+3136, zht+3140, - zht+3144, zht+3148, zht+3152, zht+3156, zht+3160, zht+3164, - zht+3168, zht+3172, zht+3176, zht+3180, zht+3184, zht+3188, - zht+3192, zht+3196, zht+3200, zht+3204, zht+3208, zht+3212, - zht+3216, zht+3220, zht+3224, zht+3228, zht+3232, zht+3236, - zht+3240, zht+3244, zht+3248, zht+3252, zht+3256, zht+3260, - zht+3264, zht+3268, zht+3272, zht+3276, zht+3280, zht+3284, - zht+3288, zht+3292, zht+3296, zht+3300, zht+3304, zht+3308, - zht+3312, zht+3316, zht+3320, zht+3324, zht+3328, zht+3332, - zht+3336, zht+3340, zht+3344, zht+3348, zht+3352, zht+3356, - zht+3360, zht+3364, zht+3368, zht+3372, zht+3376, zht+3380, - zht+3384, zht+3388, zht+3392, zht+3396, zht+3400, zht+3404, - zht+3408, zht+3412, zht+3416, zht+3420, zht+3424, zht+3428, - zht+3432, zht+3436, zht+3440, zht+3444, zht+3448, zht+3452, - zht+3456, zht+3460, zht+3464, zht+3468, zht+3472, zht+3476, - zht+3480, zht+3484, zht+3488, zht+3492, zht+3496, zht+3500, - zht+3504, zht+3508, zht+3512, zht+3516, zht+3520, zht+3524, - zht+3528, zht+3532, zht+3536, zht+3540, zht+3544, zht+3548, - zht+3552, zht+3556, zht+3560, zht+3564, zht+3568, zht+3572, - zht+3576, zht+3580, zht+3584, zht+3588, zht+3592, zht+3596, - zht+3600, zht+3604, zht+3608, zht+3612, zht+3616, zht+3620, - zht+3624, zht+3628, zht+3632, zht+3636, zht+3640, zht+3644, - zht+3648, zht+3652, zht+3656, zht+3660, zht+3664, zht+3668, - zht+3672, zht+3676, zht+3680, zht+3684, zht+3688, zht+3692, - zht+3696, zht+3700, zht+3704, zht+3708, zht+3712, zht+3716, - zht+3720, zht+3724, zht+3728, zht+3732, zht+3736, zht+3740, - zht+3744, zht+3748, zht+3752, zht+3756, zht+3760, zht+3764, - zht+3768, zht+3772, zht+3776, zht+3780, zht+3784, zht+3788, - zht+3792, zht+3796, zht+3800, zht+3804, zht+3808, zht+3812, - zht+3816, zht+3820, zht+3824, zht+3828, zht+3832, zht+3836, - zht+3840, zht+3844, zht+3848, zht+3852, zht+3856, zht+3860, - zht+3864, zht+3868, zht+3872, zht+3876, zht+3880, zht+3884, - zht+3888, zht+3892, zht+3896, zht+3900, zht+3904, zht+3908, - zht+3912, zht+3916, zht+3920, zht+3924, zht+3928, zht+3932, - zht+3936, zht+3940, zht+3944, zht+3948, zht+3952, zht+3956, - zht+3960, zht+3964, zht+3968, zht+3972, zht+3976, zht+3980, - zht+3984, zht+3988, zht+3992, zht+3996, zht+4000, zht+4004, - zht+4008, zht+4012, zht+4016, zht+4020, zht+4024, zht+4028, - zht+4032, zht+4036, zht+4040, zht+4044, zht+4048, zht+4052, - zht+4056, zht+4060, zht+4064, zht+4068, zht+4072, zht+4076, - zht+4080, zht+4084, zht+4088, zht+4092, zht+4096, zht+4100, - zht+4104, zht+4108, zht+4112, zht+4116, zht+4120, zht+4124, - zht+4128, zht+4132, zht+4136, zht+4140, zht+4144, zht+4148, - zht+4152, zht+4156, zht+4160, zht+4164, zht+4168, zht+4172, - zht+4176, zht+4180, zht+4184, zht+4188, zht+4192, zht+4196, - zht+4200, zht+4204, zht+4208, zht+4212, zht+4216, zht+4220, - zht+4224, zht+4228, zht+4232, zht+4236, zht+4240, zht+4244, - zht+4248, zht+4252, zht+4256, zht+4260, zht+4264, zht+4268, - zht+4272, zht+4276, zht+4280, zht+4284, zht+4288, zht+4292, - zht+4296, zht+4300, zht+4304, zht+4308, zht+4312, zht+4316, - zht+4320, zht+4324, zht+4328, zht+4332, zht+4336, zht+4340, - zht+4344, zht+4348, zht+4352, zht+4356, zht+4360, zht+4364, - zht+4368, zht+4372, zht+4376, zht+4380, zht+4384, zht+4388, - zht+4392, zht+4396, zht+4400, zht+4404, zht+4408, zht+4412, - zht+4416, zht+4420, zht+4424, zht+4428, zht+4432, zht+4436, - zht+4440, zht+4444, zht+4448, zht+4452, zht+4456, zht+4460, - zht+4464, zht+4468, zht+4472, zht+4476, zht+4480, zht+4484, - zht+4488, zht+4492, zht+4496, zht+4500, zht+4504, zht+4508, - zht+4512, zht+4516, zht+4520, zht+4524, zht+4528, zht+4532, - zht+4536, zht+4540, zht+4544, zht+4548, zht+4552, zht+4556, - zht+4560, zht+4564, zht+4568, zht+4572, zht+4576, zht+4580, - zht+4584, zht+4588, zht+4592, zht+4596, zht+4600, zht+4604, - zht+4608, zht+4612, zht+4616, zht+4620, zht+4624, zht+4628, - zht+4632, zht+4636, zht+4640, zht+4644, zht+4648, zht+4652, - zht+4656, zht+4660, zht+4664, zht+4668, zht+4672, zht+4676, - zht+4680, zht+4684, zht+4688, zht+4692, zht+4696, zht+4700, - zht+4704, zht+4708, zht+4712, zht+4716, zht+4720, zht+4724, - zht+4728, zht+4732, zht+4736, zht+4740, zht+4744, zht+4748, - zht+4752, zht+4756, zht+4760, zht+4764, zht+4768, zht+4772, - zht+4776, zht+4780, zht+4784, zht+4788, zht+4792, zht+4796, - zht+4800, zht+4804, zht+4808, zht+4812, zht+4816, zht+4820, - zht+4824, zht+4828, zht+4832, zht+4836, zht+4840, zht+4844, - zht+4848, zht+4852, zht+4856, zht+4860, zht+4864, zht+4868, - zht+4872, zht+4876, zht+4880, zht+4884, zht+4888, zht+4892, - zht+4896, zht+4900, zht+4904, zht+4908, zht+4912, zht+4916, - zht+4920, zht+4924, zht+4928, zht+4932, zht+4936, zht+4940, - zht+4944, zht+4948, zht+4952, zht+4956, zht+4960, zht+4964, - zht+4968, zht+4972, zht+4976, zht+4980, zht+4984, zht+4988, - zht+4992, zht+4996, zht+5000, zht+5004, zht+5008, zht+5012, - zht+5016, zht+5020, zht+5024, zht+5028, zht+5032, zht+5036, - zht+5040, zht+5044, zht+5048, zht+5052, zht+5056, zht+5060, - zht+5064, zht+5068, zht+5072, zht+5076, zht+5080, zht+5084, - zht+5088, zht+5092, zht+5096, zht+5100, zht+5104, zht+5108, - zht+5112, zht+5116, zht+5120, zht+5124, zht+5128, zht+5132, - zht+5136, zht+5140, zht+5144, zht+5148, zht+5152, zht+5156, - zht+5160, zht+5164, zht+5168, zht+5172, zht+5176, zht+5180, - zht+5184, zht+5188, zht+5192, zht+5196, zht+5200, zht+5204, - zht+5208, zht+5212, zht+5216, zht+5220, zht+5224, zht+5228, - zht+5232, zht+5236, zht+5240, zht+5244, zht+5248, zht+5252, - zht+5256, zht+5260, zht+5264, zht+5268, zht+5272, zht+5276, - zht+5280, zht+5284, zht+5288, zht+5292, zht+5296, zht+5300, - zht+5304, zht+5308, zht+5312, zht+5316, zht+5320, zht+5324, - zht+5328, zht+5332, zht+5336, zht+5340, zht+5344, zht+5348, - zht+5352, zht+5356, zht+5360, zht+5364, zht+5368, zht+5372, - zht+5376, zht+5380, zht+5384, zht+5388, zht+5392, zht+5396, - zht+5400, zht+5404, zht+5408, zht+5412, zht+5416, zht+5420, - zht+5424, zht+5428, zht+5432, zht+5436, zht+5440, zht+5444, - zht+5448, zht+5452, zht+5456, zht+5460, zht+5464, zht+5468, - zht+5472, zht+5476, zht+5480, zht+5484, zht+5488, zht+5492, - zht+5496, zht+5500, zht+5504, zht+5508, zht+5512, zht+5516, - zht+5520, zht+5524, zht+5528, zht+5532, zht+5536, zht+5540, - zht+5544, zht+5548, zht+5552, zht+5556, zht+5560, zht+5564, - zht+5568, zht+5572, zht+5576, zht+5580, zht+5584, zht+5588, - zht+5592, zht+5596, zht+5600, zht+5604, zht+5608, zht+5612, - zht+5616, zht+5620, zht+5624, zht+5628, zht+5632, zht+5636, - zht+5640, zht+5644, zht+5648, zht+5652, zht+5656, zht+5660, - zht+5664, zht+5668, zht+5672, zht+5676, zht+5680, zht+5684, - zht+5688, zht+5692, zht+5696, zht+5700, zht+5704, zht+5708, - zht+5712, zht+5716, zht+5720, zht+5724, zht+5728, zht+5732, - zht+5736, zht+5740, zht+5744, zht+5748, zht+5752, zht+5756, - zht+5760, zht+5764, zht+5768, zht+5772, zht+5776, zht+5780, - zht+5784, zht+5788, zht+5792, zht+5796, zht+5800, zht+5804, - zht+5808, zht+5812, zht+5816, zht+5820, zht+5824, zht+5828, - zht+5832, zht+5836, zht+5840, zht+5844, zht+5848, zht+5852, - zht+5856, zht+5860, zht+5864, zht+5868, zht+5872, zht+5876, - zht+5880, zht+5884, zht+5888, zht+5892, zht+5896, zht+5900, - zht+5904, zht+5908, zht+5912, zht+5916, zht+5920, zht+5924, - zht+5928, zht+5932, zht+5936, zht+5940, zht+5944, zht+5948, - zht+5952, zht+5956, zht+5960, zht+5964, zht+5968, zht+5972, - zht+5976, zht+5980, zht+5984, zht+5988, zht+5992, zht+5996, - zht+6000, zht+6004, zht+6008, zht+6012, zht+6016, zht+6020, - zht+6024, zht+6028, zht+6032, zht+6036, zht+6040, zht+6044, - zht+6048, zht+6052, zht+6056, zht+6060, zht+6064, zht+6068, - zht+6072, zht+6076, zht+6080, zht+6084, zht+6088, zht+6092, - zht+6096, zht+6100, zht+6104, zht+6108, zht+6112, zht+6116, - zht+6120, zht+6124, zht+6128, zht+6132, zht+6136, zht+6140, - zht+6144, zht+6148, zht+6152, zht+6156, zht+6160, zht+6164, - zht+6168, zht+6172, zht+6176, zht+6180, zht+6184, zht+6188, - zht+6192, zht+6196, zht+6200, zht+6204, zht+6208, zht+6212, - zht+6216, zht+6220, zht+6224, zht+6228, zht+6232, zht+6236, - zht+6240, zht+6244, zht+6248, zht+6252, zht+6256, zht+6260, - zht+6264, zht+6268, zht+6272, zht+6276, zht+6280, zht+6284, - zht+6288, zht+6292, zht+6296, zht+6300, zht+6304, zht+6308, - zht+6312, zht+6316, zht+6320, zht+6324, zht+6328, zht+6332, - zht+6336, zht+6340, zht+6344, zht+6348, zht+6352, zht+6356, - zht+6360, zht+6364, zht+6368, zht+6372, zht+6376, zht+6380, - zht+6384, zht+6388, zht+6392, zht+6396, zht+6400, zht+6404, - zht+6408, zht+6412, zht+6416, zht+6420, zht+6424, zht+6428, - zht+6432, zht+6436, zht+6440, zht+6444, zht+6448, zht+6452, - zht+6456, zht+6460, zht+6464, zht+6468, zht+6472, zht+6476, - zht+6480, zht+6484, zht+6488, zht+6492, zht+6496, zht+6500, - zht+6504, zht+6508, zht+6512, zht+6516, zht+6520, zht+6524, - zht+6528, zht+6532, zht+6536, zht+6540, zht+6544, zht+6548, - zht+6552, zht+6556, zht+6560, zht+6564, zht+6568, zht+6572, - zht+6576, zht+6580, zht+6584, zht+6588, zht+6592, zht+6596, - zht+6600, zht+6604, zht+6608, zht+6612, zht+6616, zht+6620, - zht+6624, zht+6628, zht+6632, zht+6636, zht+6640, zht+6644, - zht+6648, zht+6652, zht+6656, zht+6660, zht+6664, zht+6668, - zht+6672, zht+6676, zht+6680, zht+6684, zht+6688, zht+6692, - zht+6696, zht+6700, zht+6704, zht+6708, zht+6712, zht+6716, - zht+6720, zht+6724, zht+6728, zht+6732, zht+6736, zht+6740, - zht+6744, zht+6748, zht+6752, zht+6756, zht+6760, zht+6764, - zht+6768, zht+6772, zht+6776, zht+6780, zht+6784, zht+6788, - zht+6792, zht+6796, zht+6800, zht+6804, zht+6808, zht+6812, - zht+6816, zht+6820, zht+6824, zht+6828, zht+6832, zht+6836, - zht+6840, zht+6844, zht+6848, zht+6852, zht+6856, zht+6860, - zht+6864, zht+6868, zht+6872, zht+6876, zht+6880, zht+6884, - zht+6888, zht+6892, zht+6896, zht+6900, zht+6904, zht+6908, - zht+6912, zht+6916, zht+6920, zht+6924, zht+6928, zht+6932, - zht+6936, zht+6940, zht+6944, zht+6948, zht+6952, zht+6956, - zht+6960, zht+6964, zht+6968, zht+6972, zht+6976, zht+6980, - zht+6984, zht+6988, zht+6992, zht+6996, zht+7000, zht+7004, - zht+7008, zht+7012, zht+7016, zht+7020, zht+7024, zht+7028, - zht+7032, zht+7036, zht+7040, zht+7044, zht+7048, zht+7052, - zht+7056, zht+7060, zht+7064, zht+7068, zht+7072, zht+7076, - zht+7080, zht+7084, zht+7088, zht+7092, zht+7096, zht+7100, - zht+7104, zht+7108, zht+7112, zht+7116, zht+7120, zht+7124, - zht+7128, zht+7132, zht+7136, zht+7140, zht+7144, zht+7148, - zht+7152, zht+7156, zht+7160, zht+7164, zht+7168, zht+7172, - zht+7176, zht+7180, zht+7184, zht+7188, zht+7192, zht+7196, - zht+7200, zht+7204, zht+7208, zht+7212, zht+7216, zht+7220, - zht+7224, zht+7228, zht+7232, zht+7236, zht+7240, zht+7244, - zht+7248, zht+7252, zht+7256, zht+7260, zht+7264, zht+7268, - zht+7272, zht+7276, zht+7280, zht+7284, zht+7288, zht+7292, - zht+7296, zht+7300, zht+7304, zht+7308, zht+7312, zht+7316, - zht+7320, zht+7324, zht+7328, zht+7332, zht+7336, zht+7340, - zht+7344, zht+7348, zht+7352, zht+7356, zht+7360, zht+7364, - zht+7368, zht+7372, zht+7376, zht+7380, zht+7384, zht+7388, - zht+7392, zht+7396, zht+7400, zht+7404, zht+7408, zht+7412, - zht+7416, zht+7420, zht+7424, zht+7428, zht+7432, zht+7436, - zht+7440, zht+7444, zht+7448, zht+7452, zht+7456, zht+7460, - zht+7464, zht+7468, zht+7472, zht+7476, zht+7480, zht+7484, - zht+7488, zht+7492, zht+7496, zht+7500, zht+7504, zht+7508, - zht+7512, zht+7516, zht+7520, zht+7524, zht+7528, zht+7532, - zht+7536, zht+7540, zht+7544, zht+7548, zht+7552, zht+7556, - zht+7560, zht+7564, zht+7568, zht+7572, zht+7576, zht+7580, - zht+7584, zht+7588, zht+7592, zht+7596, zht+7600, zht+7604, - zht+7608, zht+7612, zht+7616, zht+7620, zht+7624, zht+7628, - zht+7632, zht+7636, zht+7640, zht+7644, zht+7648, zht+7652, - zht+7656, zht+7660, zht+7664, zht+7668, zht+7672, zht+7676, - zht+7680, zht+7684, zht+7688, zht+7692, zht+7696, zht+7700, - zht+7704, zht+7708, zht+7712, zht+7716, zht+7720, zht+7724, - zht+7728, zht+7732, zht+7736, zht+7740, zht+7744, zht+7748, - zht+7752, zht+7756, zht+7760, zht+7764, zht+7768, zht+7772, - zht+7776, zht+7780, zht+7784, zht+7788, zht+7792, zht+7796, - zht+7800, zht+7804, zht+7808, zht+7812, zht+7816, zht+7820, - zht+7824, zht+7828, zht+7832, zht+7836, zht+7840, zht+7844, - zht+7848, zht+7852, zht+7856, zht+7860, zht+7864, zht+7868, - zht+7872, zht+7876, zht+7880, zht+7884, zht+7888, zht+7892, - zht+7896, zht+7900, zht+7904, zht+7908, zht+7912, zht+7916, - zht+7920, zht+7924, zht+7928, zht+7932, zht+7936, zht+7940, - zht+7944, zht+7948, zht+7952, zht+7956, zht+7960, zht+7964, - zht+7968, zht+7972, zht+7976, zht+7980, zht+7984, zht+7988, - zht+7992, zht+7996, zht+8000, zht+8004, zht+8008, zht+8012, - zht+8016, zht+8020, zht+8024, zht+8028, zht+8032, zht+8036, - zht+8040, zht+8044, zht+8048, zht+8052, zht+8056, zht+8060, - zht+8064, zht+8068, zht+8072, zht+8076, zht+8080, zht+8084, - zht+8088, zht+8092, zht+8096, zht+8100, zht+8104, zht+8108, - zht+8112, zht+8116, zht+8120, zht+8124, zht+8128, zht+8132, - zht+8136, zht+8140, zht+8144, zht+8148, zht+8152, zht+8156, - zht+8160, zht+8164, zht+8168, zht+8172, zht+8176, zht+8180, - zht+8184, zht+8188, zht+8192, - }; -#undef zht - -static const struct words zht_words = { - 2048, - 11, - false, - (const char *)zht_, - 0, /* Constant string */ - zht_i -}; diff --git a/external/libwally-core/src/data/wordlists/chinese_traditional.txt b/external/libwally-core/src/data/wordlists/chinese_traditional.txt deleted file mode 100644 index 9b0204792..000000000 --- a/external/libwally-core/src/data/wordlists/chinese_traditional.txt +++ /dev/null @@ -1,2048 +0,0 @@ -的 -一 -是 -在 -不 -了 -有 -和 -人 -這 -中 -大 -為 -上 -個 -國 -我 -以 -要 -他 -時 -來 -用 -們 -生 -到 -作 -地 -於 -出 -就 -分 -對 -成 -會 -可 -主 -發 -年 -動 -同 -工 -也 -能 -下 -過 -子 -說 -產 -種 -面 -而 -方 -後 -多 -定 -行 -學 -法 -所 -民 -得 -經 -十 -三 -之 -進 -著 -等 -部 -度 -家 -電 -力 -裡 -如 -水 -化 -高 -自 -二 -理 -起 -小 -物 -現 -實 -加 -量 -都 -兩 -體 -制 -機 -當 -使 -點 -從 -業 -本 -去 -把 -性 -好 -應 -開 -它 -合 -還 -因 -由 -其 -些 -然 -前 -外 -天 -政 -四 -日 -那 -社 -義 -事 -平 -形 -相 -全 -表 -間 -樣 -與 -關 -各 -重 -新 -線 -內 -數 -正 -心 -反 -你 -明 -看 -原 -又 -麼 -利 -比 -或 -但 -質 -氣 -第 -向 -道 -命 -此 -變 -條 -只 -沒 -結 -解 -問 -意 -建 -月 -公 -無 -系 -軍 -很 -情 -者 -最 -立 -代 -想 -已 -通 -並 -提 -直 -題 -黨 -程 -展 -五 -果 -料 -象 -員 -革 -位 -入 -常 -文 -總 -次 -品 -式 -活 -設 -及 -管 -特 -件 -長 -求 -老 -頭 -基 -資 -邊 -流 -路 -級 -少 -圖 -山 -統 -接 -知 -較 -將 -組 -見 -計 -別 -她 -手 -角 -期 -根 -論 -運 -農 -指 -幾 -九 -區 -強 -放 -決 -西 -被 -幹 -做 -必 -戰 -先 -回 -則 -任 -取 -據 -處 -隊 -南 -給 -色 -光 -門 -即 -保 -治 -北 -造 -百 -規 -熱 -領 -七 -海 -口 -東 -導 -器 -壓 -志 -世 -金 -增 -爭 -濟 -階 -油 -思 -術 -極 -交 -受 -聯 -什 -認 -六 -共 -權 -收 -證 -改 -清 -美 -再 -採 -轉 -更 -單 -風 -切 -打 -白 -教 -速 -花 -帶 -安 -場 -身 -車 -例 -真 -務 -具 -萬 -每 -目 -至 -達 -走 -積 -示 -議 -聲 -報 -鬥 -完 -類 -八 -離 -華 -名 -確 -才 -科 -張 -信 -馬 -節 -話 -米 -整 -空 -元 -況 -今 -集 -溫 -傳 -土 -許 -步 -群 -廣 -石 -記 -需 -段 -研 -界 -拉 -林 -律 -叫 -且 -究 -觀 -越 -織 -裝 -影 -算 -低 -持 -音 -眾 -書 -布 -复 -容 -兒 -須 -際 -商 -非 -驗 -連 -斷 -深 -難 -近 -礦 -千 -週 -委 -素 -技 -備 -半 -辦 -青 -省 -列 -習 -響 -約 -支 -般 -史 -感 -勞 -便 -團 -往 -酸 -歷 -市 -克 -何 -除 -消 -構 -府 -稱 -太 -準 -精 -值 -號 -率 -族 -維 -劃 -選 -標 -寫 -存 -候 -毛 -親 -快 -效 -斯 -院 -查 -江 -型 -眼 -王 -按 -格 -養 -易 -置 -派 -層 -片 -始 -卻 -專 -狀 -育 -廠 -京 -識 -適 -屬 -圓 -包 -火 -住 -調 -滿 -縣 -局 -照 -參 -紅 -細 -引 -聽 -該 -鐵 -價 -嚴 -首 -底 -液 -官 -德 -隨 -病 -蘇 -失 -爾 -死 -講 -配 -女 -黃 -推 -顯 -談 -罪 -神 -藝 -呢 -席 -含 -企 -望 -密 -批 -營 -項 -防 -舉 -球 -英 -氧 -勢 -告 -李 -台 -落 -木 -幫 -輪 -破 -亞 -師 -圍 -注 -遠 -字 -材 -排 -供 -河 -態 -封 -另 -施 -減 -樹 -溶 -怎 -止 -案 -言 -士 -均 -武 -固 -葉 -魚 -波 -視 -僅 -費 -緊 -愛 -左 -章 -早 -朝 -害 -續 -輕 -服 -試 -食 -充 -兵 -源 -判 -護 -司 -足 -某 -練 -差 -致 -板 -田 -降 -黑 -犯 -負 -擊 -范 -繼 -興 -似 -餘 -堅 -曲 -輸 -修 -故 -城 -夫 -夠 -送 -筆 -船 -佔 -右 -財 -吃 -富 -春 -職 -覺 -漢 -畫 -功 -巴 -跟 -雖 -雜 -飛 -檢 -吸 -助 -昇 -陽 -互 -初 -創 -抗 -考 -投 -壞 -策 -古 -徑 -換 -未 -跑 -留 -鋼 -曾 -端 -責 -站 -簡 -述 -錢 -副 -盡 -帝 -射 -草 -衝 -承 -獨 -令 -限 -阿 -宣 -環 -雙 -請 -超 -微 -讓 -控 -州 -良 -軸 -找 -否 -紀 -益 -依 -優 -頂 -礎 -載 -倒 -房 -突 -坐 -粉 -敵 -略 -客 -袁 -冷 -勝 -絕 -析 -塊 -劑 -測 -絲 -協 -訴 -念 -陳 -仍 -羅 -鹽 -友 -洋 -錯 -苦 -夜 -刑 -移 -頻 -逐 -靠 -混 -母 -短 -皮 -終 -聚 -汽 -村 -雲 -哪 -既 -距 -衛 -停 -烈 -央 -察 -燒 -迅 -境 -若 -印 -洲 -刻 -括 -激 -孔 -搞 -甚 -室 -待 -核 -校 -散 -侵 -吧 -甲 -遊 -久 -菜 -味 -舊 -模 -湖 -貨 -損 -預 -阻 -毫 -普 -穩 -乙 -媽 -植 -息 -擴 -銀 -語 -揮 -酒 -守 -拿 -序 -紙 -醫 -缺 -雨 -嗎 -針 -劉 -啊 -急 -唱 -誤 -訓 -願 -審 -附 -獲 -茶 -鮮 -糧 -斤 -孩 -脫 -硫 -肥 -善 -龍 -演 -父 -漸 -血 -歡 -械 -掌 -歌 -沙 -剛 -攻 -謂 -盾 -討 -晚 -粒 -亂 -燃 -矛 -乎 -殺 -藥 -寧 -魯 -貴 -鐘 -煤 -讀 -班 -伯 -香 -介 -迫 -句 -豐 -培 -握 -蘭 -擔 -弦 -蛋 -沉 -假 -穿 -執 -答 -樂 -誰 -順 -煙 -縮 -徵 -臉 -喜 -松 -腳 -困 -異 -免 -背 -星 -福 -買 -染 -井 -概 -慢 -怕 -磁 -倍 -祖 -皇 -促 -靜 -補 -評 -翻 -肉 -踐 -尼 -衣 -寬 -揚 -棉 -希 -傷 -操 -垂 -秋 -宜 -氫 -套 -督 -振 -架 -亮 -末 -憲 -慶 -編 -牛 -觸 -映 -雷 -銷 -詩 -座 -居 -抓 -裂 -胞 -呼 -娘 -景 -威 -綠 -晶 -厚 -盟 -衡 -雞 -孫 -延 -危 -膠 -屋 -鄉 -臨 -陸 -顧 -掉 -呀 -燈 -歲 -措 -束 -耐 -劇 -玉 -趙 -跳 -哥 -季 -課 -凱 -胡 -額 -款 -紹 -卷 -齊 -偉 -蒸 -殖 -永 -宗 -苗 -川 -爐 -岩 -弱 -零 -楊 -奏 -沿 -露 -桿 -探 -滑 -鎮 -飯 -濃 -航 -懷 -趕 -庫 -奪 -伊 -靈 -稅 -途 -滅 -賽 -歸 -召 -鼓 -播 -盤 -裁 -險 -康 -唯 -錄 -菌 -純 -借 -糖 -蓋 -橫 -符 -私 -努 -堂 -域 -槍 -潤 -幅 -哈 -竟 -熟 -蟲 -澤 -腦 -壤 -碳 -歐 -遍 -側 -寨 -敢 -徹 -慮 -斜 -薄 -庭 -納 -彈 -飼 -伸 -折 -麥 -濕 -暗 -荷 -瓦 -塞 -床 -築 -惡 -戶 -訪 -塔 -奇 -透 -梁 -刀 -旋 -跡 -卡 -氯 -遇 -份 -毒 -泥 -退 -洗 -擺 -灰 -彩 -賣 -耗 -夏 -擇 -忙 -銅 -獻 -硬 -予 -繁 -圈 -雪 -函 -亦 -抽 -篇 -陣 -陰 -丁 -尺 -追 -堆 -雄 -迎 -泛 -爸 -樓 -避 -謀 -噸 -野 -豬 -旗 -累 -偏 -典 -館 -索 -秦 -脂 -潮 -爺 -豆 -忽 -托 -驚 -塑 -遺 -愈 -朱 -替 -纖 -粗 -傾 -尚 -痛 -楚 -謝 -奮 -購 -磨 -君 -池 -旁 -碎 -骨 -監 -捕 -弟 -暴 -割 -貫 -殊 -釋 -詞 -亡 -壁 -頓 -寶 -午 -塵 -聞 -揭 -炮 -殘 -冬 -橋 -婦 -警 -綜 -招 -吳 -付 -浮 -遭 -徐 -您 -搖 -谷 -贊 -箱 -隔 -訂 -男 -吹 -園 -紛 -唐 -敗 -宋 -玻 -巨 -耕 -坦 -榮 -閉 -灣 -鍵 -凡 -駐 -鍋 -救 -恩 -剝 -凝 -鹼 -齒 -截 -煉 -麻 -紡 -禁 -廢 -盛 -版 -緩 -淨 -睛 -昌 -婚 -涉 -筒 -嘴 -插 -岸 -朗 -莊 -街 -藏 -姑 -貿 -腐 -奴 -啦 -慣 -乘 -夥 -恢 -勻 -紗 -扎 -辯 -耳 -彪 -臣 -億 -璃 -抵 -脈 -秀 -薩 -俄 -網 -舞 -店 -噴 -縱 -寸 -汗 -掛 -洪 -賀 -閃 -柬 -爆 -烯 -津 -稻 -牆 -軟 -勇 -像 -滾 -厘 -蒙 -芳 -肯 -坡 -柱 -盪 -腿 -儀 -旅 -尾 -軋 -冰 -貢 -登 -黎 -削 -鑽 -勒 -逃 -障 -氨 -郭 -峰 -幣 -港 -伏 -軌 -畝 -畢 -擦 -莫 -刺 -浪 -秘 -援 -株 -健 -售 -股 -島 -甘 -泡 -睡 -童 -鑄 -湯 -閥 -休 -匯 -舍 -牧 -繞 -炸 -哲 -磷 -績 -朋 -淡 -尖 -啟 -陷 -柴 -呈 -徒 -顏 -淚 -稍 -忘 -泵 -藍 -拖 -洞 -授 -鏡 -辛 -壯 -鋒 -貧 -虛 -彎 -摩 -泰 -幼 -廷 -尊 -窗 -綱 -弄 -隸 -疑 -氏 -宮 -姐 -震 -瑞 -怪 -尤 -琴 -循 -描 -膜 -違 -夾 -腰 -緣 -珠 -窮 -森 -枝 -竹 -溝 -催 -繩 -憶 -邦 -剩 -幸 -漿 -欄 -擁 -牙 -貯 -禮 -濾 -鈉 -紋 -罷 -拍 -咱 -喊 -袖 -埃 -勤 -罰 -焦 -潛 -伍 -墨 -欲 -縫 -姓 -刊 -飽 -仿 -獎 -鋁 -鬼 -麗 -跨 -默 -挖 -鏈 -掃 -喝 -袋 -炭 -污 -幕 -諸 -弧 -勵 -梅 -奶 -潔 -災 -舟 -鑑 -苯 -訟 -抱 -毀 -懂 -寒 -智 -埔 -寄 -屆 -躍 -渡 -挑 -丹 -艱 -貝 -碰 -拔 -爹 -戴 -碼 -夢 -芽 -熔 -赤 -漁 -哭 -敬 -顆 -奔 -鉛 -仲 -虎 -稀 -妹 -乏 -珍 -申 -桌 -遵 -允 -隆 -螺 -倉 -魏 -銳 -曉 -氮 -兼 -隱 -礙 -赫 -撥 -忠 -肅 -缸 -牽 -搶 -博 -巧 -殼 -兄 -杜 -訊 -誠 -碧 -祥 -柯 -頁 -巡 -矩 -悲 -灌 -齡 -倫 -票 -尋 -桂 -鋪 -聖 -恐 -恰 -鄭 -趣 -抬 -荒 -騰 -貼 -柔 -滴 -猛 -闊 -輛 -妻 -填 -撤 -儲 -簽 -鬧 -擾 -紫 -砂 -遞 -戲 -吊 -陶 -伐 -餵 -療 -瓶 -婆 -撫 -臂 -摸 -忍 -蝦 -蠟 -鄰 -胸 -鞏 -擠 -偶 -棄 -槽 -勁 -乳 -鄧 -吉 -仁 -爛 -磚 -租 -烏 -艦 -伴 -瓜 -淺 -丙 -暫 -燥 -橡 -柳 -迷 -暖 -牌 -秧 -膽 -詳 -簧 -踏 -瓷 -譜 -呆 -賓 -糊 -洛 -輝 -憤 -競 -隙 -怒 -粘 -乃 -緒 -肩 -籍 -敏 -塗 -熙 -皆 -偵 -懸 -掘 -享 -糾 -醒 -狂 -鎖 -淀 -恨 -牲 -霸 -爬 -賞 -逆 -玩 -陵 -祝 -秒 -浙 -貌 -役 -彼 -悉 -鴨 -趨 -鳳 -晨 -畜 -輩 -秩 -卵 -署 -梯 -炎 -灘 -棋 -驅 -篩 -峽 -冒 -啥 -壽 -譯 -浸 -泉 -帽 -遲 -矽 -疆 -貸 -漏 -稿 -冠 -嫩 -脅 -芯 -牢 -叛 -蝕 -奧 -鳴 -嶺 -羊 -憑 -串 -塘 -繪 -酵 -融 -盆 -錫 -廟 -籌 -凍 -輔 -攝 -襲 -筋 -拒 -僚 -旱 -鉀 -鳥 -漆 -沈 -眉 -疏 -添 -棒 -穗 -硝 -韓 -逼 -扭 -僑 -涼 -挺 -碗 -栽 -炒 -杯 -患 -餾 -勸 -豪 -遼 -勃 -鴻 -旦 -吏 -拜 -狗 -埋 -輥 -掩 -飲 -搬 -罵 -辭 -勾 -扣 -估 -蔣 -絨 -霧 -丈 -朵 -姆 -擬 -宇 -輯 -陝 -雕 -償 -蓄 -崇 -剪 -倡 -廳 -咬 -駛 -薯 -刷 -斥 -番 -賦 -奉 -佛 -澆 -漫 -曼 -扇 -鈣 -桃 -扶 -仔 -返 -俗 -虧 -腔 -鞋 -棱 -覆 -框 -悄 -叔 -撞 -騙 -勘 -旺 -沸 -孤 -吐 -孟 -渠 -屈 -疾 -妙 -惜 -仰 -狠 -脹 -諧 -拋 -黴 -桑 -崗 -嘛 -衰 -盜 -滲 -臟 -賴 -湧 -甜 -曹 -閱 -肌 -哩 -厲 -烴 -緯 -毅 -昨 -偽 -症 -煮 -嘆 -釘 -搭 -莖 -籠 -酷 -偷 -弓 -錐 -恆 -傑 -坑 -鼻 -翼 -綸 -敘 -獄 -逮 -罐 -絡 -棚 -抑 -膨 -蔬 -寺 -驟 -穆 -冶 -枯 -冊 -屍 -凸 -紳 -坯 -犧 -焰 -轟 -欣 -晉 -瘦 -禦 -錠 -錦 -喪 -旬 -鍛 -壟 -搜 -撲 -邀 -亭 -酯 -邁 -舒 -脆 -酶 -閒 -憂 -酚 -頑 -羽 -漲 -卸 -仗 -陪 -闢 -懲 -杭 -姚 -肚 -捉 -飄 -漂 -昆 -欺 -吾 -郎 -烷 -汁 -呵 -飾 -蕭 -雅 -郵 -遷 -燕 -撒 -姻 -赴 -宴 -煩 -債 -帳 -斑 -鈴 -旨 -醇 -董 -餅 -雛 -姿 -拌 -傅 -腹 -妥 -揉 -賢 -拆 -歪 -葡 -胺 -丟 -浩 -徽 -昂 -墊 -擋 -覽 -貪 -慰 -繳 -汪 -慌 -馮 -諾 -姜 -誼 -兇 -劣 -誣 -耀 -昏 -躺 -盈 -騎 -喬 -溪 -叢 -盧 -抹 -悶 -諮 -刮 -駕 -纜 -悟 -摘 -鉺 -擲 -頗 -幻 -柄 -惠 -慘 -佳 -仇 -臘 -窩 -滌 -劍 -瞧 -堡 -潑 -蔥 -罩 -霍 -撈 -胎 -蒼 -濱 -倆 -捅 -湘 -砍 -霞 -邵 -萄 -瘋 -淮 -遂 -熊 -糞 -烘 -宿 -檔 -戈 -駁 -嫂 -裕 -徙 -箭 -捐 -腸 -撐 -曬 -辨 -殿 -蓮 -攤 -攪 -醬 -屏 -疫 -哀 -蔡 -堵 -沫 -皺 -暢 -疊 -閣 -萊 -敲 -轄 -鉤 -痕 -壩 -巷 -餓 -禍 -丘 -玄 -溜 -曰 -邏 -彭 -嘗 -卿 -妨 -艇 -吞 -韋 -怨 -矮 -歇 diff --git a/external/libwally-core/src/data/wordlists/english.c b/external/libwally-core/src/data/wordlists/english.c deleted file mode 100644 index 3f57f90a6..000000000 --- a/external/libwally-core/src/data/wordlists/english.c +++ /dev/null @@ -1,2408 +0,0 @@ -/* Generated file - do not edit! */ -#include - -static const unsigned char en_[] = { - 0x61,0x62,0x61,0x6e,0x64,0x6f,0x6e,0, - 0x61,0x62,0x69,0x6c,0x69,0x74,0x79,0, - 0x61,0x62,0x6c,0x65,0, - 0x61,0x62,0x6f,0x75,0x74,0, - 0x61,0x62,0x6f,0x76,0x65,0, - 0x61,0x62,0x73,0x65,0x6e,0x74,0, - 0x61,0x62,0x73,0x6f,0x72,0x62,0, - 0x61,0x62,0x73,0x74,0x72,0x61,0x63,0x74,0, - 0x61,0x62,0x73,0x75,0x72,0x64,0, - 0x61,0x62,0x75,0x73,0x65,0, - 0x61,0x63,0x63,0x65,0x73,0x73,0, - 0x61,0x63,0x63,0x69,0x64,0x65,0x6e,0x74,0, - 0x61,0x63,0x63,0x6f,0x75,0x6e,0x74,0, - 0x61,0x63,0x63,0x75,0x73,0x65,0, - 0x61,0x63,0x68,0x69,0x65,0x76,0x65,0, - 0x61,0x63,0x69,0x64,0, - 0x61,0x63,0x6f,0x75,0x73,0x74,0x69,0x63,0, - 0x61,0x63,0x71,0x75,0x69,0x72,0x65,0, - 0x61,0x63,0x72,0x6f,0x73,0x73,0, - 0x61,0x63,0x74,0, - 0x61,0x63,0x74,0x69,0x6f,0x6e,0, - 0x61,0x63,0x74,0x6f,0x72,0, - 0x61,0x63,0x74,0x72,0x65,0x73,0x73,0, - 0x61,0x63,0x74,0x75,0x61,0x6c,0, - 0x61,0x64,0x61,0x70,0x74,0, - 0x61,0x64,0x64,0, - 0x61,0x64,0x64,0x69,0x63,0x74,0, - 0x61,0x64,0x64,0x72,0x65,0x73,0x73,0, - 0x61,0x64,0x6a,0x75,0x73,0x74,0, - 0x61,0x64,0x6d,0x69,0x74,0, - 0x61,0x64,0x75,0x6c,0x74,0, - 0x61,0x64,0x76,0x61,0x6e,0x63,0x65,0, - 0x61,0x64,0x76,0x69,0x63,0x65,0, - 0x61,0x65,0x72,0x6f,0x62,0x69,0x63,0, - 0x61,0x66,0x66,0x61,0x69,0x72,0, - 0x61,0x66,0x66,0x6f,0x72,0x64,0, - 0x61,0x66,0x72,0x61,0x69,0x64,0, - 0x61,0x67,0x61,0x69,0x6e,0, - 0x61,0x67,0x65,0, - 0x61,0x67,0x65,0x6e,0x74,0, - 0x61,0x67,0x72,0x65,0x65,0, - 0x61,0x68,0x65,0x61,0x64,0, - 0x61,0x69,0x6d,0, - 0x61,0x69,0x72,0, - 0x61,0x69,0x72,0x70,0x6f,0x72,0x74,0, - 0x61,0x69,0x73,0x6c,0x65,0, - 0x61,0x6c,0x61,0x72,0x6d,0, - 0x61,0x6c,0x62,0x75,0x6d,0, - 0x61,0x6c,0x63,0x6f,0x68,0x6f,0x6c,0, - 0x61,0x6c,0x65,0x72,0x74,0, - 0x61,0x6c,0x69,0x65,0x6e,0, - 0x61,0x6c,0x6c,0, - 0x61,0x6c,0x6c,0x65,0x79,0, - 0x61,0x6c,0x6c,0x6f,0x77,0, - 0x61,0x6c,0x6d,0x6f,0x73,0x74,0, - 0x61,0x6c,0x6f,0x6e,0x65,0, - 0x61,0x6c,0x70,0x68,0x61,0, - 0x61,0x6c,0x72,0x65,0x61,0x64,0x79,0, - 0x61,0x6c,0x73,0x6f,0, - 0x61,0x6c,0x74,0x65,0x72,0, - 0x61,0x6c,0x77,0x61,0x79,0x73,0, - 0x61,0x6d,0x61,0x74,0x65,0x75,0x72,0, - 0x61,0x6d,0x61,0x7a,0x69,0x6e,0x67,0, - 0x61,0x6d,0x6f,0x6e,0x67,0, - 0x61,0x6d,0x6f,0x75,0x6e,0x74,0, - 0x61,0x6d,0x75,0x73,0x65,0x64,0, - 0x61,0x6e,0x61,0x6c,0x79,0x73,0x74,0, - 0x61,0x6e,0x63,0x68,0x6f,0x72,0, - 0x61,0x6e,0x63,0x69,0x65,0x6e,0x74,0, - 0x61,0x6e,0x67,0x65,0x72,0, - 0x61,0x6e,0x67,0x6c,0x65,0, - 0x61,0x6e,0x67,0x72,0x79,0, - 0x61,0x6e,0x69,0x6d,0x61,0x6c,0, - 0x61,0x6e,0x6b,0x6c,0x65,0, - 0x61,0x6e,0x6e,0x6f,0x75,0x6e,0x63,0x65,0, - 0x61,0x6e,0x6e,0x75,0x61,0x6c,0, - 0x61,0x6e,0x6f,0x74,0x68,0x65,0x72,0, - 0x61,0x6e,0x73,0x77,0x65,0x72,0, - 0x61,0x6e,0x74,0x65,0x6e,0x6e,0x61,0, - 0x61,0x6e,0x74,0x69,0x71,0x75,0x65,0, - 0x61,0x6e,0x78,0x69,0x65,0x74,0x79,0, - 0x61,0x6e,0x79,0, - 0x61,0x70,0x61,0x72,0x74,0, - 0x61,0x70,0x6f,0x6c,0x6f,0x67,0x79,0, - 0x61,0x70,0x70,0x65,0x61,0x72,0, - 0x61,0x70,0x70,0x6c,0x65,0, - 0x61,0x70,0x70,0x72,0x6f,0x76,0x65,0, - 0x61,0x70,0x72,0x69,0x6c,0, - 0x61,0x72,0x63,0x68,0, - 0x61,0x72,0x63,0x74,0x69,0x63,0, - 0x61,0x72,0x65,0x61,0, - 0x61,0x72,0x65,0x6e,0x61,0, - 0x61,0x72,0x67,0x75,0x65,0, - 0x61,0x72,0x6d,0, - 0x61,0x72,0x6d,0x65,0x64,0, - 0x61,0x72,0x6d,0x6f,0x72,0, - 0x61,0x72,0x6d,0x79,0, - 0x61,0x72,0x6f,0x75,0x6e,0x64,0, - 0x61,0x72,0x72,0x61,0x6e,0x67,0x65,0, - 0x61,0x72,0x72,0x65,0x73,0x74,0, - 0x61,0x72,0x72,0x69,0x76,0x65,0, - 0x61,0x72,0x72,0x6f,0x77,0, - 0x61,0x72,0x74,0, - 0x61,0x72,0x74,0x65,0x66,0x61,0x63,0x74,0, - 0x61,0x72,0x74,0x69,0x73,0x74,0, - 0x61,0x72,0x74,0x77,0x6f,0x72,0x6b,0, - 0x61,0x73,0x6b,0, - 0x61,0x73,0x70,0x65,0x63,0x74,0, - 0x61,0x73,0x73,0x61,0x75,0x6c,0x74,0, - 0x61,0x73,0x73,0x65,0x74,0, - 0x61,0x73,0x73,0x69,0x73,0x74,0, - 0x61,0x73,0x73,0x75,0x6d,0x65,0, - 0x61,0x73,0x74,0x68,0x6d,0x61,0, - 0x61,0x74,0x68,0x6c,0x65,0x74,0x65,0, - 0x61,0x74,0x6f,0x6d,0, - 0x61,0x74,0x74,0x61,0x63,0x6b,0, - 0x61,0x74,0x74,0x65,0x6e,0x64,0, - 0x61,0x74,0x74,0x69,0x74,0x75,0x64,0x65,0, - 0x61,0x74,0x74,0x72,0x61,0x63,0x74,0, - 0x61,0x75,0x63,0x74,0x69,0x6f,0x6e,0, - 0x61,0x75,0x64,0x69,0x74,0, - 0x61,0x75,0x67,0x75,0x73,0x74,0, - 0x61,0x75,0x6e,0x74,0, - 0x61,0x75,0x74,0x68,0x6f,0x72,0, - 0x61,0x75,0x74,0x6f,0, - 0x61,0x75,0x74,0x75,0x6d,0x6e,0, - 0x61,0x76,0x65,0x72,0x61,0x67,0x65,0, - 0x61,0x76,0x6f,0x63,0x61,0x64,0x6f,0, - 0x61,0x76,0x6f,0x69,0x64,0, - 0x61,0x77,0x61,0x6b,0x65,0, - 0x61,0x77,0x61,0x72,0x65,0, - 0x61,0x77,0x61,0x79,0, - 0x61,0x77,0x65,0x73,0x6f,0x6d,0x65,0, - 0x61,0x77,0x66,0x75,0x6c,0, - 0x61,0x77,0x6b,0x77,0x61,0x72,0x64,0, - 0x61,0x78,0x69,0x73,0, - 0x62,0x61,0x62,0x79,0, - 0x62,0x61,0x63,0x68,0x65,0x6c,0x6f,0x72,0, - 0x62,0x61,0x63,0x6f,0x6e,0, - 0x62,0x61,0x64,0x67,0x65,0, - 0x62,0x61,0x67,0, - 0x62,0x61,0x6c,0x61,0x6e,0x63,0x65,0, - 0x62,0x61,0x6c,0x63,0x6f,0x6e,0x79,0, - 0x62,0x61,0x6c,0x6c,0, - 0x62,0x61,0x6d,0x62,0x6f,0x6f,0, - 0x62,0x61,0x6e,0x61,0x6e,0x61,0, - 0x62,0x61,0x6e,0x6e,0x65,0x72,0, - 0x62,0x61,0x72,0, - 0x62,0x61,0x72,0x65,0x6c,0x79,0, - 0x62,0x61,0x72,0x67,0x61,0x69,0x6e,0, - 0x62,0x61,0x72,0x72,0x65,0x6c,0, - 0x62,0x61,0x73,0x65,0, - 0x62,0x61,0x73,0x69,0x63,0, - 0x62,0x61,0x73,0x6b,0x65,0x74,0, - 0x62,0x61,0x74,0x74,0x6c,0x65,0, - 0x62,0x65,0x61,0x63,0x68,0, - 0x62,0x65,0x61,0x6e,0, - 0x62,0x65,0x61,0x75,0x74,0x79,0, - 0x62,0x65,0x63,0x61,0x75,0x73,0x65,0, - 0x62,0x65,0x63,0x6f,0x6d,0x65,0, - 0x62,0x65,0x65,0x66,0, - 0x62,0x65,0x66,0x6f,0x72,0x65,0, - 0x62,0x65,0x67,0x69,0x6e,0, - 0x62,0x65,0x68,0x61,0x76,0x65,0, - 0x62,0x65,0x68,0x69,0x6e,0x64,0, - 0x62,0x65,0x6c,0x69,0x65,0x76,0x65,0, - 0x62,0x65,0x6c,0x6f,0x77,0, - 0x62,0x65,0x6c,0x74,0, - 0x62,0x65,0x6e,0x63,0x68,0, - 0x62,0x65,0x6e,0x65,0x66,0x69,0x74,0, - 0x62,0x65,0x73,0x74,0, - 0x62,0x65,0x74,0x72,0x61,0x79,0, - 0x62,0x65,0x74,0x74,0x65,0x72,0, - 0x62,0x65,0x74,0x77,0x65,0x65,0x6e,0, - 0x62,0x65,0x79,0x6f,0x6e,0x64,0, - 0x62,0x69,0x63,0x79,0x63,0x6c,0x65,0, - 0x62,0x69,0x64,0, - 0x62,0x69,0x6b,0x65,0, - 0x62,0x69,0x6e,0x64,0, - 0x62,0x69,0x6f,0x6c,0x6f,0x67,0x79,0, - 0x62,0x69,0x72,0x64,0, - 0x62,0x69,0x72,0x74,0x68,0, - 0x62,0x69,0x74,0x74,0x65,0x72,0, - 0x62,0x6c,0x61,0x63,0x6b,0, - 0x62,0x6c,0x61,0x64,0x65,0, - 0x62,0x6c,0x61,0x6d,0x65,0, - 0x62,0x6c,0x61,0x6e,0x6b,0x65,0x74,0, - 0x62,0x6c,0x61,0x73,0x74,0, - 0x62,0x6c,0x65,0x61,0x6b,0, - 0x62,0x6c,0x65,0x73,0x73,0, - 0x62,0x6c,0x69,0x6e,0x64,0, - 0x62,0x6c,0x6f,0x6f,0x64,0, - 0x62,0x6c,0x6f,0x73,0x73,0x6f,0x6d,0, - 0x62,0x6c,0x6f,0x75,0x73,0x65,0, - 0x62,0x6c,0x75,0x65,0, - 0x62,0x6c,0x75,0x72,0, - 0x62,0x6c,0x75,0x73,0x68,0, - 0x62,0x6f,0x61,0x72,0x64,0, - 0x62,0x6f,0x61,0x74,0, - 0x62,0x6f,0x64,0x79,0, - 0x62,0x6f,0x69,0x6c,0, - 0x62,0x6f,0x6d,0x62,0, - 0x62,0x6f,0x6e,0x65,0, - 0x62,0x6f,0x6e,0x75,0x73,0, - 0x62,0x6f,0x6f,0x6b,0, - 0x62,0x6f,0x6f,0x73,0x74,0, - 0x62,0x6f,0x72,0x64,0x65,0x72,0, - 0x62,0x6f,0x72,0x69,0x6e,0x67,0, - 0x62,0x6f,0x72,0x72,0x6f,0x77,0, - 0x62,0x6f,0x73,0x73,0, - 0x62,0x6f,0x74,0x74,0x6f,0x6d,0, - 0x62,0x6f,0x75,0x6e,0x63,0x65,0, - 0x62,0x6f,0x78,0, - 0x62,0x6f,0x79,0, - 0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0, - 0x62,0x72,0x61,0x69,0x6e,0, - 0x62,0x72,0x61,0x6e,0x64,0, - 0x62,0x72,0x61,0x73,0x73,0, - 0x62,0x72,0x61,0x76,0x65,0, - 0x62,0x72,0x65,0x61,0x64,0, - 0x62,0x72,0x65,0x65,0x7a,0x65,0, - 0x62,0x72,0x69,0x63,0x6b,0, - 0x62,0x72,0x69,0x64,0x67,0x65,0, - 0x62,0x72,0x69,0x65,0x66,0, - 0x62,0x72,0x69,0x67,0x68,0x74,0, - 0x62,0x72,0x69,0x6e,0x67,0, - 0x62,0x72,0x69,0x73,0x6b,0, - 0x62,0x72,0x6f,0x63,0x63,0x6f,0x6c,0x69,0, - 0x62,0x72,0x6f,0x6b,0x65,0x6e,0, - 0x62,0x72,0x6f,0x6e,0x7a,0x65,0, - 0x62,0x72,0x6f,0x6f,0x6d,0, - 0x62,0x72,0x6f,0x74,0x68,0x65,0x72,0, - 0x62,0x72,0x6f,0x77,0x6e,0, - 0x62,0x72,0x75,0x73,0x68,0, - 0x62,0x75,0x62,0x62,0x6c,0x65,0, - 0x62,0x75,0x64,0x64,0x79,0, - 0x62,0x75,0x64,0x67,0x65,0x74,0, - 0x62,0x75,0x66,0x66,0x61,0x6c,0x6f,0, - 0x62,0x75,0x69,0x6c,0x64,0, - 0x62,0x75,0x6c,0x62,0, - 0x62,0x75,0x6c,0x6b,0, - 0x62,0x75,0x6c,0x6c,0x65,0x74,0, - 0x62,0x75,0x6e,0x64,0x6c,0x65,0, - 0x62,0x75,0x6e,0x6b,0x65,0x72,0, - 0x62,0x75,0x72,0x64,0x65,0x6e,0, - 0x62,0x75,0x72,0x67,0x65,0x72,0, - 0x62,0x75,0x72,0x73,0x74,0, - 0x62,0x75,0x73,0, - 0x62,0x75,0x73,0x69,0x6e,0x65,0x73,0x73,0, - 0x62,0x75,0x73,0x79,0, - 0x62,0x75,0x74,0x74,0x65,0x72,0, - 0x62,0x75,0x79,0x65,0x72,0, - 0x62,0x75,0x7a,0x7a,0, - 0x63,0x61,0x62,0x62,0x61,0x67,0x65,0, - 0x63,0x61,0x62,0x69,0x6e,0, - 0x63,0x61,0x62,0x6c,0x65,0, - 0x63,0x61,0x63,0x74,0x75,0x73,0, - 0x63,0x61,0x67,0x65,0, - 0x63,0x61,0x6b,0x65,0, - 0x63,0x61,0x6c,0x6c,0, - 0x63,0x61,0x6c,0x6d,0, - 0x63,0x61,0x6d,0x65,0x72,0x61,0, - 0x63,0x61,0x6d,0x70,0, - 0x63,0x61,0x6e,0, - 0x63,0x61,0x6e,0x61,0x6c,0, - 0x63,0x61,0x6e,0x63,0x65,0x6c,0, - 0x63,0x61,0x6e,0x64,0x79,0, - 0x63,0x61,0x6e,0x6e,0x6f,0x6e,0, - 0x63,0x61,0x6e,0x6f,0x65,0, - 0x63,0x61,0x6e,0x76,0x61,0x73,0, - 0x63,0x61,0x6e,0x79,0x6f,0x6e,0, - 0x63,0x61,0x70,0x61,0x62,0x6c,0x65,0, - 0x63,0x61,0x70,0x69,0x74,0x61,0x6c,0, - 0x63,0x61,0x70,0x74,0x61,0x69,0x6e,0, - 0x63,0x61,0x72,0, - 0x63,0x61,0x72,0x62,0x6f,0x6e,0, - 0x63,0x61,0x72,0x64,0, - 0x63,0x61,0x72,0x67,0x6f,0, - 0x63,0x61,0x72,0x70,0x65,0x74,0, - 0x63,0x61,0x72,0x72,0x79,0, - 0x63,0x61,0x72,0x74,0, - 0x63,0x61,0x73,0x65,0, - 0x63,0x61,0x73,0x68,0, - 0x63,0x61,0x73,0x69,0x6e,0x6f,0, - 0x63,0x61,0x73,0x74,0x6c,0x65,0, - 0x63,0x61,0x73,0x75,0x61,0x6c,0, - 0x63,0x61,0x74,0, - 0x63,0x61,0x74,0x61,0x6c,0x6f,0x67,0, - 0x63,0x61,0x74,0x63,0x68,0, - 0x63,0x61,0x74,0x65,0x67,0x6f,0x72,0x79,0, - 0x63,0x61,0x74,0x74,0x6c,0x65,0, - 0x63,0x61,0x75,0x67,0x68,0x74,0, - 0x63,0x61,0x75,0x73,0x65,0, - 0x63,0x61,0x75,0x74,0x69,0x6f,0x6e,0, - 0x63,0x61,0x76,0x65,0, - 0x63,0x65,0x69,0x6c,0x69,0x6e,0x67,0, - 0x63,0x65,0x6c,0x65,0x72,0x79,0, - 0x63,0x65,0x6d,0x65,0x6e,0x74,0, - 0x63,0x65,0x6e,0x73,0x75,0x73,0, - 0x63,0x65,0x6e,0x74,0x75,0x72,0x79,0, - 0x63,0x65,0x72,0x65,0x61,0x6c,0, - 0x63,0x65,0x72,0x74,0x61,0x69,0x6e,0, - 0x63,0x68,0x61,0x69,0x72,0, - 0x63,0x68,0x61,0x6c,0x6b,0, - 0x63,0x68,0x61,0x6d,0x70,0x69,0x6f,0x6e,0, - 0x63,0x68,0x61,0x6e,0x67,0x65,0, - 0x63,0x68,0x61,0x6f,0x73,0, - 0x63,0x68,0x61,0x70,0x74,0x65,0x72,0, - 0x63,0x68,0x61,0x72,0x67,0x65,0, - 0x63,0x68,0x61,0x73,0x65,0, - 0x63,0x68,0x61,0x74,0, - 0x63,0x68,0x65,0x61,0x70,0, - 0x63,0x68,0x65,0x63,0x6b,0, - 0x63,0x68,0x65,0x65,0x73,0x65,0, - 0x63,0x68,0x65,0x66,0, - 0x63,0x68,0x65,0x72,0x72,0x79,0, - 0x63,0x68,0x65,0x73,0x74,0, - 0x63,0x68,0x69,0x63,0x6b,0x65,0x6e,0, - 0x63,0x68,0x69,0x65,0x66,0, - 0x63,0x68,0x69,0x6c,0x64,0, - 0x63,0x68,0x69,0x6d,0x6e,0x65,0x79,0, - 0x63,0x68,0x6f,0x69,0x63,0x65,0, - 0x63,0x68,0x6f,0x6f,0x73,0x65,0, - 0x63,0x68,0x72,0x6f,0x6e,0x69,0x63,0, - 0x63,0x68,0x75,0x63,0x6b,0x6c,0x65,0, - 0x63,0x68,0x75,0x6e,0x6b,0, - 0x63,0x68,0x75,0x72,0x6e,0, - 0x63,0x69,0x67,0x61,0x72,0, - 0x63,0x69,0x6e,0x6e,0x61,0x6d,0x6f,0x6e,0, - 0x63,0x69,0x72,0x63,0x6c,0x65,0, - 0x63,0x69,0x74,0x69,0x7a,0x65,0x6e,0, - 0x63,0x69,0x74,0x79,0, - 0x63,0x69,0x76,0x69,0x6c,0, - 0x63,0x6c,0x61,0x69,0x6d,0, - 0x63,0x6c,0x61,0x70,0, - 0x63,0x6c,0x61,0x72,0x69,0x66,0x79,0, - 0x63,0x6c,0x61,0x77,0, - 0x63,0x6c,0x61,0x79,0, - 0x63,0x6c,0x65,0x61,0x6e,0, - 0x63,0x6c,0x65,0x72,0x6b,0, - 0x63,0x6c,0x65,0x76,0x65,0x72,0, - 0x63,0x6c,0x69,0x63,0x6b,0, - 0x63,0x6c,0x69,0x65,0x6e,0x74,0, - 0x63,0x6c,0x69,0x66,0x66,0, - 0x63,0x6c,0x69,0x6d,0x62,0, - 0x63,0x6c,0x69,0x6e,0x69,0x63,0, - 0x63,0x6c,0x69,0x70,0, - 0x63,0x6c,0x6f,0x63,0x6b,0, - 0x63,0x6c,0x6f,0x67,0, - 0x63,0x6c,0x6f,0x73,0x65,0, - 0x63,0x6c,0x6f,0x74,0x68,0, - 0x63,0x6c,0x6f,0x75,0x64,0, - 0x63,0x6c,0x6f,0x77,0x6e,0, - 0x63,0x6c,0x75,0x62,0, - 0x63,0x6c,0x75,0x6d,0x70,0, - 0x63,0x6c,0x75,0x73,0x74,0x65,0x72,0, - 0x63,0x6c,0x75,0x74,0x63,0x68,0, - 0x63,0x6f,0x61,0x63,0x68,0, - 0x63,0x6f,0x61,0x73,0x74,0, - 0x63,0x6f,0x63,0x6f,0x6e,0x75,0x74,0, - 0x63,0x6f,0x64,0x65,0, - 0x63,0x6f,0x66,0x66,0x65,0x65,0, - 0x63,0x6f,0x69,0x6c,0, - 0x63,0x6f,0x69,0x6e,0, - 0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0, - 0x63,0x6f,0x6c,0x6f,0x72,0, - 0x63,0x6f,0x6c,0x75,0x6d,0x6e,0, - 0x63,0x6f,0x6d,0x62,0x69,0x6e,0x65,0, - 0x63,0x6f,0x6d,0x65,0, - 0x63,0x6f,0x6d,0x66,0x6f,0x72,0x74,0, - 0x63,0x6f,0x6d,0x69,0x63,0, - 0x63,0x6f,0x6d,0x6d,0x6f,0x6e,0, - 0x63,0x6f,0x6d,0x70,0x61,0x6e,0x79,0, - 0x63,0x6f,0x6e,0x63,0x65,0x72,0x74,0, - 0x63,0x6f,0x6e,0x64,0x75,0x63,0x74,0, - 0x63,0x6f,0x6e,0x66,0x69,0x72,0x6d,0, - 0x63,0x6f,0x6e,0x67,0x72,0x65,0x73,0x73,0, - 0x63,0x6f,0x6e,0x6e,0x65,0x63,0x74,0, - 0x63,0x6f,0x6e,0x73,0x69,0x64,0x65,0x72,0, - 0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0, - 0x63,0x6f,0x6e,0x76,0x69,0x6e,0x63,0x65,0, - 0x63,0x6f,0x6f,0x6b,0, - 0x63,0x6f,0x6f,0x6c,0, - 0x63,0x6f,0x70,0x70,0x65,0x72,0, - 0x63,0x6f,0x70,0x79,0, - 0x63,0x6f,0x72,0x61,0x6c,0, - 0x63,0x6f,0x72,0x65,0, - 0x63,0x6f,0x72,0x6e,0, - 0x63,0x6f,0x72,0x72,0x65,0x63,0x74,0, - 0x63,0x6f,0x73,0x74,0, - 0x63,0x6f,0x74,0x74,0x6f,0x6e,0, - 0x63,0x6f,0x75,0x63,0x68,0, - 0x63,0x6f,0x75,0x6e,0x74,0x72,0x79,0, - 0x63,0x6f,0x75,0x70,0x6c,0x65,0, - 0x63,0x6f,0x75,0x72,0x73,0x65,0, - 0x63,0x6f,0x75,0x73,0x69,0x6e,0, - 0x63,0x6f,0x76,0x65,0x72,0, - 0x63,0x6f,0x79,0x6f,0x74,0x65,0, - 0x63,0x72,0x61,0x63,0x6b,0, - 0x63,0x72,0x61,0x64,0x6c,0x65,0, - 0x63,0x72,0x61,0x66,0x74,0, - 0x63,0x72,0x61,0x6d,0, - 0x63,0x72,0x61,0x6e,0x65,0, - 0x63,0x72,0x61,0x73,0x68,0, - 0x63,0x72,0x61,0x74,0x65,0x72,0, - 0x63,0x72,0x61,0x77,0x6c,0, - 0x63,0x72,0x61,0x7a,0x79,0, - 0x63,0x72,0x65,0x61,0x6d,0, - 0x63,0x72,0x65,0x64,0x69,0x74,0, - 0x63,0x72,0x65,0x65,0x6b,0, - 0x63,0x72,0x65,0x77,0, - 0x63,0x72,0x69,0x63,0x6b,0x65,0x74,0, - 0x63,0x72,0x69,0x6d,0x65,0, - 0x63,0x72,0x69,0x73,0x70,0, - 0x63,0x72,0x69,0x74,0x69,0x63,0, - 0x63,0x72,0x6f,0x70,0, - 0x63,0x72,0x6f,0x73,0x73,0, - 0x63,0x72,0x6f,0x75,0x63,0x68,0, - 0x63,0x72,0x6f,0x77,0x64,0, - 0x63,0x72,0x75,0x63,0x69,0x61,0x6c,0, - 0x63,0x72,0x75,0x65,0x6c,0, - 0x63,0x72,0x75,0x69,0x73,0x65,0, - 0x63,0x72,0x75,0x6d,0x62,0x6c,0x65,0, - 0x63,0x72,0x75,0x6e,0x63,0x68,0, - 0x63,0x72,0x75,0x73,0x68,0, - 0x63,0x72,0x79,0, - 0x63,0x72,0x79,0x73,0x74,0x61,0x6c,0, - 0x63,0x75,0x62,0x65,0, - 0x63,0x75,0x6c,0x74,0x75,0x72,0x65,0, - 0x63,0x75,0x70,0, - 0x63,0x75,0x70,0x62,0x6f,0x61,0x72,0x64,0, - 0x63,0x75,0x72,0x69,0x6f,0x75,0x73,0, - 0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0, - 0x63,0x75,0x72,0x74,0x61,0x69,0x6e,0, - 0x63,0x75,0x72,0x76,0x65,0, - 0x63,0x75,0x73,0x68,0x69,0x6f,0x6e,0, - 0x63,0x75,0x73,0x74,0x6f,0x6d,0, - 0x63,0x75,0x74,0x65,0, - 0x63,0x79,0x63,0x6c,0x65,0, - 0x64,0x61,0x64,0, - 0x64,0x61,0x6d,0x61,0x67,0x65,0, - 0x64,0x61,0x6d,0x70,0, - 0x64,0x61,0x6e,0x63,0x65,0, - 0x64,0x61,0x6e,0x67,0x65,0x72,0, - 0x64,0x61,0x72,0x69,0x6e,0x67,0, - 0x64,0x61,0x73,0x68,0, - 0x64,0x61,0x75,0x67,0x68,0x74,0x65,0x72,0, - 0x64,0x61,0x77,0x6e,0, - 0x64,0x61,0x79,0, - 0x64,0x65,0x61,0x6c,0, - 0x64,0x65,0x62,0x61,0x74,0x65,0, - 0x64,0x65,0x62,0x72,0x69,0x73,0, - 0x64,0x65,0x63,0x61,0x64,0x65,0, - 0x64,0x65,0x63,0x65,0x6d,0x62,0x65,0x72,0, - 0x64,0x65,0x63,0x69,0x64,0x65,0, - 0x64,0x65,0x63,0x6c,0x69,0x6e,0x65,0, - 0x64,0x65,0x63,0x6f,0x72,0x61,0x74,0x65,0, - 0x64,0x65,0x63,0x72,0x65,0x61,0x73,0x65,0, - 0x64,0x65,0x65,0x72,0, - 0x64,0x65,0x66,0x65,0x6e,0x73,0x65,0, - 0x64,0x65,0x66,0x69,0x6e,0x65,0, - 0x64,0x65,0x66,0x79,0, - 0x64,0x65,0x67,0x72,0x65,0x65,0, - 0x64,0x65,0x6c,0x61,0x79,0, - 0x64,0x65,0x6c,0x69,0x76,0x65,0x72,0, - 0x64,0x65,0x6d,0x61,0x6e,0x64,0, - 0x64,0x65,0x6d,0x69,0x73,0x65,0, - 0x64,0x65,0x6e,0x69,0x61,0x6c,0, - 0x64,0x65,0x6e,0x74,0x69,0x73,0x74,0, - 0x64,0x65,0x6e,0x79,0, - 0x64,0x65,0x70,0x61,0x72,0x74,0, - 0x64,0x65,0x70,0x65,0x6e,0x64,0, - 0x64,0x65,0x70,0x6f,0x73,0x69,0x74,0, - 0x64,0x65,0x70,0x74,0x68,0, - 0x64,0x65,0x70,0x75,0x74,0x79,0, - 0x64,0x65,0x72,0x69,0x76,0x65,0, - 0x64,0x65,0x73,0x63,0x72,0x69,0x62,0x65,0, - 0x64,0x65,0x73,0x65,0x72,0x74,0, - 0x64,0x65,0x73,0x69,0x67,0x6e,0, - 0x64,0x65,0x73,0x6b,0, - 0x64,0x65,0x73,0x70,0x61,0x69,0x72,0, - 0x64,0x65,0x73,0x74,0x72,0x6f,0x79,0, - 0x64,0x65,0x74,0x61,0x69,0x6c,0, - 0x64,0x65,0x74,0x65,0x63,0x74,0, - 0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0, - 0x64,0x65,0x76,0x69,0x63,0x65,0, - 0x64,0x65,0x76,0x6f,0x74,0x65,0, - 0x64,0x69,0x61,0x67,0x72,0x61,0x6d,0, - 0x64,0x69,0x61,0x6c,0, - 0x64,0x69,0x61,0x6d,0x6f,0x6e,0x64,0, - 0x64,0x69,0x61,0x72,0x79,0, - 0x64,0x69,0x63,0x65,0, - 0x64,0x69,0x65,0x73,0x65,0x6c,0, - 0x64,0x69,0x65,0x74,0, - 0x64,0x69,0x66,0x66,0x65,0x72,0, - 0x64,0x69,0x67,0x69,0x74,0x61,0x6c,0, - 0x64,0x69,0x67,0x6e,0x69,0x74,0x79,0, - 0x64,0x69,0x6c,0x65,0x6d,0x6d,0x61,0, - 0x64,0x69,0x6e,0x6e,0x65,0x72,0, - 0x64,0x69,0x6e,0x6f,0x73,0x61,0x75,0x72,0, - 0x64,0x69,0x72,0x65,0x63,0x74,0, - 0x64,0x69,0x72,0x74,0, - 0x64,0x69,0x73,0x61,0x67,0x72,0x65,0x65,0, - 0x64,0x69,0x73,0x63,0x6f,0x76,0x65,0x72,0, - 0x64,0x69,0x73,0x65,0x61,0x73,0x65,0, - 0x64,0x69,0x73,0x68,0, - 0x64,0x69,0x73,0x6d,0x69,0x73,0x73,0, - 0x64,0x69,0x73,0x6f,0x72,0x64,0x65,0x72,0, - 0x64,0x69,0x73,0x70,0x6c,0x61,0x79,0, - 0x64,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0, - 0x64,0x69,0x76,0x65,0x72,0x74,0, - 0x64,0x69,0x76,0x69,0x64,0x65,0, - 0x64,0x69,0x76,0x6f,0x72,0x63,0x65,0, - 0x64,0x69,0x7a,0x7a,0x79,0, - 0x64,0x6f,0x63,0x74,0x6f,0x72,0, - 0x64,0x6f,0x63,0x75,0x6d,0x65,0x6e,0x74,0, - 0x64,0x6f,0x67,0, - 0x64,0x6f,0x6c,0x6c,0, - 0x64,0x6f,0x6c,0x70,0x68,0x69,0x6e,0, - 0x64,0x6f,0x6d,0x61,0x69,0x6e,0, - 0x64,0x6f,0x6e,0x61,0x74,0x65,0, - 0x64,0x6f,0x6e,0x6b,0x65,0x79,0, - 0x64,0x6f,0x6e,0x6f,0x72,0, - 0x64,0x6f,0x6f,0x72,0, - 0x64,0x6f,0x73,0x65,0, - 0x64,0x6f,0x75,0x62,0x6c,0x65,0, - 0x64,0x6f,0x76,0x65,0, - 0x64,0x72,0x61,0x66,0x74,0, - 0x64,0x72,0x61,0x67,0x6f,0x6e,0, - 0x64,0x72,0x61,0x6d,0x61,0, - 0x64,0x72,0x61,0x73,0x74,0x69,0x63,0, - 0x64,0x72,0x61,0x77,0, - 0x64,0x72,0x65,0x61,0x6d,0, - 0x64,0x72,0x65,0x73,0x73,0, - 0x64,0x72,0x69,0x66,0x74,0, - 0x64,0x72,0x69,0x6c,0x6c,0, - 0x64,0x72,0x69,0x6e,0x6b,0, - 0x64,0x72,0x69,0x70,0, - 0x64,0x72,0x69,0x76,0x65,0, - 0x64,0x72,0x6f,0x70,0, - 0x64,0x72,0x75,0x6d,0, - 0x64,0x72,0x79,0, - 0x64,0x75,0x63,0x6b,0, - 0x64,0x75,0x6d,0x62,0, - 0x64,0x75,0x6e,0x65,0, - 0x64,0x75,0x72,0x69,0x6e,0x67,0, - 0x64,0x75,0x73,0x74,0, - 0x64,0x75,0x74,0x63,0x68,0, - 0x64,0x75,0x74,0x79,0, - 0x64,0x77,0x61,0x72,0x66,0, - 0x64,0x79,0x6e,0x61,0x6d,0x69,0x63,0, - 0x65,0x61,0x67,0x65,0x72,0, - 0x65,0x61,0x67,0x6c,0x65,0, - 0x65,0x61,0x72,0x6c,0x79,0, - 0x65,0x61,0x72,0x6e,0, - 0x65,0x61,0x72,0x74,0x68,0, - 0x65,0x61,0x73,0x69,0x6c,0x79,0, - 0x65,0x61,0x73,0x74,0, - 0x65,0x61,0x73,0x79,0, - 0x65,0x63,0x68,0x6f,0, - 0x65,0x63,0x6f,0x6c,0x6f,0x67,0x79,0, - 0x65,0x63,0x6f,0x6e,0x6f,0x6d,0x79,0, - 0x65,0x64,0x67,0x65,0, - 0x65,0x64,0x69,0x74,0, - 0x65,0x64,0x75,0x63,0x61,0x74,0x65,0, - 0x65,0x66,0x66,0x6f,0x72,0x74,0, - 0x65,0x67,0x67,0, - 0x65,0x69,0x67,0x68,0x74,0, - 0x65,0x69,0x74,0x68,0x65,0x72,0, - 0x65,0x6c,0x62,0x6f,0x77,0, - 0x65,0x6c,0x64,0x65,0x72,0, - 0x65,0x6c,0x65,0x63,0x74,0x72,0x69,0x63,0, - 0x65,0x6c,0x65,0x67,0x61,0x6e,0x74,0, - 0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0, - 0x65,0x6c,0x65,0x70,0x68,0x61,0x6e,0x74,0, - 0x65,0x6c,0x65,0x76,0x61,0x74,0x6f,0x72,0, - 0x65,0x6c,0x69,0x74,0x65,0, - 0x65,0x6c,0x73,0x65,0, - 0x65,0x6d,0x62,0x61,0x72,0x6b,0, - 0x65,0x6d,0x62,0x6f,0x64,0x79,0, - 0x65,0x6d,0x62,0x72,0x61,0x63,0x65,0, - 0x65,0x6d,0x65,0x72,0x67,0x65,0, - 0x65,0x6d,0x6f,0x74,0x69,0x6f,0x6e,0, - 0x65,0x6d,0x70,0x6c,0x6f,0x79,0, - 0x65,0x6d,0x70,0x6f,0x77,0x65,0x72,0, - 0x65,0x6d,0x70,0x74,0x79,0, - 0x65,0x6e,0x61,0x62,0x6c,0x65,0, - 0x65,0x6e,0x61,0x63,0x74,0, - 0x65,0x6e,0x64,0, - 0x65,0x6e,0x64,0x6c,0x65,0x73,0x73,0, - 0x65,0x6e,0x64,0x6f,0x72,0x73,0x65,0, - 0x65,0x6e,0x65,0x6d,0x79,0, - 0x65,0x6e,0x65,0x72,0x67,0x79,0, - 0x65,0x6e,0x66,0x6f,0x72,0x63,0x65,0, - 0x65,0x6e,0x67,0x61,0x67,0x65,0, - 0x65,0x6e,0x67,0x69,0x6e,0x65,0, - 0x65,0x6e,0x68,0x61,0x6e,0x63,0x65,0, - 0x65,0x6e,0x6a,0x6f,0x79,0, - 0x65,0x6e,0x6c,0x69,0x73,0x74,0, - 0x65,0x6e,0x6f,0x75,0x67,0x68,0, - 0x65,0x6e,0x72,0x69,0x63,0x68,0, - 0x65,0x6e,0x72,0x6f,0x6c,0x6c,0, - 0x65,0x6e,0x73,0x75,0x72,0x65,0, - 0x65,0x6e,0x74,0x65,0x72,0, - 0x65,0x6e,0x74,0x69,0x72,0x65,0, - 0x65,0x6e,0x74,0x72,0x79,0, - 0x65,0x6e,0x76,0x65,0x6c,0x6f,0x70,0x65,0, - 0x65,0x70,0x69,0x73,0x6f,0x64,0x65,0, - 0x65,0x71,0x75,0x61,0x6c,0, - 0x65,0x71,0x75,0x69,0x70,0, - 0x65,0x72,0x61,0, - 0x65,0x72,0x61,0x73,0x65,0, - 0x65,0x72,0x6f,0x64,0x65,0, - 0x65,0x72,0x6f,0x73,0x69,0x6f,0x6e,0, - 0x65,0x72,0x72,0x6f,0x72,0, - 0x65,0x72,0x75,0x70,0x74,0, - 0x65,0x73,0x63,0x61,0x70,0x65,0, - 0x65,0x73,0x73,0x61,0x79,0, - 0x65,0x73,0x73,0x65,0x6e,0x63,0x65,0, - 0x65,0x73,0x74,0x61,0x74,0x65,0, - 0x65,0x74,0x65,0x72,0x6e,0x61,0x6c,0, - 0x65,0x74,0x68,0x69,0x63,0x73,0, - 0x65,0x76,0x69,0x64,0x65,0x6e,0x63,0x65,0, - 0x65,0x76,0x69,0x6c,0, - 0x65,0x76,0x6f,0x6b,0x65,0, - 0x65,0x76,0x6f,0x6c,0x76,0x65,0, - 0x65,0x78,0x61,0x63,0x74,0, - 0x65,0x78,0x61,0x6d,0x70,0x6c,0x65,0, - 0x65,0x78,0x63,0x65,0x73,0x73,0, - 0x65,0x78,0x63,0x68,0x61,0x6e,0x67,0x65,0, - 0x65,0x78,0x63,0x69,0x74,0x65,0, - 0x65,0x78,0x63,0x6c,0x75,0x64,0x65,0, - 0x65,0x78,0x63,0x75,0x73,0x65,0, - 0x65,0x78,0x65,0x63,0x75,0x74,0x65,0, - 0x65,0x78,0x65,0x72,0x63,0x69,0x73,0x65,0, - 0x65,0x78,0x68,0x61,0x75,0x73,0x74,0, - 0x65,0x78,0x68,0x69,0x62,0x69,0x74,0, - 0x65,0x78,0x69,0x6c,0x65,0, - 0x65,0x78,0x69,0x73,0x74,0, - 0x65,0x78,0x69,0x74,0, - 0x65,0x78,0x6f,0x74,0x69,0x63,0, - 0x65,0x78,0x70,0x61,0x6e,0x64,0, - 0x65,0x78,0x70,0x65,0x63,0x74,0, - 0x65,0x78,0x70,0x69,0x72,0x65,0, - 0x65,0x78,0x70,0x6c,0x61,0x69,0x6e,0, - 0x65,0x78,0x70,0x6f,0x73,0x65,0, - 0x65,0x78,0x70,0x72,0x65,0x73,0x73,0, - 0x65,0x78,0x74,0x65,0x6e,0x64,0, - 0x65,0x78,0x74,0x72,0x61,0, - 0x65,0x79,0x65,0, - 0x65,0x79,0x65,0x62,0x72,0x6f,0x77,0, - 0x66,0x61,0x62,0x72,0x69,0x63,0, - 0x66,0x61,0x63,0x65,0, - 0x66,0x61,0x63,0x75,0x6c,0x74,0x79,0, - 0x66,0x61,0x64,0x65,0, - 0x66,0x61,0x69,0x6e,0x74,0, - 0x66,0x61,0x69,0x74,0x68,0, - 0x66,0x61,0x6c,0x6c,0, - 0x66,0x61,0x6c,0x73,0x65,0, - 0x66,0x61,0x6d,0x65,0, - 0x66,0x61,0x6d,0x69,0x6c,0x79,0, - 0x66,0x61,0x6d,0x6f,0x75,0x73,0, - 0x66,0x61,0x6e,0, - 0x66,0x61,0x6e,0x63,0x79,0, - 0x66,0x61,0x6e,0x74,0x61,0x73,0x79,0, - 0x66,0x61,0x72,0x6d,0, - 0x66,0x61,0x73,0x68,0x69,0x6f,0x6e,0, - 0x66,0x61,0x74,0, - 0x66,0x61,0x74,0x61,0x6c,0, - 0x66,0x61,0x74,0x68,0x65,0x72,0, - 0x66,0x61,0x74,0x69,0x67,0x75,0x65,0, - 0x66,0x61,0x75,0x6c,0x74,0, - 0x66,0x61,0x76,0x6f,0x72,0x69,0x74,0x65,0, - 0x66,0x65,0x61,0x74,0x75,0x72,0x65,0, - 0x66,0x65,0x62,0x72,0x75,0x61,0x72,0x79,0, - 0x66,0x65,0x64,0x65,0x72,0x61,0x6c,0, - 0x66,0x65,0x65,0, - 0x66,0x65,0x65,0x64,0, - 0x66,0x65,0x65,0x6c,0, - 0x66,0x65,0x6d,0x61,0x6c,0x65,0, - 0x66,0x65,0x6e,0x63,0x65,0, - 0x66,0x65,0x73,0x74,0x69,0x76,0x61,0x6c,0, - 0x66,0x65,0x74,0x63,0x68,0, - 0x66,0x65,0x76,0x65,0x72,0, - 0x66,0x65,0x77,0, - 0x66,0x69,0x62,0x65,0x72,0, - 0x66,0x69,0x63,0x74,0x69,0x6f,0x6e,0, - 0x66,0x69,0x65,0x6c,0x64,0, - 0x66,0x69,0x67,0x75,0x72,0x65,0, - 0x66,0x69,0x6c,0x65,0, - 0x66,0x69,0x6c,0x6d,0, - 0x66,0x69,0x6c,0x74,0x65,0x72,0, - 0x66,0x69,0x6e,0x61,0x6c,0, - 0x66,0x69,0x6e,0x64,0, - 0x66,0x69,0x6e,0x65,0, - 0x66,0x69,0x6e,0x67,0x65,0x72,0, - 0x66,0x69,0x6e,0x69,0x73,0x68,0, - 0x66,0x69,0x72,0x65,0, - 0x66,0x69,0x72,0x6d,0, - 0x66,0x69,0x72,0x73,0x74,0, - 0x66,0x69,0x73,0x63,0x61,0x6c,0, - 0x66,0x69,0x73,0x68,0, - 0x66,0x69,0x74,0, - 0x66,0x69,0x74,0x6e,0x65,0x73,0x73,0, - 0x66,0x69,0x78,0, - 0x66,0x6c,0x61,0x67,0, - 0x66,0x6c,0x61,0x6d,0x65,0, - 0x66,0x6c,0x61,0x73,0x68,0, - 0x66,0x6c,0x61,0x74,0, - 0x66,0x6c,0x61,0x76,0x6f,0x72,0, - 0x66,0x6c,0x65,0x65,0, - 0x66,0x6c,0x69,0x67,0x68,0x74,0, - 0x66,0x6c,0x69,0x70,0, - 0x66,0x6c,0x6f,0x61,0x74,0, - 0x66,0x6c,0x6f,0x63,0x6b,0, - 0x66,0x6c,0x6f,0x6f,0x72,0, - 0x66,0x6c,0x6f,0x77,0x65,0x72,0, - 0x66,0x6c,0x75,0x69,0x64,0, - 0x66,0x6c,0x75,0x73,0x68,0, - 0x66,0x6c,0x79,0, - 0x66,0x6f,0x61,0x6d,0, - 0x66,0x6f,0x63,0x75,0x73,0, - 0x66,0x6f,0x67,0, - 0x66,0x6f,0x69,0x6c,0, - 0x66,0x6f,0x6c,0x64,0, - 0x66,0x6f,0x6c,0x6c,0x6f,0x77,0, - 0x66,0x6f,0x6f,0x64,0, - 0x66,0x6f,0x6f,0x74,0, - 0x66,0x6f,0x72,0x63,0x65,0, - 0x66,0x6f,0x72,0x65,0x73,0x74,0, - 0x66,0x6f,0x72,0x67,0x65,0x74,0, - 0x66,0x6f,0x72,0x6b,0, - 0x66,0x6f,0x72,0x74,0x75,0x6e,0x65,0, - 0x66,0x6f,0x72,0x75,0x6d,0, - 0x66,0x6f,0x72,0x77,0x61,0x72,0x64,0, - 0x66,0x6f,0x73,0x73,0x69,0x6c,0, - 0x66,0x6f,0x73,0x74,0x65,0x72,0, - 0x66,0x6f,0x75,0x6e,0x64,0, - 0x66,0x6f,0x78,0, - 0x66,0x72,0x61,0x67,0x69,0x6c,0x65,0, - 0x66,0x72,0x61,0x6d,0x65,0, - 0x66,0x72,0x65,0x71,0x75,0x65,0x6e,0x74,0, - 0x66,0x72,0x65,0x73,0x68,0, - 0x66,0x72,0x69,0x65,0x6e,0x64,0, - 0x66,0x72,0x69,0x6e,0x67,0x65,0, - 0x66,0x72,0x6f,0x67,0, - 0x66,0x72,0x6f,0x6e,0x74,0, - 0x66,0x72,0x6f,0x73,0x74,0, - 0x66,0x72,0x6f,0x77,0x6e,0, - 0x66,0x72,0x6f,0x7a,0x65,0x6e,0, - 0x66,0x72,0x75,0x69,0x74,0, - 0x66,0x75,0x65,0x6c,0, - 0x66,0x75,0x6e,0, - 0x66,0x75,0x6e,0x6e,0x79,0, - 0x66,0x75,0x72,0x6e,0x61,0x63,0x65,0, - 0x66,0x75,0x72,0x79,0, - 0x66,0x75,0x74,0x75,0x72,0x65,0, - 0x67,0x61,0x64,0x67,0x65,0x74,0, - 0x67,0x61,0x69,0x6e,0, - 0x67,0x61,0x6c,0x61,0x78,0x79,0, - 0x67,0x61,0x6c,0x6c,0x65,0x72,0x79,0, - 0x67,0x61,0x6d,0x65,0, - 0x67,0x61,0x70,0, - 0x67,0x61,0x72,0x61,0x67,0x65,0, - 0x67,0x61,0x72,0x62,0x61,0x67,0x65,0, - 0x67,0x61,0x72,0x64,0x65,0x6e,0, - 0x67,0x61,0x72,0x6c,0x69,0x63,0, - 0x67,0x61,0x72,0x6d,0x65,0x6e,0x74,0, - 0x67,0x61,0x73,0, - 0x67,0x61,0x73,0x70,0, - 0x67,0x61,0x74,0x65,0, - 0x67,0x61,0x74,0x68,0x65,0x72,0, - 0x67,0x61,0x75,0x67,0x65,0, - 0x67,0x61,0x7a,0x65,0, - 0x67,0x65,0x6e,0x65,0x72,0x61,0x6c,0, - 0x67,0x65,0x6e,0x69,0x75,0x73,0, - 0x67,0x65,0x6e,0x72,0x65,0, - 0x67,0x65,0x6e,0x74,0x6c,0x65,0, - 0x67,0x65,0x6e,0x75,0x69,0x6e,0x65,0, - 0x67,0x65,0x73,0x74,0x75,0x72,0x65,0, - 0x67,0x68,0x6f,0x73,0x74,0, - 0x67,0x69,0x61,0x6e,0x74,0, - 0x67,0x69,0x66,0x74,0, - 0x67,0x69,0x67,0x67,0x6c,0x65,0, - 0x67,0x69,0x6e,0x67,0x65,0x72,0, - 0x67,0x69,0x72,0x61,0x66,0x66,0x65,0, - 0x67,0x69,0x72,0x6c,0, - 0x67,0x69,0x76,0x65,0, - 0x67,0x6c,0x61,0x64,0, - 0x67,0x6c,0x61,0x6e,0x63,0x65,0, - 0x67,0x6c,0x61,0x72,0x65,0, - 0x67,0x6c,0x61,0x73,0x73,0, - 0x67,0x6c,0x69,0x64,0x65,0, - 0x67,0x6c,0x69,0x6d,0x70,0x73,0x65,0, - 0x67,0x6c,0x6f,0x62,0x65,0, - 0x67,0x6c,0x6f,0x6f,0x6d,0, - 0x67,0x6c,0x6f,0x72,0x79,0, - 0x67,0x6c,0x6f,0x76,0x65,0, - 0x67,0x6c,0x6f,0x77,0, - 0x67,0x6c,0x75,0x65,0, - 0x67,0x6f,0x61,0x74,0, - 0x67,0x6f,0x64,0x64,0x65,0x73,0x73,0, - 0x67,0x6f,0x6c,0x64,0, - 0x67,0x6f,0x6f,0x64,0, - 0x67,0x6f,0x6f,0x73,0x65,0, - 0x67,0x6f,0x72,0x69,0x6c,0x6c,0x61,0, - 0x67,0x6f,0x73,0x70,0x65,0x6c,0, - 0x67,0x6f,0x73,0x73,0x69,0x70,0, - 0x67,0x6f,0x76,0x65,0x72,0x6e,0, - 0x67,0x6f,0x77,0x6e,0, - 0x67,0x72,0x61,0x62,0, - 0x67,0x72,0x61,0x63,0x65,0, - 0x67,0x72,0x61,0x69,0x6e,0, - 0x67,0x72,0x61,0x6e,0x74,0, - 0x67,0x72,0x61,0x70,0x65,0, - 0x67,0x72,0x61,0x73,0x73,0, - 0x67,0x72,0x61,0x76,0x69,0x74,0x79,0, - 0x67,0x72,0x65,0x61,0x74,0, - 0x67,0x72,0x65,0x65,0x6e,0, - 0x67,0x72,0x69,0x64,0, - 0x67,0x72,0x69,0x65,0x66,0, - 0x67,0x72,0x69,0x74,0, - 0x67,0x72,0x6f,0x63,0x65,0x72,0x79,0, - 0x67,0x72,0x6f,0x75,0x70,0, - 0x67,0x72,0x6f,0x77,0, - 0x67,0x72,0x75,0x6e,0x74,0, - 0x67,0x75,0x61,0x72,0x64,0, - 0x67,0x75,0x65,0x73,0x73,0, - 0x67,0x75,0x69,0x64,0x65,0, - 0x67,0x75,0x69,0x6c,0x74,0, - 0x67,0x75,0x69,0x74,0x61,0x72,0, - 0x67,0x75,0x6e,0, - 0x67,0x79,0x6d,0, - 0x68,0x61,0x62,0x69,0x74,0, - 0x68,0x61,0x69,0x72,0, - 0x68,0x61,0x6c,0x66,0, - 0x68,0x61,0x6d,0x6d,0x65,0x72,0, - 0x68,0x61,0x6d,0x73,0x74,0x65,0x72,0, - 0x68,0x61,0x6e,0x64,0, - 0x68,0x61,0x70,0x70,0x79,0, - 0x68,0x61,0x72,0x62,0x6f,0x72,0, - 0x68,0x61,0x72,0x64,0, - 0x68,0x61,0x72,0x73,0x68,0, - 0x68,0x61,0x72,0x76,0x65,0x73,0x74,0, - 0x68,0x61,0x74,0, - 0x68,0x61,0x76,0x65,0, - 0x68,0x61,0x77,0x6b,0, - 0x68,0x61,0x7a,0x61,0x72,0x64,0, - 0x68,0x65,0x61,0x64,0, - 0x68,0x65,0x61,0x6c,0x74,0x68,0, - 0x68,0x65,0x61,0x72,0x74,0, - 0x68,0x65,0x61,0x76,0x79,0, - 0x68,0x65,0x64,0x67,0x65,0x68,0x6f,0x67,0, - 0x68,0x65,0x69,0x67,0x68,0x74,0, - 0x68,0x65,0x6c,0x6c,0x6f,0, - 0x68,0x65,0x6c,0x6d,0x65,0x74,0, - 0x68,0x65,0x6c,0x70,0, - 0x68,0x65,0x6e,0, - 0x68,0x65,0x72,0x6f,0, - 0x68,0x69,0x64,0x64,0x65,0x6e,0, - 0x68,0x69,0x67,0x68,0, - 0x68,0x69,0x6c,0x6c,0, - 0x68,0x69,0x6e,0x74,0, - 0x68,0x69,0x70,0, - 0x68,0x69,0x72,0x65,0, - 0x68,0x69,0x73,0x74,0x6f,0x72,0x79,0, - 0x68,0x6f,0x62,0x62,0x79,0, - 0x68,0x6f,0x63,0x6b,0x65,0x79,0, - 0x68,0x6f,0x6c,0x64,0, - 0x68,0x6f,0x6c,0x65,0, - 0x68,0x6f,0x6c,0x69,0x64,0x61,0x79,0, - 0x68,0x6f,0x6c,0x6c,0x6f,0x77,0, - 0x68,0x6f,0x6d,0x65,0, - 0x68,0x6f,0x6e,0x65,0x79,0, - 0x68,0x6f,0x6f,0x64,0, - 0x68,0x6f,0x70,0x65,0, - 0x68,0x6f,0x72,0x6e,0, - 0x68,0x6f,0x72,0x72,0x6f,0x72,0, - 0x68,0x6f,0x72,0x73,0x65,0, - 0x68,0x6f,0x73,0x70,0x69,0x74,0x61,0x6c,0, - 0x68,0x6f,0x73,0x74,0, - 0x68,0x6f,0x74,0x65,0x6c,0, - 0x68,0x6f,0x75,0x72,0, - 0x68,0x6f,0x76,0x65,0x72,0, - 0x68,0x75,0x62,0, - 0x68,0x75,0x67,0x65,0, - 0x68,0x75,0x6d,0x61,0x6e,0, - 0x68,0x75,0x6d,0x62,0x6c,0x65,0, - 0x68,0x75,0x6d,0x6f,0x72,0, - 0x68,0x75,0x6e,0x64,0x72,0x65,0x64,0, - 0x68,0x75,0x6e,0x67,0x72,0x79,0, - 0x68,0x75,0x6e,0x74,0, - 0x68,0x75,0x72,0x64,0x6c,0x65,0, - 0x68,0x75,0x72,0x72,0x79,0, - 0x68,0x75,0x72,0x74,0, - 0x68,0x75,0x73,0x62,0x61,0x6e,0x64,0, - 0x68,0x79,0x62,0x72,0x69,0x64,0, - 0x69,0x63,0x65,0, - 0x69,0x63,0x6f,0x6e,0, - 0x69,0x64,0x65,0x61,0, - 0x69,0x64,0x65,0x6e,0x74,0x69,0x66,0x79,0, - 0x69,0x64,0x6c,0x65,0, - 0x69,0x67,0x6e,0x6f,0x72,0x65,0, - 0x69,0x6c,0x6c,0, - 0x69,0x6c,0x6c,0x65,0x67,0x61,0x6c,0, - 0x69,0x6c,0x6c,0x6e,0x65,0x73,0x73,0, - 0x69,0x6d,0x61,0x67,0x65,0, - 0x69,0x6d,0x69,0x74,0x61,0x74,0x65,0, - 0x69,0x6d,0x6d,0x65,0x6e,0x73,0x65,0, - 0x69,0x6d,0x6d,0x75,0x6e,0x65,0, - 0x69,0x6d,0x70,0x61,0x63,0x74,0, - 0x69,0x6d,0x70,0x6f,0x73,0x65,0, - 0x69,0x6d,0x70,0x72,0x6f,0x76,0x65,0, - 0x69,0x6d,0x70,0x75,0x6c,0x73,0x65,0, - 0x69,0x6e,0x63,0x68,0, - 0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0, - 0x69,0x6e,0x63,0x6f,0x6d,0x65,0, - 0x69,0x6e,0x63,0x72,0x65,0x61,0x73,0x65,0, - 0x69,0x6e,0x64,0x65,0x78,0, - 0x69,0x6e,0x64,0x69,0x63,0x61,0x74,0x65,0, - 0x69,0x6e,0x64,0x6f,0x6f,0x72,0, - 0x69,0x6e,0x64,0x75,0x73,0x74,0x72,0x79,0, - 0x69,0x6e,0x66,0x61,0x6e,0x74,0, - 0x69,0x6e,0x66,0x6c,0x69,0x63,0x74,0, - 0x69,0x6e,0x66,0x6f,0x72,0x6d,0, - 0x69,0x6e,0x68,0x61,0x6c,0x65,0, - 0x69,0x6e,0x68,0x65,0x72,0x69,0x74,0, - 0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0, - 0x69,0x6e,0x6a,0x65,0x63,0x74,0, - 0x69,0x6e,0x6a,0x75,0x72,0x79,0, - 0x69,0x6e,0x6d,0x61,0x74,0x65,0, - 0x69,0x6e,0x6e,0x65,0x72,0, - 0x69,0x6e,0x6e,0x6f,0x63,0x65,0x6e,0x74,0, - 0x69,0x6e,0x70,0x75,0x74,0, - 0x69,0x6e,0x71,0x75,0x69,0x72,0x79,0, - 0x69,0x6e,0x73,0x61,0x6e,0x65,0, - 0x69,0x6e,0x73,0x65,0x63,0x74,0, - 0x69,0x6e,0x73,0x69,0x64,0x65,0, - 0x69,0x6e,0x73,0x70,0x69,0x72,0x65,0, - 0x69,0x6e,0x73,0x74,0x61,0x6c,0x6c,0, - 0x69,0x6e,0x74,0x61,0x63,0x74,0, - 0x69,0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0, - 0x69,0x6e,0x74,0x6f,0, - 0x69,0x6e,0x76,0x65,0x73,0x74,0, - 0x69,0x6e,0x76,0x69,0x74,0x65,0, - 0x69,0x6e,0x76,0x6f,0x6c,0x76,0x65,0, - 0x69,0x72,0x6f,0x6e,0, - 0x69,0x73,0x6c,0x61,0x6e,0x64,0, - 0x69,0x73,0x6f,0x6c,0x61,0x74,0x65,0, - 0x69,0x73,0x73,0x75,0x65,0, - 0x69,0x74,0x65,0x6d,0, - 0x69,0x76,0x6f,0x72,0x79,0, - 0x6a,0x61,0x63,0x6b,0x65,0x74,0, - 0x6a,0x61,0x67,0x75,0x61,0x72,0, - 0x6a,0x61,0x72,0, - 0x6a,0x61,0x7a,0x7a,0, - 0x6a,0x65,0x61,0x6c,0x6f,0x75,0x73,0, - 0x6a,0x65,0x61,0x6e,0x73,0, - 0x6a,0x65,0x6c,0x6c,0x79,0, - 0x6a,0x65,0x77,0x65,0x6c,0, - 0x6a,0x6f,0x62,0, - 0x6a,0x6f,0x69,0x6e,0, - 0x6a,0x6f,0x6b,0x65,0, - 0x6a,0x6f,0x75,0x72,0x6e,0x65,0x79,0, - 0x6a,0x6f,0x79,0, - 0x6a,0x75,0x64,0x67,0x65,0, - 0x6a,0x75,0x69,0x63,0x65,0, - 0x6a,0x75,0x6d,0x70,0, - 0x6a,0x75,0x6e,0x67,0x6c,0x65,0, - 0x6a,0x75,0x6e,0x69,0x6f,0x72,0, - 0x6a,0x75,0x6e,0x6b,0, - 0x6a,0x75,0x73,0x74,0, - 0x6b,0x61,0x6e,0x67,0x61,0x72,0x6f,0x6f,0, - 0x6b,0x65,0x65,0x6e,0, - 0x6b,0x65,0x65,0x70,0, - 0x6b,0x65,0x74,0x63,0x68,0x75,0x70,0, - 0x6b,0x65,0x79,0, - 0x6b,0x69,0x63,0x6b,0, - 0x6b,0x69,0x64,0, - 0x6b,0x69,0x64,0x6e,0x65,0x79,0, - 0x6b,0x69,0x6e,0x64,0, - 0x6b,0x69,0x6e,0x67,0x64,0x6f,0x6d,0, - 0x6b,0x69,0x73,0x73,0, - 0x6b,0x69,0x74,0, - 0x6b,0x69,0x74,0x63,0x68,0x65,0x6e,0, - 0x6b,0x69,0x74,0x65,0, - 0x6b,0x69,0x74,0x74,0x65,0x6e,0, - 0x6b,0x69,0x77,0x69,0, - 0x6b,0x6e,0x65,0x65,0, - 0x6b,0x6e,0x69,0x66,0x65,0, - 0x6b,0x6e,0x6f,0x63,0x6b,0, - 0x6b,0x6e,0x6f,0x77,0, - 0x6c,0x61,0x62,0, - 0x6c,0x61,0x62,0x65,0x6c,0, - 0x6c,0x61,0x62,0x6f,0x72,0, - 0x6c,0x61,0x64,0x64,0x65,0x72,0, - 0x6c,0x61,0x64,0x79,0, - 0x6c,0x61,0x6b,0x65,0, - 0x6c,0x61,0x6d,0x70,0, - 0x6c,0x61,0x6e,0x67,0x75,0x61,0x67,0x65,0, - 0x6c,0x61,0x70,0x74,0x6f,0x70,0, - 0x6c,0x61,0x72,0x67,0x65,0, - 0x6c,0x61,0x74,0x65,0x72,0, - 0x6c,0x61,0x74,0x69,0x6e,0, - 0x6c,0x61,0x75,0x67,0x68,0, - 0x6c,0x61,0x75,0x6e,0x64,0x72,0x79,0, - 0x6c,0x61,0x76,0x61,0, - 0x6c,0x61,0x77,0, - 0x6c,0x61,0x77,0x6e,0, - 0x6c,0x61,0x77,0x73,0x75,0x69,0x74,0, - 0x6c,0x61,0x79,0x65,0x72,0, - 0x6c,0x61,0x7a,0x79,0, - 0x6c,0x65,0x61,0x64,0x65,0x72,0, - 0x6c,0x65,0x61,0x66,0, - 0x6c,0x65,0x61,0x72,0x6e,0, - 0x6c,0x65,0x61,0x76,0x65,0, - 0x6c,0x65,0x63,0x74,0x75,0x72,0x65,0, - 0x6c,0x65,0x66,0x74,0, - 0x6c,0x65,0x67,0, - 0x6c,0x65,0x67,0x61,0x6c,0, - 0x6c,0x65,0x67,0x65,0x6e,0x64,0, - 0x6c,0x65,0x69,0x73,0x75,0x72,0x65,0, - 0x6c,0x65,0x6d,0x6f,0x6e,0, - 0x6c,0x65,0x6e,0x64,0, - 0x6c,0x65,0x6e,0x67,0x74,0x68,0, - 0x6c,0x65,0x6e,0x73,0, - 0x6c,0x65,0x6f,0x70,0x61,0x72,0x64,0, - 0x6c,0x65,0x73,0x73,0x6f,0x6e,0, - 0x6c,0x65,0x74,0x74,0x65,0x72,0, - 0x6c,0x65,0x76,0x65,0x6c,0, - 0x6c,0x69,0x61,0x72,0, - 0x6c,0x69,0x62,0x65,0x72,0x74,0x79,0, - 0x6c,0x69,0x62,0x72,0x61,0x72,0x79,0, - 0x6c,0x69,0x63,0x65,0x6e,0x73,0x65,0, - 0x6c,0x69,0x66,0x65,0, - 0x6c,0x69,0x66,0x74,0, - 0x6c,0x69,0x67,0x68,0x74,0, - 0x6c,0x69,0x6b,0x65,0, - 0x6c,0x69,0x6d,0x62,0, - 0x6c,0x69,0x6d,0x69,0x74,0, - 0x6c,0x69,0x6e,0x6b,0, - 0x6c,0x69,0x6f,0x6e,0, - 0x6c,0x69,0x71,0x75,0x69,0x64,0, - 0x6c,0x69,0x73,0x74,0, - 0x6c,0x69,0x74,0x74,0x6c,0x65,0, - 0x6c,0x69,0x76,0x65,0, - 0x6c,0x69,0x7a,0x61,0x72,0x64,0, - 0x6c,0x6f,0x61,0x64,0, - 0x6c,0x6f,0x61,0x6e,0, - 0x6c,0x6f,0x62,0x73,0x74,0x65,0x72,0, - 0x6c,0x6f,0x63,0x61,0x6c,0, - 0x6c,0x6f,0x63,0x6b,0, - 0x6c,0x6f,0x67,0x69,0x63,0, - 0x6c,0x6f,0x6e,0x65,0x6c,0x79,0, - 0x6c,0x6f,0x6e,0x67,0, - 0x6c,0x6f,0x6f,0x70,0, - 0x6c,0x6f,0x74,0x74,0x65,0x72,0x79,0, - 0x6c,0x6f,0x75,0x64,0, - 0x6c,0x6f,0x75,0x6e,0x67,0x65,0, - 0x6c,0x6f,0x76,0x65,0, - 0x6c,0x6f,0x79,0x61,0x6c,0, - 0x6c,0x75,0x63,0x6b,0x79,0, - 0x6c,0x75,0x67,0x67,0x61,0x67,0x65,0, - 0x6c,0x75,0x6d,0x62,0x65,0x72,0, - 0x6c,0x75,0x6e,0x61,0x72,0, - 0x6c,0x75,0x6e,0x63,0x68,0, - 0x6c,0x75,0x78,0x75,0x72,0x79,0, - 0x6c,0x79,0x72,0x69,0x63,0x73,0, - 0x6d,0x61,0x63,0x68,0x69,0x6e,0x65,0, - 0x6d,0x61,0x64,0, - 0x6d,0x61,0x67,0x69,0x63,0, - 0x6d,0x61,0x67,0x6e,0x65,0x74,0, - 0x6d,0x61,0x69,0x64,0, - 0x6d,0x61,0x69,0x6c,0, - 0x6d,0x61,0x69,0x6e,0, - 0x6d,0x61,0x6a,0x6f,0x72,0, - 0x6d,0x61,0x6b,0x65,0, - 0x6d,0x61,0x6d,0x6d,0x61,0x6c,0, - 0x6d,0x61,0x6e,0, - 0x6d,0x61,0x6e,0x61,0x67,0x65,0, - 0x6d,0x61,0x6e,0x64,0x61,0x74,0x65,0, - 0x6d,0x61,0x6e,0x67,0x6f,0, - 0x6d,0x61,0x6e,0x73,0x69,0x6f,0x6e,0, - 0x6d,0x61,0x6e,0x75,0x61,0x6c,0, - 0x6d,0x61,0x70,0x6c,0x65,0, - 0x6d,0x61,0x72,0x62,0x6c,0x65,0, - 0x6d,0x61,0x72,0x63,0x68,0, - 0x6d,0x61,0x72,0x67,0x69,0x6e,0, - 0x6d,0x61,0x72,0x69,0x6e,0x65,0, - 0x6d,0x61,0x72,0x6b,0x65,0x74,0, - 0x6d,0x61,0x72,0x72,0x69,0x61,0x67,0x65,0, - 0x6d,0x61,0x73,0x6b,0, - 0x6d,0x61,0x73,0x73,0, - 0x6d,0x61,0x73,0x74,0x65,0x72,0, - 0x6d,0x61,0x74,0x63,0x68,0, - 0x6d,0x61,0x74,0x65,0x72,0x69,0x61,0x6c,0, - 0x6d,0x61,0x74,0x68,0, - 0x6d,0x61,0x74,0x72,0x69,0x78,0, - 0x6d,0x61,0x74,0x74,0x65,0x72,0, - 0x6d,0x61,0x78,0x69,0x6d,0x75,0x6d,0, - 0x6d,0x61,0x7a,0x65,0, - 0x6d,0x65,0x61,0x64,0x6f,0x77,0, - 0x6d,0x65,0x61,0x6e,0, - 0x6d,0x65,0x61,0x73,0x75,0x72,0x65,0, - 0x6d,0x65,0x61,0x74,0, - 0x6d,0x65,0x63,0x68,0x61,0x6e,0x69,0x63,0, - 0x6d,0x65,0x64,0x61,0x6c,0, - 0x6d,0x65,0x64,0x69,0x61,0, - 0x6d,0x65,0x6c,0x6f,0x64,0x79,0, - 0x6d,0x65,0x6c,0x74,0, - 0x6d,0x65,0x6d,0x62,0x65,0x72,0, - 0x6d,0x65,0x6d,0x6f,0x72,0x79,0, - 0x6d,0x65,0x6e,0x74,0x69,0x6f,0x6e,0, - 0x6d,0x65,0x6e,0x75,0, - 0x6d,0x65,0x72,0x63,0x79,0, - 0x6d,0x65,0x72,0x67,0x65,0, - 0x6d,0x65,0x72,0x69,0x74,0, - 0x6d,0x65,0x72,0x72,0x79,0, - 0x6d,0x65,0x73,0x68,0, - 0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0, - 0x6d,0x65,0x74,0x61,0x6c,0, - 0x6d,0x65,0x74,0x68,0x6f,0x64,0, - 0x6d,0x69,0x64,0x64,0x6c,0x65,0, - 0x6d,0x69,0x64,0x6e,0x69,0x67,0x68,0x74,0, - 0x6d,0x69,0x6c,0x6b,0, - 0x6d,0x69,0x6c,0x6c,0x69,0x6f,0x6e,0, - 0x6d,0x69,0x6d,0x69,0x63,0, - 0x6d,0x69,0x6e,0x64,0, - 0x6d,0x69,0x6e,0x69,0x6d,0x75,0x6d,0, - 0x6d,0x69,0x6e,0x6f,0x72,0, - 0x6d,0x69,0x6e,0x75,0x74,0x65,0, - 0x6d,0x69,0x72,0x61,0x63,0x6c,0x65,0, - 0x6d,0x69,0x72,0x72,0x6f,0x72,0, - 0x6d,0x69,0x73,0x65,0x72,0x79,0, - 0x6d,0x69,0x73,0x73,0, - 0x6d,0x69,0x73,0x74,0x61,0x6b,0x65,0, - 0x6d,0x69,0x78,0, - 0x6d,0x69,0x78,0x65,0x64,0, - 0x6d,0x69,0x78,0x74,0x75,0x72,0x65,0, - 0x6d,0x6f,0x62,0x69,0x6c,0x65,0, - 0x6d,0x6f,0x64,0x65,0x6c,0, - 0x6d,0x6f,0x64,0x69,0x66,0x79,0, - 0x6d,0x6f,0x6d,0, - 0x6d,0x6f,0x6d,0x65,0x6e,0x74,0, - 0x6d,0x6f,0x6e,0x69,0x74,0x6f,0x72,0, - 0x6d,0x6f,0x6e,0x6b,0x65,0x79,0, - 0x6d,0x6f,0x6e,0x73,0x74,0x65,0x72,0, - 0x6d,0x6f,0x6e,0x74,0x68,0, - 0x6d,0x6f,0x6f,0x6e,0, - 0x6d,0x6f,0x72,0x61,0x6c,0, - 0x6d,0x6f,0x72,0x65,0, - 0x6d,0x6f,0x72,0x6e,0x69,0x6e,0x67,0, - 0x6d,0x6f,0x73,0x71,0x75,0x69,0x74,0x6f,0, - 0x6d,0x6f,0x74,0x68,0x65,0x72,0, - 0x6d,0x6f,0x74,0x69,0x6f,0x6e,0, - 0x6d,0x6f,0x74,0x6f,0x72,0, - 0x6d,0x6f,0x75,0x6e,0x74,0x61,0x69,0x6e,0, - 0x6d,0x6f,0x75,0x73,0x65,0, - 0x6d,0x6f,0x76,0x65,0, - 0x6d,0x6f,0x76,0x69,0x65,0, - 0x6d,0x75,0x63,0x68,0, - 0x6d,0x75,0x66,0x66,0x69,0x6e,0, - 0x6d,0x75,0x6c,0x65,0, - 0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0, - 0x6d,0x75,0x73,0x63,0x6c,0x65,0, - 0x6d,0x75,0x73,0x65,0x75,0x6d,0, - 0x6d,0x75,0x73,0x68,0x72,0x6f,0x6f,0x6d,0, - 0x6d,0x75,0x73,0x69,0x63,0, - 0x6d,0x75,0x73,0x74,0, - 0x6d,0x75,0x74,0x75,0x61,0x6c,0, - 0x6d,0x79,0x73,0x65,0x6c,0x66,0, - 0x6d,0x79,0x73,0x74,0x65,0x72,0x79,0, - 0x6d,0x79,0x74,0x68,0, - 0x6e,0x61,0x69,0x76,0x65,0, - 0x6e,0x61,0x6d,0x65,0, - 0x6e,0x61,0x70,0x6b,0x69,0x6e,0, - 0x6e,0x61,0x72,0x72,0x6f,0x77,0, - 0x6e,0x61,0x73,0x74,0x79,0, - 0x6e,0x61,0x74,0x69,0x6f,0x6e,0, - 0x6e,0x61,0x74,0x75,0x72,0x65,0, - 0x6e,0x65,0x61,0x72,0, - 0x6e,0x65,0x63,0x6b,0, - 0x6e,0x65,0x65,0x64,0, - 0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,0, - 0x6e,0x65,0x67,0x6c,0x65,0x63,0x74,0, - 0x6e,0x65,0x69,0x74,0x68,0x65,0x72,0, - 0x6e,0x65,0x70,0x68,0x65,0x77,0, - 0x6e,0x65,0x72,0x76,0x65,0, - 0x6e,0x65,0x73,0x74,0, - 0x6e,0x65,0x74,0, - 0x6e,0x65,0x74,0x77,0x6f,0x72,0x6b,0, - 0x6e,0x65,0x75,0x74,0x72,0x61,0x6c,0, - 0x6e,0x65,0x76,0x65,0x72,0, - 0x6e,0x65,0x77,0x73,0, - 0x6e,0x65,0x78,0x74,0, - 0x6e,0x69,0x63,0x65,0, - 0x6e,0x69,0x67,0x68,0x74,0, - 0x6e,0x6f,0x62,0x6c,0x65,0, - 0x6e,0x6f,0x69,0x73,0x65,0, - 0x6e,0x6f,0x6d,0x69,0x6e,0x65,0x65,0, - 0x6e,0x6f,0x6f,0x64,0x6c,0x65,0, - 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0, - 0x6e,0x6f,0x72,0x74,0x68,0, - 0x6e,0x6f,0x73,0x65,0, - 0x6e,0x6f,0x74,0x61,0x62,0x6c,0x65,0, - 0x6e,0x6f,0x74,0x65,0, - 0x6e,0x6f,0x74,0x68,0x69,0x6e,0x67,0, - 0x6e,0x6f,0x74,0x69,0x63,0x65,0, - 0x6e,0x6f,0x76,0x65,0x6c,0, - 0x6e,0x6f,0x77,0, - 0x6e,0x75,0x63,0x6c,0x65,0x61,0x72,0, - 0x6e,0x75,0x6d,0x62,0x65,0x72,0, - 0x6e,0x75,0x72,0x73,0x65,0, - 0x6e,0x75,0x74,0, - 0x6f,0x61,0x6b,0, - 0x6f,0x62,0x65,0x79,0, - 0x6f,0x62,0x6a,0x65,0x63,0x74,0, - 0x6f,0x62,0x6c,0x69,0x67,0x65,0, - 0x6f,0x62,0x73,0x63,0x75,0x72,0x65,0, - 0x6f,0x62,0x73,0x65,0x72,0x76,0x65,0, - 0x6f,0x62,0x74,0x61,0x69,0x6e,0, - 0x6f,0x62,0x76,0x69,0x6f,0x75,0x73,0, - 0x6f,0x63,0x63,0x75,0x72,0, - 0x6f,0x63,0x65,0x61,0x6e,0, - 0x6f,0x63,0x74,0x6f,0x62,0x65,0x72,0, - 0x6f,0x64,0x6f,0x72,0, - 0x6f,0x66,0x66,0, - 0x6f,0x66,0x66,0x65,0x72,0, - 0x6f,0x66,0x66,0x69,0x63,0x65,0, - 0x6f,0x66,0x74,0x65,0x6e,0, - 0x6f,0x69,0x6c,0, - 0x6f,0x6b,0x61,0x79,0, - 0x6f,0x6c,0x64,0, - 0x6f,0x6c,0x69,0x76,0x65,0, - 0x6f,0x6c,0x79,0x6d,0x70,0x69,0x63,0, - 0x6f,0x6d,0x69,0x74,0, - 0x6f,0x6e,0x63,0x65,0, - 0x6f,0x6e,0x65,0, - 0x6f,0x6e,0x69,0x6f,0x6e,0, - 0x6f,0x6e,0x6c,0x69,0x6e,0x65,0, - 0x6f,0x6e,0x6c,0x79,0, - 0x6f,0x70,0x65,0x6e,0, - 0x6f,0x70,0x65,0x72,0x61,0, - 0x6f,0x70,0x69,0x6e,0x69,0x6f,0x6e,0, - 0x6f,0x70,0x70,0x6f,0x73,0x65,0, - 0x6f,0x70,0x74,0x69,0x6f,0x6e,0, - 0x6f,0x72,0x61,0x6e,0x67,0x65,0, - 0x6f,0x72,0x62,0x69,0x74,0, - 0x6f,0x72,0x63,0x68,0x61,0x72,0x64,0, - 0x6f,0x72,0x64,0x65,0x72,0, - 0x6f,0x72,0x64,0x69,0x6e,0x61,0x72,0x79,0, - 0x6f,0x72,0x67,0x61,0x6e,0, - 0x6f,0x72,0x69,0x65,0x6e,0x74,0, - 0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0, - 0x6f,0x72,0x70,0x68,0x61,0x6e,0, - 0x6f,0x73,0x74,0x72,0x69,0x63,0x68,0, - 0x6f,0x74,0x68,0x65,0x72,0, - 0x6f,0x75,0x74,0x64,0x6f,0x6f,0x72,0, - 0x6f,0x75,0x74,0x65,0x72,0, - 0x6f,0x75,0x74,0x70,0x75,0x74,0, - 0x6f,0x75,0x74,0x73,0x69,0x64,0x65,0, - 0x6f,0x76,0x61,0x6c,0, - 0x6f,0x76,0x65,0x6e,0, - 0x6f,0x76,0x65,0x72,0, - 0x6f,0x77,0x6e,0, - 0x6f,0x77,0x6e,0x65,0x72,0, - 0x6f,0x78,0x79,0x67,0x65,0x6e,0, - 0x6f,0x79,0x73,0x74,0x65,0x72,0, - 0x6f,0x7a,0x6f,0x6e,0x65,0, - 0x70,0x61,0x63,0x74,0, - 0x70,0x61,0x64,0x64,0x6c,0x65,0, - 0x70,0x61,0x67,0x65,0, - 0x70,0x61,0x69,0x72,0, - 0x70,0x61,0x6c,0x61,0x63,0x65,0, - 0x70,0x61,0x6c,0x6d,0, - 0x70,0x61,0x6e,0x64,0x61,0, - 0x70,0x61,0x6e,0x65,0x6c,0, - 0x70,0x61,0x6e,0x69,0x63,0, - 0x70,0x61,0x6e,0x74,0x68,0x65,0x72,0, - 0x70,0x61,0x70,0x65,0x72,0, - 0x70,0x61,0x72,0x61,0x64,0x65,0, - 0x70,0x61,0x72,0x65,0x6e,0x74,0, - 0x70,0x61,0x72,0x6b,0, - 0x70,0x61,0x72,0x72,0x6f,0x74,0, - 0x70,0x61,0x72,0x74,0x79,0, - 0x70,0x61,0x73,0x73,0, - 0x70,0x61,0x74,0x63,0x68,0, - 0x70,0x61,0x74,0x68,0, - 0x70,0x61,0x74,0x69,0x65,0x6e,0x74,0, - 0x70,0x61,0x74,0x72,0x6f,0x6c,0, - 0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0, - 0x70,0x61,0x75,0x73,0x65,0, - 0x70,0x61,0x76,0x65,0, - 0x70,0x61,0x79,0x6d,0x65,0x6e,0x74,0, - 0x70,0x65,0x61,0x63,0x65,0, - 0x70,0x65,0x61,0x6e,0x75,0x74,0, - 0x70,0x65,0x61,0x72,0, - 0x70,0x65,0x61,0x73,0x61,0x6e,0x74,0, - 0x70,0x65,0x6c,0x69,0x63,0x61,0x6e,0, - 0x70,0x65,0x6e,0, - 0x70,0x65,0x6e,0x61,0x6c,0x74,0x79,0, - 0x70,0x65,0x6e,0x63,0x69,0x6c,0, - 0x70,0x65,0x6f,0x70,0x6c,0x65,0, - 0x70,0x65,0x70,0x70,0x65,0x72,0, - 0x70,0x65,0x72,0x66,0x65,0x63,0x74,0, - 0x70,0x65,0x72,0x6d,0x69,0x74,0, - 0x70,0x65,0x72,0x73,0x6f,0x6e,0, - 0x70,0x65,0x74,0, - 0x70,0x68,0x6f,0x6e,0x65,0, - 0x70,0x68,0x6f,0x74,0x6f,0, - 0x70,0x68,0x72,0x61,0x73,0x65,0, - 0x70,0x68,0x79,0x73,0x69,0x63,0x61,0x6c,0, - 0x70,0x69,0x61,0x6e,0x6f,0, - 0x70,0x69,0x63,0x6e,0x69,0x63,0, - 0x70,0x69,0x63,0x74,0x75,0x72,0x65,0, - 0x70,0x69,0x65,0x63,0x65,0, - 0x70,0x69,0x67,0, - 0x70,0x69,0x67,0x65,0x6f,0x6e,0, - 0x70,0x69,0x6c,0x6c,0, - 0x70,0x69,0x6c,0x6f,0x74,0, - 0x70,0x69,0x6e,0x6b,0, - 0x70,0x69,0x6f,0x6e,0x65,0x65,0x72,0, - 0x70,0x69,0x70,0x65,0, - 0x70,0x69,0x73,0x74,0x6f,0x6c,0, - 0x70,0x69,0x74,0x63,0x68,0, - 0x70,0x69,0x7a,0x7a,0x61,0, - 0x70,0x6c,0x61,0x63,0x65,0, - 0x70,0x6c,0x61,0x6e,0x65,0x74,0, - 0x70,0x6c,0x61,0x73,0x74,0x69,0x63,0, - 0x70,0x6c,0x61,0x74,0x65,0, - 0x70,0x6c,0x61,0x79,0, - 0x70,0x6c,0x65,0x61,0x73,0x65,0, - 0x70,0x6c,0x65,0x64,0x67,0x65,0, - 0x70,0x6c,0x75,0x63,0x6b,0, - 0x70,0x6c,0x75,0x67,0, - 0x70,0x6c,0x75,0x6e,0x67,0x65,0, - 0x70,0x6f,0x65,0x6d,0, - 0x70,0x6f,0x65,0x74,0, - 0x70,0x6f,0x69,0x6e,0x74,0, - 0x70,0x6f,0x6c,0x61,0x72,0, - 0x70,0x6f,0x6c,0x65,0, - 0x70,0x6f,0x6c,0x69,0x63,0x65,0, - 0x70,0x6f,0x6e,0x64,0, - 0x70,0x6f,0x6e,0x79,0, - 0x70,0x6f,0x6f,0x6c,0, - 0x70,0x6f,0x70,0x75,0x6c,0x61,0x72,0, - 0x70,0x6f,0x72,0x74,0x69,0x6f,0x6e,0, - 0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0, - 0x70,0x6f,0x73,0x73,0x69,0x62,0x6c,0x65,0, - 0x70,0x6f,0x73,0x74,0, - 0x70,0x6f,0x74,0x61,0x74,0x6f,0, - 0x70,0x6f,0x74,0x74,0x65,0x72,0x79,0, - 0x70,0x6f,0x76,0x65,0x72,0x74,0x79,0, - 0x70,0x6f,0x77,0x64,0x65,0x72,0, - 0x70,0x6f,0x77,0x65,0x72,0, - 0x70,0x72,0x61,0x63,0x74,0x69,0x63,0x65,0, - 0x70,0x72,0x61,0x69,0x73,0x65,0, - 0x70,0x72,0x65,0x64,0x69,0x63,0x74,0, - 0x70,0x72,0x65,0x66,0x65,0x72,0, - 0x70,0x72,0x65,0x70,0x61,0x72,0x65,0, - 0x70,0x72,0x65,0x73,0x65,0x6e,0x74,0, - 0x70,0x72,0x65,0x74,0x74,0x79,0, - 0x70,0x72,0x65,0x76,0x65,0x6e,0x74,0, - 0x70,0x72,0x69,0x63,0x65,0, - 0x70,0x72,0x69,0x64,0x65,0, - 0x70,0x72,0x69,0x6d,0x61,0x72,0x79,0, - 0x70,0x72,0x69,0x6e,0x74,0, - 0x70,0x72,0x69,0x6f,0x72,0x69,0x74,0x79,0, - 0x70,0x72,0x69,0x73,0x6f,0x6e,0, - 0x70,0x72,0x69,0x76,0x61,0x74,0x65,0, - 0x70,0x72,0x69,0x7a,0x65,0, - 0x70,0x72,0x6f,0x62,0x6c,0x65,0x6d,0, - 0x70,0x72,0x6f,0x63,0x65,0x73,0x73,0, - 0x70,0x72,0x6f,0x64,0x75,0x63,0x65,0, - 0x70,0x72,0x6f,0x66,0x69,0x74,0, - 0x70,0x72,0x6f,0x67,0x72,0x61,0x6d,0, - 0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0, - 0x70,0x72,0x6f,0x6d,0x6f,0x74,0x65,0, - 0x70,0x72,0x6f,0x6f,0x66,0, - 0x70,0x72,0x6f,0x70,0x65,0x72,0x74,0x79,0, - 0x70,0x72,0x6f,0x73,0x70,0x65,0x72,0, - 0x70,0x72,0x6f,0x74,0x65,0x63,0x74,0, - 0x70,0x72,0x6f,0x75,0x64,0, - 0x70,0x72,0x6f,0x76,0x69,0x64,0x65,0, - 0x70,0x75,0x62,0x6c,0x69,0x63,0, - 0x70,0x75,0x64,0x64,0x69,0x6e,0x67,0, - 0x70,0x75,0x6c,0x6c,0, - 0x70,0x75,0x6c,0x70,0, - 0x70,0x75,0x6c,0x73,0x65,0, - 0x70,0x75,0x6d,0x70,0x6b,0x69,0x6e,0, - 0x70,0x75,0x6e,0x63,0x68,0, - 0x70,0x75,0x70,0x69,0x6c,0, - 0x70,0x75,0x70,0x70,0x79,0, - 0x70,0x75,0x72,0x63,0x68,0x61,0x73,0x65,0, - 0x70,0x75,0x72,0x69,0x74,0x79,0, - 0x70,0x75,0x72,0x70,0x6f,0x73,0x65,0, - 0x70,0x75,0x72,0x73,0x65,0, - 0x70,0x75,0x73,0x68,0, - 0x70,0x75,0x74,0, - 0x70,0x75,0x7a,0x7a,0x6c,0x65,0, - 0x70,0x79,0x72,0x61,0x6d,0x69,0x64,0, - 0x71,0x75,0x61,0x6c,0x69,0x74,0x79,0, - 0x71,0x75,0x61,0x6e,0x74,0x75,0x6d,0, - 0x71,0x75,0x61,0x72,0x74,0x65,0x72,0, - 0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0, - 0x71,0x75,0x69,0x63,0x6b,0, - 0x71,0x75,0x69,0x74,0, - 0x71,0x75,0x69,0x7a,0, - 0x71,0x75,0x6f,0x74,0x65,0, - 0x72,0x61,0x62,0x62,0x69,0x74,0, - 0x72,0x61,0x63,0x63,0x6f,0x6f,0x6e,0, - 0x72,0x61,0x63,0x65,0, - 0x72,0x61,0x63,0x6b,0, - 0x72,0x61,0x64,0x61,0x72,0, - 0x72,0x61,0x64,0x69,0x6f,0, - 0x72,0x61,0x69,0x6c,0, - 0x72,0x61,0x69,0x6e,0, - 0x72,0x61,0x69,0x73,0x65,0, - 0x72,0x61,0x6c,0x6c,0x79,0, - 0x72,0x61,0x6d,0x70,0, - 0x72,0x61,0x6e,0x63,0x68,0, - 0x72,0x61,0x6e,0x64,0x6f,0x6d,0, - 0x72,0x61,0x6e,0x67,0x65,0, - 0x72,0x61,0x70,0x69,0x64,0, - 0x72,0x61,0x72,0x65,0, - 0x72,0x61,0x74,0x65,0, - 0x72,0x61,0x74,0x68,0x65,0x72,0, - 0x72,0x61,0x76,0x65,0x6e,0, - 0x72,0x61,0x77,0, - 0x72,0x61,0x7a,0x6f,0x72,0, - 0x72,0x65,0x61,0x64,0x79,0, - 0x72,0x65,0x61,0x6c,0, - 0x72,0x65,0x61,0x73,0x6f,0x6e,0, - 0x72,0x65,0x62,0x65,0x6c,0, - 0x72,0x65,0x62,0x75,0x69,0x6c,0x64,0, - 0x72,0x65,0x63,0x61,0x6c,0x6c,0, - 0x72,0x65,0x63,0x65,0x69,0x76,0x65,0, - 0x72,0x65,0x63,0x69,0x70,0x65,0, - 0x72,0x65,0x63,0x6f,0x72,0x64,0, - 0x72,0x65,0x63,0x79,0x63,0x6c,0x65,0, - 0x72,0x65,0x64,0x75,0x63,0x65,0, - 0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0, - 0x72,0x65,0x66,0x6f,0x72,0x6d,0, - 0x72,0x65,0x66,0x75,0x73,0x65,0, - 0x72,0x65,0x67,0x69,0x6f,0x6e,0, - 0x72,0x65,0x67,0x72,0x65,0x74,0, - 0x72,0x65,0x67,0x75,0x6c,0x61,0x72,0, - 0x72,0x65,0x6a,0x65,0x63,0x74,0, - 0x72,0x65,0x6c,0x61,0x78,0, - 0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0, - 0x72,0x65,0x6c,0x69,0x65,0x66,0, - 0x72,0x65,0x6c,0x79,0, - 0x72,0x65,0x6d,0x61,0x69,0x6e,0, - 0x72,0x65,0x6d,0x65,0x6d,0x62,0x65,0x72,0, - 0x72,0x65,0x6d,0x69,0x6e,0x64,0, - 0x72,0x65,0x6d,0x6f,0x76,0x65,0, - 0x72,0x65,0x6e,0x64,0x65,0x72,0, - 0x72,0x65,0x6e,0x65,0x77,0, - 0x72,0x65,0x6e,0x74,0, - 0x72,0x65,0x6f,0x70,0x65,0x6e,0, - 0x72,0x65,0x70,0x61,0x69,0x72,0, - 0x72,0x65,0x70,0x65,0x61,0x74,0, - 0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0, - 0x72,0x65,0x70,0x6f,0x72,0x74,0, - 0x72,0x65,0x71,0x75,0x69,0x72,0x65,0, - 0x72,0x65,0x73,0x63,0x75,0x65,0, - 0x72,0x65,0x73,0x65,0x6d,0x62,0x6c,0x65,0, - 0x72,0x65,0x73,0x69,0x73,0x74,0, - 0x72,0x65,0x73,0x6f,0x75,0x72,0x63,0x65,0, - 0x72,0x65,0x73,0x70,0x6f,0x6e,0x73,0x65,0, - 0x72,0x65,0x73,0x75,0x6c,0x74,0, - 0x72,0x65,0x74,0x69,0x72,0x65,0, - 0x72,0x65,0x74,0x72,0x65,0x61,0x74,0, - 0x72,0x65,0x74,0x75,0x72,0x6e,0, - 0x72,0x65,0x75,0x6e,0x69,0x6f,0x6e,0, - 0x72,0x65,0x76,0x65,0x61,0x6c,0, - 0x72,0x65,0x76,0x69,0x65,0x77,0, - 0x72,0x65,0x77,0x61,0x72,0x64,0, - 0x72,0x68,0x79,0x74,0x68,0x6d,0, - 0x72,0x69,0x62,0, - 0x72,0x69,0x62,0x62,0x6f,0x6e,0, - 0x72,0x69,0x63,0x65,0, - 0x72,0x69,0x63,0x68,0, - 0x72,0x69,0x64,0x65,0, - 0x72,0x69,0x64,0x67,0x65,0, - 0x72,0x69,0x66,0x6c,0x65,0, - 0x72,0x69,0x67,0x68,0x74,0, - 0x72,0x69,0x67,0x69,0x64,0, - 0x72,0x69,0x6e,0x67,0, - 0x72,0x69,0x6f,0x74,0, - 0x72,0x69,0x70,0x70,0x6c,0x65,0, - 0x72,0x69,0x73,0x6b,0, - 0x72,0x69,0x74,0x75,0x61,0x6c,0, - 0x72,0x69,0x76,0x61,0x6c,0, - 0x72,0x69,0x76,0x65,0x72,0, - 0x72,0x6f,0x61,0x64,0, - 0x72,0x6f,0x61,0x73,0x74,0, - 0x72,0x6f,0x62,0x6f,0x74,0, - 0x72,0x6f,0x62,0x75,0x73,0x74,0, - 0x72,0x6f,0x63,0x6b,0x65,0x74,0, - 0x72,0x6f,0x6d,0x61,0x6e,0x63,0x65,0, - 0x72,0x6f,0x6f,0x66,0, - 0x72,0x6f,0x6f,0x6b,0x69,0x65,0, - 0x72,0x6f,0x6f,0x6d,0, - 0x72,0x6f,0x73,0x65,0, - 0x72,0x6f,0x74,0x61,0x74,0x65,0, - 0x72,0x6f,0x75,0x67,0x68,0, - 0x72,0x6f,0x75,0x6e,0x64,0, - 0x72,0x6f,0x75,0x74,0x65,0, - 0x72,0x6f,0x79,0x61,0x6c,0, - 0x72,0x75,0x62,0x62,0x65,0x72,0, - 0x72,0x75,0x64,0x65,0, - 0x72,0x75,0x67,0, - 0x72,0x75,0x6c,0x65,0, - 0x72,0x75,0x6e,0, - 0x72,0x75,0x6e,0x77,0x61,0x79,0, - 0x72,0x75,0x72,0x61,0x6c,0, - 0x73,0x61,0x64,0, - 0x73,0x61,0x64,0x64,0x6c,0x65,0, - 0x73,0x61,0x64,0x6e,0x65,0x73,0x73,0, - 0x73,0x61,0x66,0x65,0, - 0x73,0x61,0x69,0x6c,0, - 0x73,0x61,0x6c,0x61,0x64,0, - 0x73,0x61,0x6c,0x6d,0x6f,0x6e,0, - 0x73,0x61,0x6c,0x6f,0x6e,0, - 0x73,0x61,0x6c,0x74,0, - 0x73,0x61,0x6c,0x75,0x74,0x65,0, - 0x73,0x61,0x6d,0x65,0, - 0x73,0x61,0x6d,0x70,0x6c,0x65,0, - 0x73,0x61,0x6e,0x64,0, - 0x73,0x61,0x74,0x69,0x73,0x66,0x79,0, - 0x73,0x61,0x74,0x6f,0x73,0x68,0x69,0, - 0x73,0x61,0x75,0x63,0x65,0, - 0x73,0x61,0x75,0x73,0x61,0x67,0x65,0, - 0x73,0x61,0x76,0x65,0, - 0x73,0x61,0x79,0, - 0x73,0x63,0x61,0x6c,0x65,0, - 0x73,0x63,0x61,0x6e,0, - 0x73,0x63,0x61,0x72,0x65,0, - 0x73,0x63,0x61,0x74,0x74,0x65,0x72,0, - 0x73,0x63,0x65,0x6e,0x65,0, - 0x73,0x63,0x68,0x65,0x6d,0x65,0, - 0x73,0x63,0x68,0x6f,0x6f,0x6c,0, - 0x73,0x63,0x69,0x65,0x6e,0x63,0x65,0, - 0x73,0x63,0x69,0x73,0x73,0x6f,0x72,0x73,0, - 0x73,0x63,0x6f,0x72,0x70,0x69,0x6f,0x6e,0, - 0x73,0x63,0x6f,0x75,0x74,0, - 0x73,0x63,0x72,0x61,0x70,0, - 0x73,0x63,0x72,0x65,0x65,0x6e,0, - 0x73,0x63,0x72,0x69,0x70,0x74,0, - 0x73,0x63,0x72,0x75,0x62,0, - 0x73,0x65,0x61,0, - 0x73,0x65,0x61,0x72,0x63,0x68,0, - 0x73,0x65,0x61,0x73,0x6f,0x6e,0, - 0x73,0x65,0x61,0x74,0, - 0x73,0x65,0x63,0x6f,0x6e,0x64,0, - 0x73,0x65,0x63,0x72,0x65,0x74,0, - 0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0, - 0x73,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0, - 0x73,0x65,0x65,0x64,0, - 0x73,0x65,0x65,0x6b,0, - 0x73,0x65,0x67,0x6d,0x65,0x6e,0x74,0, - 0x73,0x65,0x6c,0x65,0x63,0x74,0, - 0x73,0x65,0x6c,0x6c,0, - 0x73,0x65,0x6d,0x69,0x6e,0x61,0x72,0, - 0x73,0x65,0x6e,0x69,0x6f,0x72,0, - 0x73,0x65,0x6e,0x73,0x65,0, - 0x73,0x65,0x6e,0x74,0x65,0x6e,0x63,0x65,0, - 0x73,0x65,0x72,0x69,0x65,0x73,0, - 0x73,0x65,0x72,0x76,0x69,0x63,0x65,0, - 0x73,0x65,0x73,0x73,0x69,0x6f,0x6e,0, - 0x73,0x65,0x74,0x74,0x6c,0x65,0, - 0x73,0x65,0x74,0x75,0x70,0, - 0x73,0x65,0x76,0x65,0x6e,0, - 0x73,0x68,0x61,0x64,0x6f,0x77,0, - 0x73,0x68,0x61,0x66,0x74,0, - 0x73,0x68,0x61,0x6c,0x6c,0x6f,0x77,0, - 0x73,0x68,0x61,0x72,0x65,0, - 0x73,0x68,0x65,0x64,0, - 0x73,0x68,0x65,0x6c,0x6c,0, - 0x73,0x68,0x65,0x72,0x69,0x66,0x66,0, - 0x73,0x68,0x69,0x65,0x6c,0x64,0, - 0x73,0x68,0x69,0x66,0x74,0, - 0x73,0x68,0x69,0x6e,0x65,0, - 0x73,0x68,0x69,0x70,0, - 0x73,0x68,0x69,0x76,0x65,0x72,0, - 0x73,0x68,0x6f,0x63,0x6b,0, - 0x73,0x68,0x6f,0x65,0, - 0x73,0x68,0x6f,0x6f,0x74,0, - 0x73,0x68,0x6f,0x70,0, - 0x73,0x68,0x6f,0x72,0x74,0, - 0x73,0x68,0x6f,0x75,0x6c,0x64,0x65,0x72,0, - 0x73,0x68,0x6f,0x76,0x65,0, - 0x73,0x68,0x72,0x69,0x6d,0x70,0, - 0x73,0x68,0x72,0x75,0x67,0, - 0x73,0x68,0x75,0x66,0x66,0x6c,0x65,0, - 0x73,0x68,0x79,0, - 0x73,0x69,0x62,0x6c,0x69,0x6e,0x67,0, - 0x73,0x69,0x63,0x6b,0, - 0x73,0x69,0x64,0x65,0, - 0x73,0x69,0x65,0x67,0x65,0, - 0x73,0x69,0x67,0x68,0x74,0, - 0x73,0x69,0x67,0x6e,0, - 0x73,0x69,0x6c,0x65,0x6e,0x74,0, - 0x73,0x69,0x6c,0x6b,0, - 0x73,0x69,0x6c,0x6c,0x79,0, - 0x73,0x69,0x6c,0x76,0x65,0x72,0, - 0x73,0x69,0x6d,0x69,0x6c,0x61,0x72,0, - 0x73,0x69,0x6d,0x70,0x6c,0x65,0, - 0x73,0x69,0x6e,0x63,0x65,0, - 0x73,0x69,0x6e,0x67,0, - 0x73,0x69,0x72,0x65,0x6e,0, - 0x73,0x69,0x73,0x74,0x65,0x72,0, - 0x73,0x69,0x74,0x75,0x61,0x74,0x65,0, - 0x73,0x69,0x78,0, - 0x73,0x69,0x7a,0x65,0, - 0x73,0x6b,0x61,0x74,0x65,0, - 0x73,0x6b,0x65,0x74,0x63,0x68,0, - 0x73,0x6b,0x69,0, - 0x73,0x6b,0x69,0x6c,0x6c,0, - 0x73,0x6b,0x69,0x6e,0, - 0x73,0x6b,0x69,0x72,0x74,0, - 0x73,0x6b,0x75,0x6c,0x6c,0, - 0x73,0x6c,0x61,0x62,0, - 0x73,0x6c,0x61,0x6d,0, - 0x73,0x6c,0x65,0x65,0x70,0, - 0x73,0x6c,0x65,0x6e,0x64,0x65,0x72,0, - 0x73,0x6c,0x69,0x63,0x65,0, - 0x73,0x6c,0x69,0x64,0x65,0, - 0x73,0x6c,0x69,0x67,0x68,0x74,0, - 0x73,0x6c,0x69,0x6d,0, - 0x73,0x6c,0x6f,0x67,0x61,0x6e,0, - 0x73,0x6c,0x6f,0x74,0, - 0x73,0x6c,0x6f,0x77,0, - 0x73,0x6c,0x75,0x73,0x68,0, - 0x73,0x6d,0x61,0x6c,0x6c,0, - 0x73,0x6d,0x61,0x72,0x74,0, - 0x73,0x6d,0x69,0x6c,0x65,0, - 0x73,0x6d,0x6f,0x6b,0x65,0, - 0x73,0x6d,0x6f,0x6f,0x74,0x68,0, - 0x73,0x6e,0x61,0x63,0x6b,0, - 0x73,0x6e,0x61,0x6b,0x65,0, - 0x73,0x6e,0x61,0x70,0, - 0x73,0x6e,0x69,0x66,0x66,0, - 0x73,0x6e,0x6f,0x77,0, - 0x73,0x6f,0x61,0x70,0, - 0x73,0x6f,0x63,0x63,0x65,0x72,0, - 0x73,0x6f,0x63,0x69,0x61,0x6c,0, - 0x73,0x6f,0x63,0x6b,0, - 0x73,0x6f,0x64,0x61,0, - 0x73,0x6f,0x66,0x74,0, - 0x73,0x6f,0x6c,0x61,0x72,0, - 0x73,0x6f,0x6c,0x64,0x69,0x65,0x72,0, - 0x73,0x6f,0x6c,0x69,0x64,0, - 0x73,0x6f,0x6c,0x75,0x74,0x69,0x6f,0x6e,0, - 0x73,0x6f,0x6c,0x76,0x65,0, - 0x73,0x6f,0x6d,0x65,0x6f,0x6e,0x65,0, - 0x73,0x6f,0x6e,0x67,0, - 0x73,0x6f,0x6f,0x6e,0, - 0x73,0x6f,0x72,0x72,0x79,0, - 0x73,0x6f,0x72,0x74,0, - 0x73,0x6f,0x75,0x6c,0, - 0x73,0x6f,0x75,0x6e,0x64,0, - 0x73,0x6f,0x75,0x70,0, - 0x73,0x6f,0x75,0x72,0x63,0x65,0, - 0x73,0x6f,0x75,0x74,0x68,0, - 0x73,0x70,0x61,0x63,0x65,0, - 0x73,0x70,0x61,0x72,0x65,0, - 0x73,0x70,0x61,0x74,0x69,0x61,0x6c,0, - 0x73,0x70,0x61,0x77,0x6e,0, - 0x73,0x70,0x65,0x61,0x6b,0, - 0x73,0x70,0x65,0x63,0x69,0x61,0x6c,0, - 0x73,0x70,0x65,0x65,0x64,0, - 0x73,0x70,0x65,0x6c,0x6c,0, - 0x73,0x70,0x65,0x6e,0x64,0, - 0x73,0x70,0x68,0x65,0x72,0x65,0, - 0x73,0x70,0x69,0x63,0x65,0, - 0x73,0x70,0x69,0x64,0x65,0x72,0, - 0x73,0x70,0x69,0x6b,0x65,0, - 0x73,0x70,0x69,0x6e,0, - 0x73,0x70,0x69,0x72,0x69,0x74,0, - 0x73,0x70,0x6c,0x69,0x74,0, - 0x73,0x70,0x6f,0x69,0x6c,0, - 0x73,0x70,0x6f,0x6e,0x73,0x6f,0x72,0, - 0x73,0x70,0x6f,0x6f,0x6e,0, - 0x73,0x70,0x6f,0x72,0x74,0, - 0x73,0x70,0x6f,0x74,0, - 0x73,0x70,0x72,0x61,0x79,0, - 0x73,0x70,0x72,0x65,0x61,0x64,0, - 0x73,0x70,0x72,0x69,0x6e,0x67,0, - 0x73,0x70,0x79,0, - 0x73,0x71,0x75,0x61,0x72,0x65,0, - 0x73,0x71,0x75,0x65,0x65,0x7a,0x65,0, - 0x73,0x71,0x75,0x69,0x72,0x72,0x65,0x6c,0, - 0x73,0x74,0x61,0x62,0x6c,0x65,0, - 0x73,0x74,0x61,0x64,0x69,0x75,0x6d,0, - 0x73,0x74,0x61,0x66,0x66,0, - 0x73,0x74,0x61,0x67,0x65,0, - 0x73,0x74,0x61,0x69,0x72,0x73,0, - 0x73,0x74,0x61,0x6d,0x70,0, - 0x73,0x74,0x61,0x6e,0x64,0, - 0x73,0x74,0x61,0x72,0x74,0, - 0x73,0x74,0x61,0x74,0x65,0, - 0x73,0x74,0x61,0x79,0, - 0x73,0x74,0x65,0x61,0x6b,0, - 0x73,0x74,0x65,0x65,0x6c,0, - 0x73,0x74,0x65,0x6d,0, - 0x73,0x74,0x65,0x70,0, - 0x73,0x74,0x65,0x72,0x65,0x6f,0, - 0x73,0x74,0x69,0x63,0x6b,0, - 0x73,0x74,0x69,0x6c,0x6c,0, - 0x73,0x74,0x69,0x6e,0x67,0, - 0x73,0x74,0x6f,0x63,0x6b,0, - 0x73,0x74,0x6f,0x6d,0x61,0x63,0x68,0, - 0x73,0x74,0x6f,0x6e,0x65,0, - 0x73,0x74,0x6f,0x6f,0x6c,0, - 0x73,0x74,0x6f,0x72,0x79,0, - 0x73,0x74,0x6f,0x76,0x65,0, - 0x73,0x74,0x72,0x61,0x74,0x65,0x67,0x79,0, - 0x73,0x74,0x72,0x65,0x65,0x74,0, - 0x73,0x74,0x72,0x69,0x6b,0x65,0, - 0x73,0x74,0x72,0x6f,0x6e,0x67,0, - 0x73,0x74,0x72,0x75,0x67,0x67,0x6c,0x65,0, - 0x73,0x74,0x75,0x64,0x65,0x6e,0x74,0, - 0x73,0x74,0x75,0x66,0x66,0, - 0x73,0x74,0x75,0x6d,0x62,0x6c,0x65,0, - 0x73,0x74,0x79,0x6c,0x65,0, - 0x73,0x75,0x62,0x6a,0x65,0x63,0x74,0, - 0x73,0x75,0x62,0x6d,0x69,0x74,0, - 0x73,0x75,0x62,0x77,0x61,0x79,0, - 0x73,0x75,0x63,0x63,0x65,0x73,0x73,0, - 0x73,0x75,0x63,0x68,0, - 0x73,0x75,0x64,0x64,0x65,0x6e,0, - 0x73,0x75,0x66,0x66,0x65,0x72,0, - 0x73,0x75,0x67,0x61,0x72,0, - 0x73,0x75,0x67,0x67,0x65,0x73,0x74,0, - 0x73,0x75,0x69,0x74,0, - 0x73,0x75,0x6d,0x6d,0x65,0x72,0, - 0x73,0x75,0x6e,0, - 0x73,0x75,0x6e,0x6e,0x79,0, - 0x73,0x75,0x6e,0x73,0x65,0x74,0, - 0x73,0x75,0x70,0x65,0x72,0, - 0x73,0x75,0x70,0x70,0x6c,0x79,0, - 0x73,0x75,0x70,0x72,0x65,0x6d,0x65,0, - 0x73,0x75,0x72,0x65,0, - 0x73,0x75,0x72,0x66,0x61,0x63,0x65,0, - 0x73,0x75,0x72,0x67,0x65,0, - 0x73,0x75,0x72,0x70,0x72,0x69,0x73,0x65,0, - 0x73,0x75,0x72,0x72,0x6f,0x75,0x6e,0x64,0, - 0x73,0x75,0x72,0x76,0x65,0x79,0, - 0x73,0x75,0x73,0x70,0x65,0x63,0x74,0, - 0x73,0x75,0x73,0x74,0x61,0x69,0x6e,0, - 0x73,0x77,0x61,0x6c,0x6c,0x6f,0x77,0, - 0x73,0x77,0x61,0x6d,0x70,0, - 0x73,0x77,0x61,0x70,0, - 0x73,0x77,0x61,0x72,0x6d,0, - 0x73,0x77,0x65,0x61,0x72,0, - 0x73,0x77,0x65,0x65,0x74,0, - 0x73,0x77,0x69,0x66,0x74,0, - 0x73,0x77,0x69,0x6d,0, - 0x73,0x77,0x69,0x6e,0x67,0, - 0x73,0x77,0x69,0x74,0x63,0x68,0, - 0x73,0x77,0x6f,0x72,0x64,0, - 0x73,0x79,0x6d,0x62,0x6f,0x6c,0, - 0x73,0x79,0x6d,0x70,0x74,0x6f,0x6d,0, - 0x73,0x79,0x72,0x75,0x70,0, - 0x73,0x79,0x73,0x74,0x65,0x6d,0, - 0x74,0x61,0x62,0x6c,0x65,0, - 0x74,0x61,0x63,0x6b,0x6c,0x65,0, - 0x74,0x61,0x67,0, - 0x74,0x61,0x69,0x6c,0, - 0x74,0x61,0x6c,0x65,0x6e,0x74,0, - 0x74,0x61,0x6c,0x6b,0, - 0x74,0x61,0x6e,0x6b,0, - 0x74,0x61,0x70,0x65,0, - 0x74,0x61,0x72,0x67,0x65,0x74,0, - 0x74,0x61,0x73,0x6b,0, - 0x74,0x61,0x73,0x74,0x65,0, - 0x74,0x61,0x74,0x74,0x6f,0x6f,0, - 0x74,0x61,0x78,0x69,0, - 0x74,0x65,0x61,0x63,0x68,0, - 0x74,0x65,0x61,0x6d,0, - 0x74,0x65,0x6c,0x6c,0, - 0x74,0x65,0x6e,0, - 0x74,0x65,0x6e,0x61,0x6e,0x74,0, - 0x74,0x65,0x6e,0x6e,0x69,0x73,0, - 0x74,0x65,0x6e,0x74,0, - 0x74,0x65,0x72,0x6d,0, - 0x74,0x65,0x73,0x74,0, - 0x74,0x65,0x78,0x74,0, - 0x74,0x68,0x61,0x6e,0x6b,0, - 0x74,0x68,0x61,0x74,0, - 0x74,0x68,0x65,0x6d,0x65,0, - 0x74,0x68,0x65,0x6e,0, - 0x74,0x68,0x65,0x6f,0x72,0x79,0, - 0x74,0x68,0x65,0x72,0x65,0, - 0x74,0x68,0x65,0x79,0, - 0x74,0x68,0x69,0x6e,0x67,0, - 0x74,0x68,0x69,0x73,0, - 0x74,0x68,0x6f,0x75,0x67,0x68,0x74,0, - 0x74,0x68,0x72,0x65,0x65,0, - 0x74,0x68,0x72,0x69,0x76,0x65,0, - 0x74,0x68,0x72,0x6f,0x77,0, - 0x74,0x68,0x75,0x6d,0x62,0, - 0x74,0x68,0x75,0x6e,0x64,0x65,0x72,0, - 0x74,0x69,0x63,0x6b,0x65,0x74,0, - 0x74,0x69,0x64,0x65,0, - 0x74,0x69,0x67,0x65,0x72,0, - 0x74,0x69,0x6c,0x74,0, - 0x74,0x69,0x6d,0x62,0x65,0x72,0, - 0x74,0x69,0x6d,0x65,0, - 0x74,0x69,0x6e,0x79,0, - 0x74,0x69,0x70,0, - 0x74,0x69,0x72,0x65,0x64,0, - 0x74,0x69,0x73,0x73,0x75,0x65,0, - 0x74,0x69,0x74,0x6c,0x65,0, - 0x74,0x6f,0x61,0x73,0x74,0, - 0x74,0x6f,0x62,0x61,0x63,0x63,0x6f,0, - 0x74,0x6f,0x64,0x61,0x79,0, - 0x74,0x6f,0x64,0x64,0x6c,0x65,0x72,0, - 0x74,0x6f,0x65,0, - 0x74,0x6f,0x67,0x65,0x74,0x68,0x65,0x72,0, - 0x74,0x6f,0x69,0x6c,0x65,0x74,0, - 0x74,0x6f,0x6b,0x65,0x6e,0, - 0x74,0x6f,0x6d,0x61,0x74,0x6f,0, - 0x74,0x6f,0x6d,0x6f,0x72,0x72,0x6f,0x77,0, - 0x74,0x6f,0x6e,0x65,0, - 0x74,0x6f,0x6e,0x67,0x75,0x65,0, - 0x74,0x6f,0x6e,0x69,0x67,0x68,0x74,0, - 0x74,0x6f,0x6f,0x6c,0, - 0x74,0x6f,0x6f,0x74,0x68,0, - 0x74,0x6f,0x70,0, - 0x74,0x6f,0x70,0x69,0x63,0, - 0x74,0x6f,0x70,0x70,0x6c,0x65,0, - 0x74,0x6f,0x72,0x63,0x68,0, - 0x74,0x6f,0x72,0x6e,0x61,0x64,0x6f,0, - 0x74,0x6f,0x72,0x74,0x6f,0x69,0x73,0x65,0, - 0x74,0x6f,0x73,0x73,0, - 0x74,0x6f,0x74,0x61,0x6c,0, - 0x74,0x6f,0x75,0x72,0x69,0x73,0x74,0, - 0x74,0x6f,0x77,0x61,0x72,0x64,0, - 0x74,0x6f,0x77,0x65,0x72,0, - 0x74,0x6f,0x77,0x6e,0, - 0x74,0x6f,0x79,0, - 0x74,0x72,0x61,0x63,0x6b,0, - 0x74,0x72,0x61,0x64,0x65,0, - 0x74,0x72,0x61,0x66,0x66,0x69,0x63,0, - 0x74,0x72,0x61,0x67,0x69,0x63,0, - 0x74,0x72,0x61,0x69,0x6e,0, - 0x74,0x72,0x61,0x6e,0x73,0x66,0x65,0x72,0, - 0x74,0x72,0x61,0x70,0, - 0x74,0x72,0x61,0x73,0x68,0, - 0x74,0x72,0x61,0x76,0x65,0x6c,0, - 0x74,0x72,0x61,0x79,0, - 0x74,0x72,0x65,0x61,0x74,0, - 0x74,0x72,0x65,0x65,0, - 0x74,0x72,0x65,0x6e,0x64,0, - 0x74,0x72,0x69,0x61,0x6c,0, - 0x74,0x72,0x69,0x62,0x65,0, - 0x74,0x72,0x69,0x63,0x6b,0, - 0x74,0x72,0x69,0x67,0x67,0x65,0x72,0, - 0x74,0x72,0x69,0x6d,0, - 0x74,0x72,0x69,0x70,0, - 0x74,0x72,0x6f,0x70,0x68,0x79,0, - 0x74,0x72,0x6f,0x75,0x62,0x6c,0x65,0, - 0x74,0x72,0x75,0x63,0x6b,0, - 0x74,0x72,0x75,0x65,0, - 0x74,0x72,0x75,0x6c,0x79,0, - 0x74,0x72,0x75,0x6d,0x70,0x65,0x74,0, - 0x74,0x72,0x75,0x73,0x74,0, - 0x74,0x72,0x75,0x74,0x68,0, - 0x74,0x72,0x79,0, - 0x74,0x75,0x62,0x65,0, - 0x74,0x75,0x69,0x74,0x69,0x6f,0x6e,0, - 0x74,0x75,0x6d,0x62,0x6c,0x65,0, - 0x74,0x75,0x6e,0x61,0, - 0x74,0x75,0x6e,0x6e,0x65,0x6c,0, - 0x74,0x75,0x72,0x6b,0x65,0x79,0, - 0x74,0x75,0x72,0x6e,0, - 0x74,0x75,0x72,0x74,0x6c,0x65,0, - 0x74,0x77,0x65,0x6c,0x76,0x65,0, - 0x74,0x77,0x65,0x6e,0x74,0x79,0, - 0x74,0x77,0x69,0x63,0x65,0, - 0x74,0x77,0x69,0x6e,0, - 0x74,0x77,0x69,0x73,0x74,0, - 0x74,0x77,0x6f,0, - 0x74,0x79,0x70,0x65,0, - 0x74,0x79,0x70,0x69,0x63,0x61,0x6c,0, - 0x75,0x67,0x6c,0x79,0, - 0x75,0x6d,0x62,0x72,0x65,0x6c,0x6c,0x61,0, - 0x75,0x6e,0x61,0x62,0x6c,0x65,0, - 0x75,0x6e,0x61,0x77,0x61,0x72,0x65,0, - 0x75,0x6e,0x63,0x6c,0x65,0, - 0x75,0x6e,0x63,0x6f,0x76,0x65,0x72,0, - 0x75,0x6e,0x64,0x65,0x72,0, - 0x75,0x6e,0x64,0x6f,0, - 0x75,0x6e,0x66,0x61,0x69,0x72,0, - 0x75,0x6e,0x66,0x6f,0x6c,0x64,0, - 0x75,0x6e,0x68,0x61,0x70,0x70,0x79,0, - 0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0, - 0x75,0x6e,0x69,0x71,0x75,0x65,0, - 0x75,0x6e,0x69,0x74,0, - 0x75,0x6e,0x69,0x76,0x65,0x72,0x73,0x65,0, - 0x75,0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0, - 0x75,0x6e,0x6c,0x6f,0x63,0x6b,0, - 0x75,0x6e,0x74,0x69,0x6c,0, - 0x75,0x6e,0x75,0x73,0x75,0x61,0x6c,0, - 0x75,0x6e,0x76,0x65,0x69,0x6c,0, - 0x75,0x70,0x64,0x61,0x74,0x65,0, - 0x75,0x70,0x67,0x72,0x61,0x64,0x65,0, - 0x75,0x70,0x68,0x6f,0x6c,0x64,0, - 0x75,0x70,0x6f,0x6e,0, - 0x75,0x70,0x70,0x65,0x72,0, - 0x75,0x70,0x73,0x65,0x74,0, - 0x75,0x72,0x62,0x61,0x6e,0, - 0x75,0x72,0x67,0x65,0, - 0x75,0x73,0x61,0x67,0x65,0, - 0x75,0x73,0x65,0, - 0x75,0x73,0x65,0x64,0, - 0x75,0x73,0x65,0x66,0x75,0x6c,0, - 0x75,0x73,0x65,0x6c,0x65,0x73,0x73,0, - 0x75,0x73,0x75,0x61,0x6c,0, - 0x75,0x74,0x69,0x6c,0x69,0x74,0x79,0, - 0x76,0x61,0x63,0x61,0x6e,0x74,0, - 0x76,0x61,0x63,0x75,0x75,0x6d,0, - 0x76,0x61,0x67,0x75,0x65,0, - 0x76,0x61,0x6c,0x69,0x64,0, - 0x76,0x61,0x6c,0x6c,0x65,0x79,0, - 0x76,0x61,0x6c,0x76,0x65,0, - 0x76,0x61,0x6e,0, - 0x76,0x61,0x6e,0x69,0x73,0x68,0, - 0x76,0x61,0x70,0x6f,0x72,0, - 0x76,0x61,0x72,0x69,0x6f,0x75,0x73,0, - 0x76,0x61,0x73,0x74,0, - 0x76,0x61,0x75,0x6c,0x74,0, - 0x76,0x65,0x68,0x69,0x63,0x6c,0x65,0, - 0x76,0x65,0x6c,0x76,0x65,0x74,0, - 0x76,0x65,0x6e,0x64,0x6f,0x72,0, - 0x76,0x65,0x6e,0x74,0x75,0x72,0x65,0, - 0x76,0x65,0x6e,0x75,0x65,0, - 0x76,0x65,0x72,0x62,0, - 0x76,0x65,0x72,0x69,0x66,0x79,0, - 0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0, - 0x76,0x65,0x72,0x79,0, - 0x76,0x65,0x73,0x73,0x65,0x6c,0, - 0x76,0x65,0x74,0x65,0x72,0x61,0x6e,0, - 0x76,0x69,0x61,0x62,0x6c,0x65,0, - 0x76,0x69,0x62,0x72,0x61,0x6e,0x74,0, - 0x76,0x69,0x63,0x69,0x6f,0x75,0x73,0, - 0x76,0x69,0x63,0x74,0x6f,0x72,0x79,0, - 0x76,0x69,0x64,0x65,0x6f,0, - 0x76,0x69,0x65,0x77,0, - 0x76,0x69,0x6c,0x6c,0x61,0x67,0x65,0, - 0x76,0x69,0x6e,0x74,0x61,0x67,0x65,0, - 0x76,0x69,0x6f,0x6c,0x69,0x6e,0, - 0x76,0x69,0x72,0x74,0x75,0x61,0x6c,0, - 0x76,0x69,0x72,0x75,0x73,0, - 0x76,0x69,0x73,0x61,0, - 0x76,0x69,0x73,0x69,0x74,0, - 0x76,0x69,0x73,0x75,0x61,0x6c,0, - 0x76,0x69,0x74,0x61,0x6c,0, - 0x76,0x69,0x76,0x69,0x64,0, - 0x76,0x6f,0x63,0x61,0x6c,0, - 0x76,0x6f,0x69,0x63,0x65,0, - 0x76,0x6f,0x69,0x64,0, - 0x76,0x6f,0x6c,0x63,0x61,0x6e,0x6f,0, - 0x76,0x6f,0x6c,0x75,0x6d,0x65,0, - 0x76,0x6f,0x74,0x65,0, - 0x76,0x6f,0x79,0x61,0x67,0x65,0, - 0x77,0x61,0x67,0x65,0, - 0x77,0x61,0x67,0x6f,0x6e,0, - 0x77,0x61,0x69,0x74,0, - 0x77,0x61,0x6c,0x6b,0, - 0x77,0x61,0x6c,0x6c,0, - 0x77,0x61,0x6c,0x6e,0x75,0x74,0, - 0x77,0x61,0x6e,0x74,0, - 0x77,0x61,0x72,0x66,0x61,0x72,0x65,0, - 0x77,0x61,0x72,0x6d,0, - 0x77,0x61,0x72,0x72,0x69,0x6f,0x72,0, - 0x77,0x61,0x73,0x68,0, - 0x77,0x61,0x73,0x70,0, - 0x77,0x61,0x73,0x74,0x65,0, - 0x77,0x61,0x74,0x65,0x72,0, - 0x77,0x61,0x76,0x65,0, - 0x77,0x61,0x79,0, - 0x77,0x65,0x61,0x6c,0x74,0x68,0, - 0x77,0x65,0x61,0x70,0x6f,0x6e,0, - 0x77,0x65,0x61,0x72,0, - 0x77,0x65,0x61,0x73,0x65,0x6c,0, - 0x77,0x65,0x61,0x74,0x68,0x65,0x72,0, - 0x77,0x65,0x62,0, - 0x77,0x65,0x64,0x64,0x69,0x6e,0x67,0, - 0x77,0x65,0x65,0x6b,0x65,0x6e,0x64,0, - 0x77,0x65,0x69,0x72,0x64,0, - 0x77,0x65,0x6c,0x63,0x6f,0x6d,0x65,0, - 0x77,0x65,0x73,0x74,0, - 0x77,0x65,0x74,0, - 0x77,0x68,0x61,0x6c,0x65,0, - 0x77,0x68,0x61,0x74,0, - 0x77,0x68,0x65,0x61,0x74,0, - 0x77,0x68,0x65,0x65,0x6c,0, - 0x77,0x68,0x65,0x6e,0, - 0x77,0x68,0x65,0x72,0x65,0, - 0x77,0x68,0x69,0x70,0, - 0x77,0x68,0x69,0x73,0x70,0x65,0x72,0, - 0x77,0x69,0x64,0x65,0, - 0x77,0x69,0x64,0x74,0x68,0, - 0x77,0x69,0x66,0x65,0, - 0x77,0x69,0x6c,0x64,0, - 0x77,0x69,0x6c,0x6c,0, - 0x77,0x69,0x6e,0, - 0x77,0x69,0x6e,0x64,0x6f,0x77,0, - 0x77,0x69,0x6e,0x65,0, - 0x77,0x69,0x6e,0x67,0, - 0x77,0x69,0x6e,0x6b,0, - 0x77,0x69,0x6e,0x6e,0x65,0x72,0, - 0x77,0x69,0x6e,0x74,0x65,0x72,0, - 0x77,0x69,0x72,0x65,0, - 0x77,0x69,0x73,0x64,0x6f,0x6d,0, - 0x77,0x69,0x73,0x65,0, - 0x77,0x69,0x73,0x68,0, - 0x77,0x69,0x74,0x6e,0x65,0x73,0x73,0, - 0x77,0x6f,0x6c,0x66,0, - 0x77,0x6f,0x6d,0x61,0x6e,0, - 0x77,0x6f,0x6e,0x64,0x65,0x72,0, - 0x77,0x6f,0x6f,0x64,0, - 0x77,0x6f,0x6f,0x6c,0, - 0x77,0x6f,0x72,0x64,0, - 0x77,0x6f,0x72,0x6b,0, - 0x77,0x6f,0x72,0x6c,0x64,0, - 0x77,0x6f,0x72,0x72,0x79,0, - 0x77,0x6f,0x72,0x74,0x68,0, - 0x77,0x72,0x61,0x70,0, - 0x77,0x72,0x65,0x63,0x6b,0, - 0x77,0x72,0x65,0x73,0x74,0x6c,0x65,0, - 0x77,0x72,0x69,0x73,0x74,0, - 0x77,0x72,0x69,0x74,0x65,0, - 0x77,0x72,0x6f,0x6e,0x67,0, - 0x79,0x61,0x72,0x64,0, - 0x79,0x65,0x61,0x72,0, - 0x79,0x65,0x6c,0x6c,0x6f,0x77,0, - 0x79,0x6f,0x75,0, - 0x79,0x6f,0x75,0x6e,0x67,0, - 0x79,0x6f,0x75,0x74,0x68,0, - 0x7a,0x65,0x62,0x72,0x61,0, - 0x7a,0x65,0x72,0x6f,0, - 0x7a,0x6f,0x6e,0x65,0, - 0x7a,0x6f,0x6f,0, -}; -#define en ((const char*)en_) -static const char *en_i[] = { - en+0, en+8, en+16, en+21, en+27, en+33, - en+40, en+47, en+56, en+63, en+69, en+76, - en+85, en+93, en+100, en+108, en+113, en+122, - en+130, en+137, en+141, en+148, en+154, en+162, - en+169, en+175, en+179, en+186, en+194, en+201, - en+207, en+213, en+221, en+228, en+236, en+243, - en+250, en+257, en+263, en+267, en+273, en+279, - en+285, en+289, en+293, en+301, en+307, en+313, - en+319, en+327, en+333, en+339, en+343, en+349, - en+355, en+362, en+368, en+374, en+382, en+387, - en+393, en+400, en+408, en+416, en+422, en+429, - en+436, en+444, en+451, en+459, en+465, en+471, - en+477, en+484, en+490, en+499, en+506, en+514, - en+521, en+529, en+537, en+545, en+549, en+555, - en+563, en+570, en+576, en+584, en+590, en+595, - en+602, en+607, en+613, en+619, en+623, en+629, - en+635, en+640, en+647, en+655, en+662, en+669, - en+675, en+679, en+688, en+695, en+703, en+707, - en+714, en+722, en+728, en+735, en+742, en+749, - en+757, en+762, en+769, en+776, en+785, en+793, - en+801, en+807, en+814, en+819, en+826, en+831, - en+838, en+846, en+854, en+860, en+866, en+872, - en+877, en+885, en+891, en+899, en+904, en+909, - en+918, en+924, en+930, en+934, en+942, en+950, - en+955, en+962, en+969, en+976, en+980, en+987, - en+995, en+1002, en+1007, en+1013, en+1020, en+1027, - en+1033, en+1038, en+1045, en+1053, en+1060, en+1065, - en+1072, en+1078, en+1085, en+1092, en+1100, en+1106, - en+1111, en+1117, en+1125, en+1130, en+1137, en+1144, - en+1152, en+1159, en+1167, en+1171, en+1176, en+1181, - en+1189, en+1194, en+1200, en+1207, en+1213, en+1219, - en+1225, en+1233, en+1239, en+1245, en+1251, en+1257, - en+1263, en+1271, en+1278, en+1283, en+1288, en+1294, - en+1300, en+1305, en+1310, en+1315, en+1320, en+1325, - en+1331, en+1336, en+1342, en+1349, en+1356, en+1363, - en+1368, en+1375, en+1382, en+1386, en+1390, en+1398, - en+1404, en+1410, en+1416, en+1422, en+1428, en+1435, - en+1441, en+1448, en+1454, en+1461, en+1467, en+1473, - en+1482, en+1489, en+1496, en+1502, en+1510, en+1516, - en+1522, en+1529, en+1535, en+1542, en+1550, en+1556, - en+1561, en+1566, en+1573, en+1580, en+1587, en+1594, - en+1601, en+1607, en+1611, en+1620, en+1625, en+1632, - en+1638, en+1643, en+1651, en+1657, en+1663, en+1670, - en+1675, en+1680, en+1685, en+1690, en+1697, en+1702, - en+1706, en+1712, en+1719, en+1725, en+1732, en+1738, - en+1745, en+1752, en+1760, en+1768, en+1776, en+1780, - en+1787, en+1792, en+1798, en+1805, en+1811, en+1816, - en+1821, en+1826, en+1833, en+1840, en+1847, en+1851, - en+1859, en+1865, en+1874, en+1881, en+1888, en+1894, - en+1902, en+1907, en+1915, en+1922, en+1929, en+1936, - en+1944, en+1951, en+1959, en+1965, en+1971, en+1980, - en+1987, en+1993, en+2001, en+2008, en+2014, en+2019, - en+2025, en+2031, en+2038, en+2043, en+2050, en+2056, - en+2064, en+2070, en+2076, en+2084, en+2091, en+2098, - en+2106, en+2114, en+2120, en+2126, en+2132, en+2141, - en+2148, en+2156, en+2161, en+2167, en+2173, en+2178, - en+2186, en+2191, en+2196, en+2202, en+2208, en+2215, - en+2221, en+2228, en+2234, en+2240, en+2247, en+2252, - en+2258, en+2263, en+2269, en+2275, en+2281, en+2287, - en+2292, en+2298, en+2306, en+2313, en+2319, en+2325, - en+2333, en+2338, en+2345, en+2350, en+2355, en+2363, - en+2369, en+2376, en+2384, en+2389, en+2397, en+2403, - en+2410, en+2418, en+2426, en+2434, en+2442, en+2451, - en+2459, en+2468, en+2476, en+2485, en+2490, en+2495, - en+2502, en+2507, en+2513, en+2518, en+2523, en+2531, - en+2536, en+2543, en+2549, en+2557, en+2564, en+2571, - en+2578, en+2584, en+2591, en+2597, en+2604, en+2610, - en+2615, en+2621, en+2627, en+2634, en+2640, en+2646, - en+2652, en+2659, en+2665, en+2670, en+2678, en+2684, - en+2690, en+2697, en+2702, en+2708, en+2715, en+2721, - en+2729, en+2735, en+2742, en+2750, en+2757, en+2763, - en+2767, en+2775, en+2780, en+2788, en+2792, en+2801, - en+2809, en+2817, en+2825, en+2831, en+2839, en+2846, - en+2851, en+2857, en+2861, en+2868, en+2873, en+2879, - en+2886, en+2893, en+2898, en+2907, en+2912, en+2916, - en+2921, en+2928, en+2935, en+2942, en+2951, en+2958, - en+2966, en+2975, en+2984, en+2989, en+2997, en+3004, - en+3009, en+3016, en+3022, en+3030, en+3037, en+3044, - en+3051, en+3059, en+3064, en+3071, en+3078, en+3086, - en+3092, en+3099, en+3106, en+3115, en+3122, en+3129, - en+3134, en+3142, en+3150, en+3157, en+3164, en+3172, - en+3179, en+3186, en+3194, en+3199, en+3207, en+3213, - en+3218, en+3225, en+3230, en+3237, en+3245, en+3253, - en+3261, en+3268, en+3277, en+3284, en+3289, en+3298, - en+3307, en+3315, en+3320, en+3328, en+3337, en+3345, - en+3354, en+3361, en+3368, en+3376, en+3382, en+3389, - en+3398, en+3402, en+3407, en+3415, en+3422, en+3429, - en+3436, en+3442, en+3447, en+3452, en+3459, en+3464, - en+3470, en+3477, en+3483, en+3491, en+3496, en+3502, - en+3508, en+3514, en+3520, en+3526, en+3531, en+3537, - en+3542, en+3547, en+3551, en+3556, en+3561, en+3566, - en+3573, en+3578, en+3584, en+3589, en+3595, en+3603, - en+3609, en+3615, en+3621, en+3626, en+3632, en+3639, - en+3644, en+3649, en+3654, en+3662, en+3670, en+3675, - en+3680, en+3688, en+3695, en+3699, en+3705, en+3712, - en+3718, en+3724, en+3733, en+3741, en+3749, en+3758, - en+3767, en+3773, en+3778, en+3785, en+3792, en+3800, - en+3807, en+3815, en+3822, en+3830, en+3836, en+3843, - en+3849, en+3853, en+3861, en+3869, en+3875, en+3882, - en+3890, en+3897, en+3904, en+3912, en+3918, en+3925, - en+3932, en+3939, en+3946, en+3953, en+3959, en+3966, - en+3972, en+3981, en+3989, en+3995, en+4001, en+4005, - en+4011, en+4017, en+4025, en+4031, en+4037, en+4044, - en+4050, en+4058, en+4065, en+4073, en+4080, en+4089, - en+4094, en+4100, en+4107, en+4113, en+4121, en+4128, - en+4137, en+4144, en+4152, en+4159, en+4167, en+4176, - en+4184, en+4192, en+4198, en+4204, en+4209, en+4216, - en+4223, en+4230, en+4237, en+4245, en+4252, en+4260, - en+4267, en+4273, en+4277, en+4285, en+4292, en+4297, - en+4305, en+4310, en+4316, en+4322, en+4327, en+4333, - en+4338, en+4345, en+4352, en+4356, en+4362, en+4370, - en+4375, en+4383, en+4387, en+4393, en+4400, en+4408, - en+4414, en+4423, en+4431, en+4440, en+4448, en+4452, - en+4457, en+4462, en+4469, en+4475, en+4484, en+4490, - en+4496, en+4500, en+4506, en+4514, en+4520, en+4527, - en+4532, en+4537, en+4544, en+4550, en+4555, en+4560, - en+4567, en+4574, en+4579, en+4584, en+4590, en+4597, - en+4602, en+4606, en+4614, en+4618, en+4623, en+4629, - en+4635, en+4640, en+4647, en+4652, en+4659, en+4664, - en+4670, en+4676, en+4682, en+4689, en+4695, en+4701, - en+4705, en+4710, en+4716, en+4720, en+4725, en+4730, - en+4737, en+4742, en+4747, en+4753, en+4760, en+4767, - en+4772, en+4780, en+4786, en+4794, en+4801, en+4808, - en+4814, en+4818, en+4826, en+4832, en+4841, en+4847, - en+4854, en+4861, en+4866, en+4872, en+4878, en+4884, - en+4891, en+4897, en+4902, en+4906, en+4912, en+4920, - en+4925, en+4932, en+4939, en+4944, en+4951, en+4959, - en+4964, en+4968, en+4975, en+4983, en+4990, en+4997, - en+5005, en+5009, en+5014, en+5019, en+5026, en+5032, - en+5037, en+5045, en+5052, en+5058, en+5065, en+5073, - en+5081, en+5087, en+5093, en+5098, en+5105, en+5112, - en+5120, en+5125, en+5130, en+5135, en+5142, en+5148, - en+5154, en+5160, en+5168, en+5174, en+5180, en+5186, - en+5192, en+5197, en+5202, en+5207, en+5215, en+5220, - en+5225, en+5231, en+5239, en+5246, en+5253, en+5260, - en+5265, en+5270, en+5276, en+5282, en+5288, en+5294, - en+5300, en+5308, en+5314, en+5320, en+5325, en+5331, - en+5336, en+5344, en+5350, en+5355, en+5361, en+5367, - en+5373, en+5379, en+5385, en+5392, en+5396, en+5400, - en+5406, en+5411, en+5416, en+5423, en+5431, en+5436, - en+5442, en+5449, en+5454, en+5460, en+5468, en+5472, - en+5477, en+5482, en+5489, en+5494, en+5501, en+5507, - en+5513, en+5522, en+5529, en+5535, en+5542, en+5547, - en+5551, en+5556, en+5563, en+5568, en+5573, en+5578, - en+5582, en+5587, en+5595, en+5601, en+5608, en+5613, - en+5618, en+5626, en+5633, en+5638, en+5644, en+5649, - en+5654, en+5659, en+5666, en+5672, en+5681, en+5686, - en+5692, en+5697, en+5703, en+5707, en+5712, en+5718, - en+5725, en+5731, en+5739, en+5746, en+5751, en+5758, - en+5764, en+5769, en+5777, en+5784, en+5788, en+5793, - en+5798, en+5807, en+5812, en+5819, en+5823, en+5831, - en+5839, en+5845, en+5853, en+5861, en+5868, en+5875, - en+5882, en+5890, en+5898, en+5903, en+5911, en+5918, - en+5927, en+5933, en+5942, en+5949, en+5958, en+5965, - en+5973, en+5980, en+5987, en+5995, en+6003, en+6010, - en+6017, en+6024, en+6030, en+6039, en+6045, en+6053, - en+6060, en+6067, en+6074, en+6082, en+6090, en+6097, - en+6106, en+6111, en+6118, en+6125, en+6133, en+6138, - en+6145, en+6153, en+6159, en+6164, en+6170, en+6177, - en+6184, en+6188, en+6193, en+6201, en+6207, en+6213, - en+6219, en+6223, en+6228, en+6233, en+6241, en+6245, - en+6251, en+6257, en+6262, en+6269, en+6276, en+6281, - en+6286, en+6295, en+6300, en+6305, en+6313, en+6317, - en+6322, en+6326, en+6333, en+6338, en+6346, en+6351, - en+6355, en+6363, en+6368, en+6375, en+6380, en+6385, - en+6391, en+6397, en+6402, en+6406, en+6412, en+6418, - en+6425, en+6430, en+6435, en+6440, en+6449, en+6456, - en+6462, en+6468, en+6474, en+6480, en+6488, en+6493, - en+6497, en+6502, en+6510, en+6516, en+6521, en+6528, - en+6533, en+6539, en+6545, en+6553, en+6558, en+6562, - en+6568, en+6575, en+6583, en+6589, en+6594, en+6601, - en+6606, en+6614, en+6621, en+6628, en+6634, en+6639, - en+6647, en+6655, en+6663, en+6668, en+6673, en+6679, - en+6684, en+6689, en+6695, en+6700, en+6705, en+6712, - en+6717, en+6724, en+6729, en+6736, en+6741, en+6746, - en+6754, en+6760, en+6765, en+6771, en+6778, en+6783, - en+6788, en+6796, en+6801, en+6808, en+6813, en+6819, - en+6825, en+6833, en+6840, en+6846, en+6852, en+6859, - en+6866, en+6874, en+6878, en+6884, en+6891, en+6896, - en+6901, en+6906, en+6912, en+6917, en+6924, en+6928, - en+6935, en+6943, en+6949, en+6957, en+6964, en+6970, - en+6977, en+6983, en+6990, en+6997, en+7004, en+7013, - en+7018, en+7023, en+7030, en+7036, en+7045, en+7050, - en+7057, en+7064, en+7072, en+7077, en+7084, en+7089, - en+7097, en+7102, en+7111, en+7117, en+7123, en+7130, - en+7135, en+7142, en+7149, en+7157, en+7162, en+7168, - en+7174, en+7180, en+7186, en+7191, en+7199, en+7205, - en+7212, en+7219, en+7228, en+7233, en+7241, en+7247, - en+7252, en+7260, en+7266, en+7273, en+7281, en+7288, - en+7295, en+7300, en+7308, en+7312, en+7318, en+7326, - en+7333, en+7339, en+7346, en+7350, en+7357, en+7365, - en+7372, en+7380, en+7386, en+7391, en+7397, en+7402, - en+7410, en+7419, en+7426, en+7433, en+7439, en+7448, - en+7454, en+7459, en+7465, en+7470, en+7477, en+7482, - en+7491, en+7498, en+7505, en+7514, en+7520, en+7525, - en+7532, en+7539, en+7547, en+7552, en+7558, en+7563, - en+7570, en+7577, en+7583, en+7590, en+7597, en+7602, - en+7607, en+7612, en+7621, en+7629, en+7637, en+7644, - en+7650, en+7655, en+7659, en+7667, en+7675, en+7681, - en+7686, en+7691, en+7696, en+7702, en+7708, en+7714, - en+7722, en+7729, en+7736, en+7742, en+7747, en+7755, - en+7760, en+7768, en+7775, en+7781, en+7785, en+7793, - en+7800, en+7806, en+7810, en+7814, en+7819, en+7826, - en+7833, en+7841, en+7849, en+7856, en+7864, en+7870, - en+7876, en+7884, en+7889, en+7893, en+7899, en+7906, - en+7912, en+7916, en+7921, en+7925, en+7931, en+7939, - en+7944, en+7949, en+7953, en+7959, en+7966, en+7971, - en+7976, en+7982, en+7990, en+7997, en+8004, en+8011, - en+8017, en+8025, en+8031, en+8040, en+8046, en+8053, - en+8062, en+8069, en+8077, en+8083, en+8091, en+8097, - en+8104, en+8112, en+8117, en+8122, en+8127, en+8131, - en+8137, en+8144, en+8151, en+8157, en+8162, en+8169, - en+8174, en+8179, en+8186, en+8191, en+8197, en+8203, - en+8209, en+8217, en+8223, en+8230, en+8237, en+8242, - en+8249, en+8255, en+8260, en+8266, en+8271, en+8279, - en+8286, en+8294, en+8300, en+8305, en+8313, en+8319, - en+8326, en+8331, en+8339, en+8347, en+8351, en+8359, - en+8366, en+8373, en+8380, en+8388, en+8395, en+8402, - en+8406, en+8412, en+8418, en+8425, en+8434, en+8440, - en+8447, en+8455, en+8461, en+8465, en+8472, en+8477, - en+8483, en+8488, en+8496, en+8501, en+8508, en+8514, - en+8520, en+8526, en+8533, en+8541, en+8547, en+8552, - en+8559, en+8566, en+8572, en+8577, en+8584, en+8589, - en+8594, en+8600, en+8606, en+8611, en+8618, en+8623, - en+8628, en+8633, en+8641, en+8649, en+8658, en+8667, - en+8672, en+8679, en+8687, en+8695, en+8702, en+8708, - en+8717, en+8724, en+8732, en+8739, en+8747, en+8755, - en+8762, en+8770, en+8776, en+8782, en+8790, en+8796, - en+8805, en+8812, en+8820, en+8826, en+8834, en+8842, - en+8850, en+8857, en+8865, en+8873, en+8881, en+8887, - en+8896, en+8904, en+8912, en+8918, en+8926, en+8933, - en+8941, en+8946, en+8951, en+8957, en+8965, en+8971, - en+8977, en+8983, en+8992, en+8999, en+9007, en+9013, - en+9018, en+9022, en+9029, en+9037, en+9045, en+9053, - en+9061, en+9070, en+9076, en+9081, en+9086, en+9092, - en+9099, en+9107, en+9112, en+9117, en+9123, en+9129, - en+9134, en+9139, en+9145, en+9151, en+9156, en+9162, - en+9169, en+9175, en+9181, en+9186, en+9191, en+9198, - en+9204, en+9208, en+9214, en+9220, en+9225, en+9232, - en+9238, en+9246, en+9253, en+9261, en+9268, en+9275, - en+9283, en+9290, en+9298, en+9305, en+9312, en+9319, - en+9326, en+9334, en+9341, en+9347, en+9355, en+9362, - en+9367, en+9374, en+9383, en+9390, en+9397, en+9404, - en+9410, en+9415, en+9422, en+9429, en+9436, en+9444, - en+9451, en+9459, en+9466, en+9475, en+9482, en+9491, - en+9500, en+9507, en+9514, en+9522, en+9529, en+9537, - en+9544, en+9551, en+9558, en+9565, en+9569, en+9576, - en+9581, en+9586, en+9591, en+9597, en+9603, en+9609, - en+9615, en+9620, en+9625, en+9632, en+9637, en+9644, - en+9650, en+9656, en+9661, en+9667, en+9673, en+9680, - en+9687, en+9695, en+9700, en+9707, en+9712, en+9717, - en+9724, en+9730, en+9736, en+9742, en+9748, en+9755, - en+9760, en+9764, en+9769, en+9773, en+9780, en+9786, - en+9790, en+9797, en+9805, en+9810, en+9815, en+9821, - en+9828, en+9834, en+9839, en+9846, en+9851, en+9858, - en+9863, en+9871, en+9879, en+9885, en+9893, en+9898, - en+9902, en+9908, en+9913, en+9919, en+9927, en+9933, - en+9940, en+9947, en+9955, en+9964, en+9973, en+9979, - en+9985, en+9992, en+9999, en+10005, en+10009, en+10016, - en+10023, en+10028, en+10035, en+10042, en+10050, en+10059, - en+10064, en+10069, en+10077, en+10084, en+10089, en+10097, - en+10104, en+10110, en+10119, en+10126, en+10134, en+10142, - en+10149, en+10155, en+10161, en+10168, en+10174, en+10182, - en+10188, en+10193, en+10199, en+10207, en+10214, en+10220, - en+10226, en+10231, en+10238, en+10244, en+10249, en+10255, - en+10260, en+10266, en+10275, en+10281, en+10288, en+10294, - en+10302, en+10306, en+10314, en+10319, en+10324, en+10330, - en+10336, en+10341, en+10348, en+10353, en+10359, en+10366, - en+10374, en+10381, en+10387, en+10392, en+10398, en+10405, - en+10413, en+10417, en+10422, en+10428, en+10435, en+10439, - en+10445, en+10450, en+10456, en+10462, en+10467, en+10472, - en+10478, en+10486, en+10492, en+10498, en+10505, en+10510, - en+10517, en+10522, en+10527, en+10533, en+10539, en+10545, - en+10551, en+10557, en+10564, en+10570, en+10576, en+10581, - en+10587, en+10592, en+10597, en+10604, en+10611, en+10616, - en+10621, en+10626, en+10632, en+10640, en+10646, en+10655, - en+10661, en+10669, en+10674, en+10679, en+10685, en+10690, - en+10695, en+10701, en+10706, en+10713, en+10719, en+10725, - en+10731, en+10739, en+10745, en+10751, en+10759, en+10765, - en+10771, en+10777, en+10784, en+10790, en+10797, en+10803, - en+10808, en+10815, en+10821, en+10827, en+10835, en+10841, - en+10847, en+10852, en+10858, en+10865, en+10872, en+10876, - en+10883, en+10891, en+10900, en+10907, en+10915, en+10921, - en+10927, en+10934, en+10940, en+10946, en+10952, en+10958, - en+10963, en+10969, en+10975, en+10980, en+10985, en+10992, - en+10998, en+11004, en+11010, en+11016, en+11024, en+11030, - en+11036, en+11042, en+11048, en+11057, en+11064, en+11071, - en+11078, en+11087, en+11095, en+11101, en+11109, en+11115, - en+11123, en+11130, en+11137, en+11145, en+11150, en+11157, - en+11164, en+11170, en+11178, en+11183, en+11190, en+11194, - en+11200, en+11207, en+11213, en+11220, en+11228, en+11233, - en+11241, en+11247, en+11256, en+11265, en+11272, en+11280, - en+11288, en+11296, en+11302, en+11307, en+11313, en+11319, - en+11325, en+11331, en+11336, en+11342, en+11349, en+11355, - en+11362, en+11370, en+11376, en+11383, en+11389, en+11396, - en+11400, en+11405, en+11412, en+11417, en+11422, en+11427, - en+11434, en+11439, en+11445, en+11452, en+11457, en+11463, - en+11468, en+11473, en+11477, en+11484, en+11491, en+11496, - en+11501, en+11506, en+11511, en+11517, en+11522, en+11528, - en+11533, en+11540, en+11546, en+11551, en+11557, en+11562, - en+11570, en+11576, en+11583, en+11589, en+11595, en+11603, - en+11610, en+11615, en+11621, en+11626, en+11633, en+11638, - en+11643, en+11647, en+11653, en+11660, en+11666, en+11672, - en+11680, en+11686, en+11694, en+11698, en+11707, en+11714, - en+11720, en+11727, en+11736, en+11741, en+11748, en+11756, - en+11761, en+11767, en+11771, en+11777, en+11784, en+11790, - en+11798, en+11807, en+11812, en+11818, en+11826, en+11833, - en+11839, en+11844, en+11848, en+11854, en+11860, en+11868, - en+11875, en+11881, en+11890, en+11895, en+11901, en+11908, - en+11913, en+11919, en+11924, en+11930, en+11936, en+11942, - en+11948, en+11956, en+11961, en+11966, en+11973, en+11981, - en+11987, en+11992, en+11998, en+12006, en+12012, en+12018, - en+12022, en+12027, en+12035, en+12042, en+12047, en+12054, - en+12061, en+12066, en+12073, en+12080, en+12087, en+12093, - en+12098, en+12104, en+12108, en+12113, en+12121, en+12126, - en+12135, en+12142, en+12150, en+12156, en+12164, en+12170, - en+12175, en+12182, en+12189, en+12197, en+12205, en+12212, - en+12217, en+12226, en+12234, en+12241, en+12247, en+12255, - en+12262, en+12269, en+12277, en+12284, en+12289, en+12295, - en+12301, en+12307, en+12312, en+12318, en+12322, en+12327, - en+12334, en+12342, en+12348, en+12356, en+12363, en+12370, - en+12376, en+12382, en+12389, en+12395, en+12399, en+12406, - en+12412, en+12420, en+12425, en+12431, en+12439, en+12446, - en+12453, en+12461, en+12467, en+12472, en+12479, en+12487, - en+12492, en+12499, en+12507, en+12514, en+12522, en+12530, - en+12538, en+12544, en+12549, en+12557, en+12565, en+12572, - en+12580, en+12586, en+12591, en+12597, en+12604, en+12610, - en+12616, en+12622, en+12628, en+12633, en+12641, en+12648, - en+12653, en+12660, en+12665, en+12671, en+12676, en+12681, - en+12686, en+12693, en+12698, en+12706, en+12711, en+12719, - en+12724, en+12729, en+12735, en+12741, en+12746, en+12750, - en+12757, en+12764, en+12769, en+12776, en+12784, en+12788, - en+12796, en+12804, en+12810, en+12818, en+12823, en+12827, - en+12833, en+12838, en+12844, en+12850, en+12855, en+12861, - en+12866, en+12874, en+12879, en+12885, en+12890, en+12895, - en+12900, en+12904, en+12911, en+12916, en+12921, en+12926, - en+12933, en+12940, en+12945, en+12952, en+12957, en+12962, - en+12970, en+12975, en+12981, en+12988, en+12993, en+12998, - en+13003, en+13008, en+13014, en+13020, en+13026, en+13031, - en+13037, en+13045, en+13051, en+13057, en+13063, en+13068, - en+13073, en+13080, en+13084, en+13090, en+13096, en+13102, - en+13107, en+13112, en+13116, - }; -#undef en - -static const struct words en_words = { - 2048, - 11, - true, - (const char *)en_, - 0, /* Constant string */ - en_i -}; diff --git a/external/libwally-core/src/data/wordlists/english.txt b/external/libwally-core/src/data/wordlists/english.txt deleted file mode 100644 index 942040ed5..000000000 --- a/external/libwally-core/src/data/wordlists/english.txt +++ /dev/null @@ -1,2048 +0,0 @@ -abandon -ability -able -about -above -absent -absorb -abstract -absurd -abuse -access -accident -account -accuse -achieve -acid -acoustic -acquire -across -act -action -actor -actress -actual -adapt -add -addict -address -adjust -admit -adult -advance -advice -aerobic -affair -afford -afraid -again -age -agent -agree -ahead -aim -air -airport -aisle -alarm -album -alcohol -alert -alien -all -alley -allow -almost -alone -alpha -already -also -alter -always -amateur -amazing -among -amount -amused -analyst -anchor -ancient -anger -angle -angry -animal -ankle -announce -annual -another -answer -antenna -antique -anxiety -any -apart -apology -appear -apple -approve -april -arch -arctic -area -arena -argue -arm -armed -armor -army -around -arrange -arrest -arrive -arrow -art -artefact -artist -artwork -ask -aspect -assault -asset -assist -assume -asthma -athlete -atom -attack -attend -attitude -attract -auction -audit -august -aunt -author -auto -autumn -average -avocado -avoid -awake -aware -away -awesome -awful -awkward -axis -baby -bachelor -bacon -badge -bag -balance -balcony -ball -bamboo -banana -banner -bar -barely -bargain -barrel -base -basic -basket -battle -beach -bean -beauty -because -become -beef -before -begin -behave -behind -believe -below -belt -bench -benefit -best -betray -better -between -beyond -bicycle -bid -bike -bind -biology -bird -birth -bitter -black -blade -blame -blanket -blast -bleak -bless -blind -blood -blossom -blouse -blue -blur -blush -board -boat -body -boil -bomb -bone -bonus -book -boost -border -boring -borrow -boss -bottom -bounce -box -boy -bracket -brain -brand -brass -brave -bread -breeze -brick -bridge -brief -bright -bring -brisk -broccoli -broken -bronze -broom -brother -brown -brush -bubble -buddy -budget -buffalo -build -bulb -bulk -bullet -bundle -bunker -burden -burger -burst -bus -business -busy -butter -buyer -buzz -cabbage -cabin -cable -cactus -cage -cake -call -calm -camera -camp -can -canal -cancel -candy -cannon -canoe -canvas -canyon -capable -capital -captain -car -carbon -card -cargo -carpet -carry -cart -case -cash -casino -castle -casual -cat -catalog -catch -category -cattle -caught -cause -caution -cave -ceiling -celery -cement -census -century -cereal -certain -chair -chalk -champion -change -chaos -chapter -charge -chase -chat -cheap -check -cheese -chef -cherry -chest -chicken -chief -child -chimney -choice -choose -chronic -chuckle -chunk -churn -cigar -cinnamon -circle -citizen -city -civil -claim -clap -clarify -claw -clay -clean -clerk -clever -click -client -cliff -climb -clinic -clip -clock -clog -close -cloth -cloud -clown -club -clump -cluster -clutch -coach -coast -coconut -code -coffee -coil -coin -collect -color -column -combine -come -comfort -comic -common -company -concert -conduct -confirm -congress -connect -consider -control -convince -cook -cool -copper -copy -coral -core -corn -correct -cost -cotton -couch -country -couple -course -cousin -cover -coyote -crack -cradle -craft -cram -crane -crash -crater -crawl -crazy -cream -credit -creek -crew -cricket -crime -crisp -critic -crop -cross -crouch -crowd -crucial -cruel -cruise -crumble -crunch -crush -cry -crystal -cube -culture -cup -cupboard -curious -current -curtain -curve -cushion -custom -cute -cycle -dad -damage -damp -dance -danger -daring -dash -daughter -dawn -day -deal -debate -debris -decade -december -decide -decline -decorate -decrease -deer -defense -define -defy -degree -delay -deliver -demand -demise -denial -dentist -deny -depart -depend -deposit -depth -deputy -derive -describe -desert -design -desk -despair -destroy -detail -detect -develop -device -devote -diagram -dial -diamond -diary -dice -diesel -diet -differ -digital -dignity -dilemma -dinner -dinosaur -direct -dirt -disagree -discover -disease -dish -dismiss -disorder -display -distance -divert -divide -divorce -dizzy -doctor -document -dog -doll -dolphin -domain -donate -donkey -donor -door -dose -double -dove -draft -dragon -drama -drastic -draw -dream -dress -drift -drill -drink -drip -drive -drop -drum -dry -duck -dumb -dune -during -dust -dutch -duty -dwarf -dynamic -eager -eagle -early -earn -earth -easily -east -easy -echo -ecology -economy -edge -edit -educate -effort -egg -eight -either -elbow -elder -electric -elegant -element -elephant -elevator -elite -else -embark -embody -embrace -emerge -emotion -employ -empower -empty -enable -enact -end -endless -endorse -enemy -energy -enforce -engage -engine -enhance -enjoy -enlist -enough -enrich -enroll -ensure -enter -entire -entry -envelope -episode -equal -equip -era -erase -erode -erosion -error -erupt -escape -essay -essence -estate -eternal -ethics -evidence -evil -evoke -evolve -exact -example -excess -exchange -excite -exclude -excuse -execute -exercise -exhaust -exhibit -exile -exist -exit -exotic -expand -expect -expire -explain -expose -express -extend -extra -eye -eyebrow -fabric -face -faculty -fade -faint -faith -fall -false -fame -family -famous -fan -fancy -fantasy -farm -fashion -fat -fatal -father -fatigue -fault -favorite -feature -february -federal -fee -feed -feel -female -fence -festival -fetch -fever -few -fiber -fiction -field -figure -file -film -filter -final -find -fine -finger -finish -fire -firm -first -fiscal -fish -fit -fitness -fix -flag -flame -flash -flat -flavor -flee -flight -flip -float -flock -floor -flower -fluid -flush -fly -foam -focus -fog -foil -fold -follow -food -foot -force -forest -forget -fork -fortune -forum -forward -fossil -foster -found -fox -fragile -frame -frequent -fresh -friend -fringe -frog -front -frost -frown -frozen -fruit -fuel -fun -funny -furnace -fury -future -gadget -gain -galaxy -gallery -game -gap -garage -garbage -garden -garlic -garment -gas -gasp -gate -gather -gauge -gaze -general -genius -genre -gentle -genuine -gesture -ghost -giant -gift -giggle -ginger -giraffe -girl -give -glad -glance -glare -glass -glide -glimpse -globe -gloom -glory -glove -glow -glue -goat -goddess -gold -good -goose -gorilla -gospel -gossip -govern -gown -grab -grace -grain -grant -grape -grass -gravity -great -green -grid -grief -grit -grocery -group -grow -grunt -guard -guess -guide -guilt -guitar -gun -gym -habit -hair -half -hammer -hamster -hand -happy -harbor -hard -harsh -harvest -hat -have -hawk -hazard -head -health -heart -heavy -hedgehog -height -hello -helmet -help -hen -hero -hidden -high -hill -hint -hip -hire -history -hobby -hockey -hold -hole -holiday -hollow -home -honey -hood -hope -horn -horror -horse -hospital -host -hotel -hour -hover -hub -huge -human -humble -humor -hundred -hungry -hunt -hurdle -hurry -hurt -husband -hybrid -ice -icon -idea -identify -idle -ignore -ill -illegal -illness -image -imitate -immense -immune -impact -impose -improve -impulse -inch -include -income -increase -index -indicate -indoor -industry -infant -inflict -inform -inhale -inherit -initial -inject -injury -inmate -inner -innocent -input -inquiry -insane -insect -inside -inspire -install -intact -interest -into -invest -invite -involve -iron -island -isolate -issue -item -ivory -jacket -jaguar -jar -jazz -jealous -jeans -jelly -jewel -job -join -joke -journey -joy -judge -juice -jump -jungle -junior -junk -just -kangaroo -keen -keep -ketchup -key -kick -kid -kidney -kind -kingdom -kiss -kit -kitchen -kite -kitten -kiwi -knee -knife -knock -know -lab -label -labor -ladder -lady -lake -lamp -language -laptop -large -later -latin -laugh -laundry -lava -law -lawn -lawsuit -layer -lazy -leader -leaf -learn -leave -lecture -left -leg -legal -legend -leisure -lemon -lend -length -lens -leopard -lesson -letter -level -liar -liberty -library -license -life -lift -light -like -limb -limit -link -lion -liquid -list -little -live -lizard -load -loan -lobster -local -lock -logic -lonely -long -loop -lottery -loud -lounge -love -loyal -lucky -luggage -lumber -lunar -lunch -luxury -lyrics -machine -mad -magic -magnet -maid -mail -main -major -make -mammal -man -manage -mandate -mango -mansion -manual -maple -marble -march -margin -marine -market -marriage -mask -mass -master -match -material -math -matrix -matter -maximum -maze -meadow -mean -measure -meat -mechanic -medal -media -melody -melt -member -memory -mention -menu -mercy -merge -merit -merry -mesh -message -metal -method -middle -midnight -milk -million -mimic -mind -minimum -minor -minute -miracle -mirror -misery -miss -mistake -mix -mixed -mixture -mobile -model -modify -mom -moment -monitor -monkey -monster -month -moon -moral -more -morning -mosquito -mother -motion -motor -mountain -mouse -move -movie -much -muffin -mule -multiply -muscle -museum -mushroom -music -must -mutual -myself -mystery -myth -naive -name -napkin -narrow -nasty -nation -nature -near -neck -need -negative -neglect -neither -nephew -nerve -nest -net -network -neutral -never -news -next -nice -night -noble -noise -nominee -noodle -normal -north -nose -notable -note -nothing -notice -novel -now -nuclear -number -nurse -nut -oak -obey -object -oblige -obscure -observe -obtain -obvious -occur -ocean -october -odor -off -offer -office -often -oil -okay -old -olive -olympic -omit -once -one -onion -online -only -open -opera -opinion -oppose -option -orange -orbit -orchard -order -ordinary -organ -orient -original -orphan -ostrich -other -outdoor -outer -output -outside -oval -oven -over -own -owner -oxygen -oyster -ozone -pact -paddle -page -pair -palace -palm -panda -panel -panic -panther -paper -parade -parent -park -parrot -party -pass -patch -path -patient -patrol -pattern -pause -pave -payment -peace -peanut -pear -peasant -pelican -pen -penalty -pencil -people -pepper -perfect -permit -person -pet -phone -photo -phrase -physical -piano -picnic -picture -piece -pig -pigeon -pill -pilot -pink -pioneer -pipe -pistol -pitch -pizza -place -planet -plastic -plate -play -please -pledge -pluck -plug -plunge -poem -poet -point -polar -pole -police -pond -pony -pool -popular -portion -position -possible -post -potato -pottery -poverty -powder -power -practice -praise -predict -prefer -prepare -present -pretty -prevent -price -pride -primary -print -priority -prison -private -prize -problem -process -produce -profit -program -project -promote -proof -property -prosper -protect -proud -provide -public -pudding -pull -pulp -pulse -pumpkin -punch -pupil -puppy -purchase -purity -purpose -purse -push -put -puzzle -pyramid -quality -quantum -quarter -question -quick -quit -quiz -quote -rabbit -raccoon -race -rack -radar -radio -rail -rain -raise -rally -ramp -ranch -random -range -rapid -rare -rate -rather -raven -raw -razor -ready -real -reason -rebel -rebuild -recall -receive -recipe -record -recycle -reduce -reflect -reform -refuse -region -regret -regular -reject -relax -release -relief -rely -remain -remember -remind -remove -render -renew -rent -reopen -repair -repeat -replace -report -require -rescue -resemble -resist -resource -response -result -retire -retreat -return -reunion -reveal -review -reward -rhythm -rib -ribbon -rice -rich -ride -ridge -rifle -right -rigid -ring -riot -ripple -risk -ritual -rival -river -road -roast -robot -robust -rocket -romance -roof -rookie -room -rose -rotate -rough -round -route -royal -rubber -rude -rug -rule -run -runway -rural -sad -saddle -sadness -safe -sail -salad -salmon -salon -salt -salute -same -sample -sand -satisfy -satoshi -sauce -sausage -save -say -scale -scan -scare -scatter -scene -scheme -school -science -scissors -scorpion -scout -scrap -screen -script -scrub -sea -search -season -seat -second -secret -section -security -seed -seek -segment -select -sell -seminar -senior -sense -sentence -series -service -session -settle -setup -seven -shadow -shaft -shallow -share -shed -shell -sheriff -shield -shift -shine -ship -shiver -shock -shoe -shoot -shop -short -shoulder -shove -shrimp -shrug -shuffle -shy -sibling -sick -side -siege -sight -sign -silent -silk -silly -silver -similar -simple -since -sing -siren -sister -situate -six -size -skate -sketch -ski -skill -skin -skirt -skull -slab -slam -sleep -slender -slice -slide -slight -slim -slogan -slot -slow -slush -small -smart -smile -smoke -smooth -snack -snake -snap -sniff -snow -soap -soccer -social -sock -soda -soft -solar -soldier -solid -solution -solve -someone -song -soon -sorry -sort -soul -sound -soup -source -south -space -spare -spatial -spawn -speak -special -speed -spell -spend -sphere -spice -spider -spike -spin -spirit -split -spoil -sponsor -spoon -sport -spot -spray -spread -spring -spy -square -squeeze -squirrel -stable -stadium -staff -stage -stairs -stamp -stand -start -state -stay -steak -steel -stem -step -stereo -stick -still -sting -stock -stomach -stone -stool -story -stove -strategy -street -strike -strong -struggle -student -stuff -stumble -style -subject -submit -subway -success -such -sudden -suffer -sugar -suggest -suit -summer -sun -sunny -sunset -super -supply -supreme -sure -surface -surge -surprise -surround -survey -suspect -sustain -swallow -swamp -swap -swarm -swear -sweet -swift -swim -swing -switch -sword -symbol -symptom -syrup -system -table -tackle -tag -tail -talent -talk -tank -tape -target -task -taste -tattoo -taxi -teach -team -tell -ten -tenant -tennis -tent -term -test -text -thank -that -theme -then -theory -there -they -thing -this -thought -three -thrive -throw -thumb -thunder -ticket -tide -tiger -tilt -timber -time -tiny -tip -tired -tissue -title -toast -tobacco -today -toddler -toe -together -toilet -token -tomato -tomorrow -tone -tongue -tonight -tool -tooth -top -topic -topple -torch -tornado -tortoise -toss -total -tourist -toward -tower -town -toy -track -trade -traffic -tragic -train -transfer -trap -trash -travel -tray -treat -tree -trend -trial -tribe -trick -trigger -trim -trip -trophy -trouble -truck -true -truly -trumpet -trust -truth -try -tube -tuition -tumble -tuna -tunnel -turkey -turn -turtle -twelve -twenty -twice -twin -twist -two -type -typical -ugly -umbrella -unable -unaware -uncle -uncover -under -undo -unfair -unfold -unhappy -uniform -unique -unit -universe -unknown -unlock -until -unusual -unveil -update -upgrade -uphold -upon -upper -upset -urban -urge -usage -use -used -useful -useless -usual -utility -vacant -vacuum -vague -valid -valley -valve -van -vanish -vapor -various -vast -vault -vehicle -velvet -vendor -venture -venue -verb -verify -version -very -vessel -veteran -viable -vibrant -vicious -victory -video -view -village -vintage -violin -virtual -virus -visa -visit -visual -vital -vivid -vocal -voice -void -volcano -volume -vote -voyage -wage -wagon -wait -walk -wall -walnut -want -warfare -warm -warrior -wash -wasp -waste -water -wave -way -wealth -weapon -wear -weasel -weather -web -wedding -weekend -weird -welcome -west -wet -whale -what -wheat -wheel -when -where -whip -whisper -wide -width -wife -wild -will -win -window -wine -wing -wink -winner -winter -wire -wisdom -wise -wish -witness -wolf -woman -wonder -wood -wool -word -work -world -worry -worth -wrap -wreck -wrestle -wrist -write -wrong -yard -year -yellow -you -young -youth -zebra -zero -zone -zoo diff --git a/external/libwally-core/src/data/wordlists/french.c b/external/libwally-core/src/data/wordlists/french.c deleted file mode 100644 index 50102a364..000000000 --- a/external/libwally-core/src/data/wordlists/french.c +++ /dev/null @@ -1,2408 +0,0 @@ -/* Generated file - do not edit! */ -#include - -static const unsigned char fr_[] = { - 0x61,0x62,0x61,0x69,0x73,0x73,0x65,0x72,0, - 0x61,0x62,0x61,0x6e,0x64,0x6f,0x6e,0, - 0x61,0x62,0x64,0x69,0x71,0x75,0x65,0x72,0, - 0x61,0x62,0x65,0x69,0x6c,0x6c,0x65,0, - 0x61,0x62,0x6f,0x6c,0x69,0x72,0, - 0x61,0x62,0x6f,0x72,0x64,0x65,0x72,0, - 0x61,0x62,0x6f,0x75,0x74,0x69,0x72,0, - 0x61,0x62,0x6f,0x79,0x65,0x72,0, - 0x61,0x62,0x72,0x61,0x73,0x69,0x66,0, - 0x61,0x62,0x72,0x65,0x75,0x76,0x65,0x72,0, - 0x61,0x62,0x72,0x69,0x74,0x65,0x72,0, - 0x61,0x62,0x72,0x6f,0x67,0x65,0x72,0, - 0x61,0x62,0x72,0x75,0x70,0x74,0, - 0x61,0x62,0x73,0x65,0x6e,0x63,0x65,0, - 0x61,0x62,0x73,0x6f,0x6c,0x75,0, - 0x61,0x62,0x73,0x75,0x72,0x64,0x65,0, - 0x61,0x62,0x75,0x73,0x69,0x66,0, - 0x61,0x62,0x79,0x73,0x73,0x61,0x6c,0, - 0x61,0x63,0x61,0x64,0x65,0xcc,0x81,0x6d,0x69,0x65,0, - 0x61,0x63,0x61,0x6a,0x6f,0x75,0, - 0x61,0x63,0x61,0x72,0x69,0x65,0x6e,0, - 0x61,0x63,0x63,0x61,0x62,0x6c,0x65,0x72,0, - 0x61,0x63,0x63,0x65,0x70,0x74,0x65,0x72,0, - 0x61,0x63,0x63,0x6c,0x61,0x6d,0x65,0x72,0, - 0x61,0x63,0x63,0x6f,0x6c,0x61,0x64,0x65,0, - 0x61,0x63,0x63,0x72,0x6f,0x63,0x68,0x65,0, - 0x61,0x63,0x63,0x75,0x73,0x65,0x72,0, - 0x61,0x63,0x65,0x72,0x62,0x65,0, - 0x61,0x63,0x68,0x61,0x74,0, - 0x61,0x63,0x68,0x65,0x74,0x65,0x72,0, - 0x61,0x63,0x69,0x64,0x75,0x6c,0x65,0x72,0, - 0x61,0x63,0x69,0x65,0x72,0, - 0x61,0x63,0x6f,0x6d,0x70,0x74,0x65,0, - 0x61,0x63,0x71,0x75,0x65,0xcc,0x81,0x72,0x69,0x72,0, - 0x61,0x63,0x72,0x6f,0x6e,0x79,0x6d,0x65,0, - 0x61,0x63,0x74,0x65,0x75,0x72,0, - 0x61,0x63,0x74,0x69,0x66,0, - 0x61,0x63,0x74,0x75,0x65,0x6c,0, - 0x61,0x64,0x65,0x70,0x74,0x65,0, - 0x61,0x64,0x65,0xcc,0x81,0x71,0x75,0x61,0x74,0, - 0x61,0x64,0x68,0x65,0xcc,0x81,0x73,0x69,0x66,0, - 0x61,0x64,0x6a,0x65,0x63,0x74,0x69,0x66,0, - 0x61,0x64,0x6a,0x75,0x67,0x65,0x72,0, - 0x61,0x64,0x6d,0x65,0x74,0x74,0x72,0x65,0, - 0x61,0x64,0x6d,0x69,0x72,0x65,0x72,0, - 0x61,0x64,0x6f,0x70,0x74,0x65,0x72,0, - 0x61,0x64,0x6f,0x72,0x65,0x72,0, - 0x61,0x64,0x6f,0x75,0x63,0x69,0x72,0, - 0x61,0x64,0x72,0x65,0x73,0x73,0x65,0, - 0x61,0x64,0x72,0x6f,0x69,0x74,0, - 0x61,0x64,0x75,0x6c,0x74,0x65,0, - 0x61,0x64,0x76,0x65,0x72,0x62,0x65,0, - 0x61,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x61,0x65,0xcc,0x81,0x72,0x6f,0x6e,0x65,0x66,0, - 0x61,0x66,0x66,0x61,0x69,0x72,0x65,0, - 0x61,0x66,0x66,0x65,0x63,0x74,0x65,0x72,0, - 0x61,0x66,0x66,0x69,0x63,0x68,0x65,0, - 0x61,0x66,0x66,0x72,0x65,0x75,0x78,0, - 0x61,0x66,0x66,0x75,0x62,0x6c,0x65,0x72,0, - 0x61,0x67,0x61,0x63,0x65,0x72,0, - 0x61,0x67,0x65,0x6e,0x63,0x65,0x72,0, - 0x61,0x67,0x69,0x6c,0x65,0, - 0x61,0x67,0x69,0x74,0x65,0x72,0, - 0x61,0x67,0x72,0x61,0x66,0x65,0x72,0, - 0x61,0x67,0x72,0x65,0xcc,0x81,0x61,0x62,0x6c,0x65,0, - 0x61,0x67,0x72,0x75,0x6d,0x65,0, - 0x61,0x69,0x64,0x65,0x72,0, - 0x61,0x69,0x67,0x75,0x69,0x6c,0x6c,0x65,0, - 0x61,0x69,0x6c,0x69,0x65,0x72,0, - 0x61,0x69,0x6d,0x61,0x62,0x6c,0x65,0, - 0x61,0x69,0x73,0x61,0x6e,0x63,0x65,0, - 0x61,0x6a,0x6f,0x75,0x74,0x65,0x72,0, - 0x61,0x6a,0x75,0x73,0x74,0x65,0x72,0, - 0x61,0x6c,0x61,0x72,0x6d,0x65,0x72,0, - 0x61,0x6c,0x63,0x68,0x69,0x6d,0x69,0x65,0, - 0x61,0x6c,0x65,0x72,0x74,0x65,0, - 0x61,0x6c,0x67,0x65,0xcc,0x80,0x62,0x72,0x65,0, - 0x61,0x6c,0x67,0x75,0x65,0, - 0x61,0x6c,0x69,0x65,0xcc,0x81,0x6e,0x65,0x72,0, - 0x61,0x6c,0x69,0x6d,0x65,0x6e,0x74,0, - 0x61,0x6c,0x6c,0x65,0xcc,0x81,0x67,0x65,0x72,0, - 0x61,0x6c,0x6c,0x69,0x61,0x67,0x65,0, - 0x61,0x6c,0x6c,0x6f,0x75,0x65,0x72,0, - 0x61,0x6c,0x6c,0x75,0x6d,0x65,0x72,0, - 0x61,0x6c,0x6f,0x75,0x72,0x64,0x69,0x72,0, - 0x61,0x6c,0x70,0x61,0x67,0x61,0, - 0x61,0x6c,0x74,0x65,0x73,0x73,0x65,0, - 0x61,0x6c,0x76,0x65,0xcc,0x81,0x6f,0x6c,0x65,0, - 0x61,0x6d,0x61,0x74,0x65,0x75,0x72,0, - 0x61,0x6d,0x62,0x69,0x67,0x75,0, - 0x61,0x6d,0x62,0x72,0x65,0, - 0x61,0x6d,0x65,0xcc,0x81,0x6e,0x61,0x67,0x65,0x72,0, - 0x61,0x6d,0x65,0x72,0x74,0x75,0x6d,0x65,0, - 0x61,0x6d,0x69,0x64,0x6f,0x6e,0, - 0x61,0x6d,0x69,0x72,0x61,0x6c,0, - 0x61,0x6d,0x6f,0x72,0x63,0x65,0x72,0, - 0x61,0x6d,0x6f,0x75,0x72,0, - 0x61,0x6d,0x6f,0x76,0x69,0x62,0x6c,0x65,0, - 0x61,0x6d,0x70,0x68,0x69,0x62,0x69,0x65,0, - 0x61,0x6d,0x70,0x6c,0x65,0x75,0x72,0, - 0x61,0x6d,0x75,0x73,0x61,0x6e,0x74,0, - 0x61,0x6e,0x61,0x6c,0x79,0x73,0x65,0, - 0x61,0x6e,0x61,0x70,0x68,0x6f,0x72,0x65,0, - 0x61,0x6e,0x61,0x72,0x63,0x68,0x69,0x65,0, - 0x61,0x6e,0x61,0x74,0x6f,0x6d,0x69,0x65,0, - 0x61,0x6e,0x63,0x69,0x65,0x6e,0, - 0x61,0x6e,0x65,0xcc,0x81,0x61,0x6e,0x74,0x69,0x72,0, - 0x61,0x6e,0x67,0x6c,0x65,0, - 0x61,0x6e,0x67,0x6f,0x69,0x73,0x73,0x65,0, - 0x61,0x6e,0x67,0x75,0x6c,0x65,0x75,0x78,0, - 0x61,0x6e,0x69,0x6d,0x61,0x6c,0, - 0x61,0x6e,0x6e,0x65,0x78,0x65,0x72,0, - 0x61,0x6e,0x6e,0x6f,0x6e,0x63,0x65,0, - 0x61,0x6e,0x6e,0x75,0x65,0x6c,0, - 0x61,0x6e,0x6f,0x64,0x69,0x6e,0, - 0x61,0x6e,0x6f,0x6d,0x61,0x6c,0x69,0x65,0, - 0x61,0x6e,0x6f,0x6e,0x79,0x6d,0x65,0, - 0x61,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0, - 0x61,0x6e,0x74,0x65,0x6e,0x6e,0x65,0, - 0x61,0x6e,0x74,0x69,0x64,0x6f,0x74,0x65,0, - 0x61,0x6e,0x78,0x69,0x65,0x75,0x78,0, - 0x61,0x70,0x61,0x69,0x73,0x65,0x72,0, - 0x61,0x70,0x65,0xcc,0x81,0x72,0x69,0x74,0x69,0x66,0, - 0x61,0x70,0x6c,0x61,0x6e,0x69,0x72,0, - 0x61,0x70,0x6f,0x6c,0x6f,0x67,0x69,0x65,0, - 0x61,0x70,0x70,0x61,0x72,0x65,0x69,0x6c,0, - 0x61,0x70,0x70,0x65,0x6c,0x65,0x72,0, - 0x61,0x70,0x70,0x6f,0x72,0x74,0x65,0x72,0, - 0x61,0x70,0x70,0x75,0x79,0x65,0x72,0, - 0x61,0x71,0x75,0x61,0x72,0x69,0x75,0x6d,0, - 0x61,0x71,0x75,0x65,0x64,0x75,0x63,0, - 0x61,0x72,0x62,0x69,0x74,0x72,0x65,0, - 0x61,0x72,0x62,0x75,0x73,0x74,0x65,0, - 0x61,0x72,0x64,0x65,0x75,0x72,0, - 0x61,0x72,0x64,0x6f,0x69,0x73,0x65,0, - 0x61,0x72,0x67,0x65,0x6e,0x74,0, - 0x61,0x72,0x6c,0x65,0x71,0x75,0x69,0x6e,0, - 0x61,0x72,0x6d,0x61,0x74,0x75,0x72,0x65,0, - 0x61,0x72,0x6d,0x65,0x6d,0x65,0x6e,0x74,0, - 0x61,0x72,0x6d,0x6f,0x69,0x72,0x65,0, - 0x61,0x72,0x6d,0x75,0x72,0x65,0, - 0x61,0x72,0x70,0x65,0x6e,0x74,0x65,0x72,0, - 0x61,0x72,0x72,0x61,0x63,0x68,0x65,0x72,0, - 0x61,0x72,0x72,0x69,0x76,0x65,0x72,0, - 0x61,0x72,0x72,0x6f,0x73,0x65,0x72,0, - 0x61,0x72,0x73,0x65,0x6e,0x69,0x63,0, - 0x61,0x72,0x74,0x65,0xcc,0x81,0x72,0x69,0x65,0x6c,0, - 0x61,0x72,0x74,0x69,0x63,0x6c,0x65,0, - 0x61,0x73,0x70,0x65,0x63,0x74,0, - 0x61,0x73,0x70,0x68,0x61,0x6c,0x74,0x65,0, - 0x61,0x73,0x70,0x69,0x72,0x65,0x72,0, - 0x61,0x73,0x73,0x61,0x75,0x74,0, - 0x61,0x73,0x73,0x65,0x72,0x76,0x69,0x72,0, - 0x61,0x73,0x73,0x69,0x65,0x74,0x74,0x65,0, - 0x61,0x73,0x73,0x6f,0x63,0x69,0x65,0x72,0, - 0x61,0x73,0x73,0x75,0x72,0x65,0x72,0, - 0x61,0x73,0x74,0x69,0x63,0x6f,0x74,0, - 0x61,0x73,0x74,0x72,0x65,0, - 0x61,0x73,0x74,0x75,0x63,0x65,0, - 0x61,0x74,0x65,0x6c,0x69,0x65,0x72,0, - 0x61,0x74,0x6f,0x6d,0x65,0, - 0x61,0x74,0x72,0x69,0x75,0x6d,0, - 0x61,0x74,0x72,0x6f,0x63,0x65,0, - 0x61,0x74,0x74,0x61,0x71,0x75,0x65,0, - 0x61,0x74,0x74,0x65,0x6e,0x74,0x69,0x66,0, - 0x61,0x74,0x74,0x69,0x72,0x65,0x72,0, - 0x61,0x74,0x74,0x72,0x61,0x70,0x65,0x72,0, - 0x61,0x75,0x62,0x61,0x69,0x6e,0x65,0, - 0x61,0x75,0x62,0x65,0x72,0x67,0x65,0, - 0x61,0x75,0x64,0x61,0x63,0x65,0, - 0x61,0x75,0x64,0x69,0x62,0x6c,0x65,0, - 0x61,0x75,0x67,0x75,0x72,0x65,0x72,0, - 0x61,0x75,0x72,0x6f,0x72,0x65,0, - 0x61,0x75,0x74,0x6f,0x6d,0x6e,0x65,0, - 0x61,0x75,0x74,0x72,0x75,0x63,0x68,0x65,0, - 0x61,0x76,0x61,0x6c,0x65,0x72,0, - 0x61,0x76,0x61,0x6e,0x63,0x65,0x72,0, - 0x61,0x76,0x61,0x72,0x69,0x63,0x65,0, - 0x61,0x76,0x65,0x6e,0x69,0x72,0, - 0x61,0x76,0x65,0x72,0x73,0x65,0, - 0x61,0x76,0x65,0x75,0x67,0x6c,0x65,0, - 0x61,0x76,0x69,0x61,0x74,0x65,0x75,0x72,0, - 0x61,0x76,0x69,0x64,0x65,0, - 0x61,0x76,0x69,0x6f,0x6e,0, - 0x61,0x76,0x69,0x73,0x65,0x72,0, - 0x61,0x76,0x6f,0x69,0x6e,0x65,0, - 0x61,0x76,0x6f,0x75,0x65,0x72,0, - 0x61,0x76,0x72,0x69,0x6c,0, - 0x61,0x78,0x69,0x61,0x6c,0, - 0x61,0x78,0x69,0x6f,0x6d,0x65,0, - 0x62,0x61,0x64,0x67,0x65,0, - 0x62,0x61,0x66,0x6f,0x75,0x65,0x72,0, - 0x62,0x61,0x67,0x61,0x67,0x65,0, - 0x62,0x61,0x67,0x75,0x65,0x74,0x74,0x65,0, - 0x62,0x61,0x69,0x67,0x6e,0x61,0x64,0x65,0, - 0x62,0x61,0x6c,0x61,0x6e,0x63,0x65,0x72,0, - 0x62,0x61,0x6c,0x63,0x6f,0x6e,0, - 0x62,0x61,0x6c,0x65,0x69,0x6e,0x65,0, - 0x62,0x61,0x6c,0x69,0x73,0x61,0x67,0x65,0, - 0x62,0x61,0x6d,0x62,0x69,0x6e,0, - 0x62,0x61,0x6e,0x63,0x61,0x69,0x72,0x65,0, - 0x62,0x61,0x6e,0x64,0x61,0x67,0x65,0, - 0x62,0x61,0x6e,0x6c,0x69,0x65,0x75,0x65,0, - 0x62,0x61,0x6e,0x6e,0x69,0x65,0xcc,0x80,0x72,0x65,0, - 0x62,0x61,0x6e,0x71,0x75,0x69,0x65,0x72,0, - 0x62,0x61,0x72,0x62,0x69,0x65,0x72,0, - 0x62,0x61,0x72,0x69,0x6c,0, - 0x62,0x61,0x72,0x6f,0x6e,0, - 0x62,0x61,0x72,0x71,0x75,0x65,0, - 0x62,0x61,0x72,0x72,0x61,0x67,0x65,0, - 0x62,0x61,0x73,0x73,0x69,0x6e,0, - 0x62,0x61,0x73,0x74,0x69,0x6f,0x6e,0, - 0x62,0x61,0x74,0x61,0x69,0x6c,0x6c,0x65,0, - 0x62,0x61,0x74,0x65,0x61,0x75,0, - 0x62,0x61,0x74,0x74,0x65,0x72,0x69,0x65,0, - 0x62,0x61,0x75,0x64,0x72,0x69,0x65,0x72,0, - 0x62,0x61,0x76,0x61,0x72,0x64,0x65,0x72,0, - 0x62,0x65,0x6c,0x65,0x74,0x74,0x65,0, - 0x62,0x65,0xcc,0x81,0x6c,0x69,0x65,0x72,0, - 0x62,0x65,0x6c,0x6f,0x74,0x65,0, - 0x62,0x65,0xcc,0x81,0x6e,0x65,0xcc,0x81,0x66,0x69,0x63,0x65,0, - 0x62,0x65,0x72,0x63,0x65,0x61,0x75,0, - 0x62,0x65,0x72,0x67,0x65,0x72,0, - 0x62,0x65,0x72,0x6c,0x69,0x6e,0x65,0, - 0x62,0x65,0x72,0x6d,0x75,0x64,0x61,0, - 0x62,0x65,0x73,0x61,0x63,0x65,0, - 0x62,0x65,0x73,0x6f,0x67,0x6e,0x65,0, - 0x62,0x65,0xcc,0x81,0x74,0x61,0x69,0x6c,0, - 0x62,0x65,0x75,0x72,0x72,0x65,0, - 0x62,0x69,0x62,0x65,0x72,0x6f,0x6e,0, - 0x62,0x69,0x63,0x79,0x63,0x6c,0x65,0, - 0x62,0x69,0x64,0x75,0x6c,0x65,0, - 0x62,0x69,0x6a,0x6f,0x75,0, - 0x62,0x69,0x6c,0x61,0x6e,0, - 0x62,0x69,0x6c,0x69,0x6e,0x67,0x75,0x65,0, - 0x62,0x69,0x6c,0x6c,0x61,0x72,0x64,0, - 0x62,0x69,0x6e,0x61,0x69,0x72,0x65,0, - 0x62,0x69,0x6f,0x6c,0x6f,0x67,0x69,0x65,0, - 0x62,0x69,0x6f,0x70,0x73,0x69,0x65,0, - 0x62,0x69,0x6f,0x74,0x79,0x70,0x65,0, - 0x62,0x69,0x73,0x63,0x75,0x69,0x74,0, - 0x62,0x69,0x73,0x6f,0x6e,0, - 0x62,0x69,0x73,0x74,0x6f,0x75,0x72,0x69,0, - 0x62,0x69,0x74,0x75,0x6d,0x65,0, - 0x62,0x69,0x7a,0x61,0x72,0x72,0x65,0, - 0x62,0x6c,0x61,0x66,0x61,0x72,0x64,0, - 0x62,0x6c,0x61,0x67,0x75,0x65,0, - 0x62,0x6c,0x61,0x6e,0x63,0x68,0x69,0x72,0, - 0x62,0x6c,0x65,0x73,0x73,0x61,0x6e,0x74,0, - 0x62,0x6c,0x69,0x6e,0x64,0x65,0x72,0, - 0x62,0x6c,0x6f,0x6e,0x64,0, - 0x62,0x6c,0x6f,0x71,0x75,0x65,0x72,0, - 0x62,0x6c,0x6f,0x75,0x73,0x6f,0x6e,0, - 0x62,0x6f,0x62,0x61,0x72,0x64,0, - 0x62,0x6f,0x62,0x69,0x6e,0x65,0, - 0x62,0x6f,0x69,0x72,0x65,0, - 0x62,0x6f,0x69,0x73,0x65,0x72,0, - 0x62,0x6f,0x6c,0x69,0x64,0x65,0, - 0x62,0x6f,0x6e,0x62,0x6f,0x6e,0, - 0x62,0x6f,0x6e,0x64,0x69,0x72,0, - 0x62,0x6f,0x6e,0x68,0x65,0x75,0x72,0, - 0x62,0x6f,0x6e,0x69,0x66,0x69,0x65,0x72,0, - 0x62,0x6f,0x6e,0x75,0x73,0, - 0x62,0x6f,0x72,0x64,0x75,0x72,0x65,0, - 0x62,0x6f,0x72,0x6e,0x65,0, - 0x62,0x6f,0x74,0x74,0x65,0, - 0x62,0x6f,0x75,0x63,0x6c,0x65,0, - 0x62,0x6f,0x75,0x65,0x75,0x78,0, - 0x62,0x6f,0x75,0x67,0x69,0x65,0, - 0x62,0x6f,0x75,0x6c,0x6f,0x6e,0, - 0x62,0x6f,0x75,0x71,0x75,0x69,0x6e,0, - 0x62,0x6f,0x75,0x72,0x73,0x65,0, - 0x62,0x6f,0x75,0x73,0x73,0x6f,0x6c,0x65,0, - 0x62,0x6f,0x75,0x74,0x69,0x71,0x75,0x65,0, - 0x62,0x6f,0x78,0x65,0x75,0x72,0, - 0x62,0x72,0x61,0x6e,0x63,0x68,0x65,0, - 0x62,0x72,0x61,0x73,0x69,0x65,0x72,0, - 0x62,0x72,0x61,0x76,0x65,0, - 0x62,0x72,0x65,0x62,0x69,0x73,0, - 0x62,0x72,0x65,0xcc,0x80,0x63,0x68,0x65,0, - 0x62,0x72,0x65,0x75,0x76,0x61,0x67,0x65,0, - 0x62,0x72,0x69,0x63,0x6f,0x6c,0x65,0x72,0, - 0x62,0x72,0x69,0x67,0x61,0x64,0x65,0, - 0x62,0x72,0x69,0x6c,0x6c,0x61,0x6e,0x74,0, - 0x62,0x72,0x69,0x6f,0x63,0x68,0x65,0, - 0x62,0x72,0x69,0x71,0x75,0x65,0, - 0x62,0x72,0x6f,0x63,0x68,0x75,0x72,0x65,0, - 0x62,0x72,0x6f,0x64,0x65,0x72,0, - 0x62,0x72,0x6f,0x6e,0x7a,0x65,0x72,0, - 0x62,0x72,0x6f,0x75,0x73,0x73,0x65,0, - 0x62,0x72,0x6f,0x79,0x65,0x75,0x72,0, - 0x62,0x72,0x75,0x6d,0x65,0, - 0x62,0x72,0x75,0x73,0x71,0x75,0x65,0, - 0x62,0x72,0x75,0x74,0x61,0x6c,0, - 0x62,0x72,0x75,0x79,0x61,0x6e,0x74,0, - 0x62,0x75,0x66,0x66,0x6c,0x65,0, - 0x62,0x75,0x69,0x73,0x73,0x6f,0x6e,0, - 0x62,0x75,0x6c,0x6c,0x65,0x74,0x69,0x6e,0, - 0x62,0x75,0x72,0x65,0x61,0x75,0, - 0x62,0x75,0x72,0x69,0x6e,0, - 0x62,0x75,0x73,0x74,0x69,0x65,0x72,0, - 0x62,0x75,0x74,0x69,0x6e,0x65,0x72,0, - 0x62,0x75,0x74,0x6f,0x69,0x72,0, - 0x62,0x75,0x76,0x61,0x62,0x6c,0x65,0, - 0x62,0x75,0x76,0x65,0x74,0x74,0x65,0, - 0x63,0x61,0x62,0x61,0x6e,0x6f,0x6e,0, - 0x63,0x61,0x62,0x69,0x6e,0x65,0, - 0x63,0x61,0x63,0x68,0x65,0x74,0x74,0x65,0, - 0x63,0x61,0x64,0x65,0x61,0x75,0, - 0x63,0x61,0x64,0x72,0x65,0, - 0x63,0x61,0x66,0x65,0xcc,0x81,0x69,0x6e,0x65,0, - 0x63,0x61,0x69,0x6c,0x6c,0x6f,0x75,0, - 0x63,0x61,0x69,0x73,0x73,0x6f,0x6e,0, - 0x63,0x61,0x6c,0x63,0x75,0x6c,0x65,0x72,0, - 0x63,0x61,0x6c,0x65,0x70,0x69,0x6e,0, - 0x63,0x61,0x6c,0x69,0x62,0x72,0x65,0, - 0x63,0x61,0x6c,0x6d,0x65,0x72,0, - 0x63,0x61,0x6c,0x6f,0x6d,0x6e,0x69,0x65,0, - 0x63,0x61,0x6c,0x76,0x61,0x69,0x72,0x65,0, - 0x63,0x61,0x6d,0x61,0x72,0x61,0x64,0x65,0, - 0x63,0x61,0x6d,0x65,0xcc,0x81,0x72,0x61,0, - 0x63,0x61,0x6d,0x69,0x6f,0x6e,0, - 0x63,0x61,0x6d,0x70,0x61,0x67,0x6e,0x65,0, - 0x63,0x61,0x6e,0x61,0x6c,0, - 0x63,0x61,0x6e,0x65,0x74,0x6f,0x6e,0, - 0x63,0x61,0x6e,0x6f,0x6e,0, - 0x63,0x61,0x6e,0x74,0x69,0x6e,0x65,0, - 0x63,0x61,0x6e,0x75,0x6c,0x61,0x72,0, - 0x63,0x61,0x70,0x61,0x62,0x6c,0x65,0, - 0x63,0x61,0x70,0x6f,0x72,0x61,0x6c,0, - 0x63,0x61,0x70,0x72,0x69,0x63,0x65,0, - 0x63,0x61,0x70,0x73,0x75,0x6c,0x65,0, - 0x63,0x61,0x70,0x74,0x65,0x72,0, - 0x63,0x61,0x70,0x75,0x63,0x68,0x65,0, - 0x63,0x61,0x72,0x61,0x62,0x69,0x6e,0x65,0, - 0x63,0x61,0x72,0x62,0x6f,0x6e,0x65,0, - 0x63,0x61,0x72,0x65,0x73,0x73,0x65,0x72,0, - 0x63,0x61,0x72,0x69,0x62,0x6f,0x75,0, - 0x63,0x61,0x72,0x6e,0x61,0x67,0x65,0, - 0x63,0x61,0x72,0x6f,0x74,0x74,0x65,0, - 0x63,0x61,0x72,0x72,0x65,0x61,0x75,0, - 0x63,0x61,0x72,0x74,0x6f,0x6e,0, - 0x63,0x61,0x73,0x63,0x61,0x64,0x65,0, - 0x63,0x61,0x73,0x69,0x65,0x72,0, - 0x63,0x61,0x73,0x71,0x75,0x65,0, - 0x63,0x61,0x73,0x73,0x75,0x72,0x65,0, - 0x63,0x61,0x75,0x73,0x65,0x72,0, - 0x63,0x61,0x75,0x74,0x69,0x6f,0x6e,0, - 0x63,0x61,0x76,0x61,0x6c,0x69,0x65,0x72,0, - 0x63,0x61,0x76,0x65,0x72,0x6e,0x65,0, - 0x63,0x61,0x76,0x69,0x61,0x72,0, - 0x63,0x65,0xcc,0x81,0x64,0x69,0x6c,0x6c,0x65,0, - 0x63,0x65,0x69,0x6e,0x74,0x75,0x72,0x65,0, - 0x63,0x65,0xcc,0x81,0x6c,0x65,0x73,0x74,0x65,0, - 0x63,0x65,0x6c,0x6c,0x75,0x6c,0x65,0, - 0x63,0x65,0x6e,0x64,0x72,0x69,0x65,0x72,0, - 0x63,0x65,0x6e,0x73,0x75,0x72,0x65,0x72,0, - 0x63,0x65,0x6e,0x74,0x72,0x61,0x6c,0, - 0x63,0x65,0x72,0x63,0x6c,0x65,0, - 0x63,0x65,0xcc,0x81,0x72,0x65,0xcc,0x81,0x62,0x72,0x61,0x6c,0, - 0x63,0x65,0x72,0x69,0x73,0x65,0, - 0x63,0x65,0x72,0x6e,0x65,0x72,0, - 0x63,0x65,0x72,0x76,0x65,0x61,0x75,0, - 0x63,0x65,0x73,0x73,0x65,0x72,0, - 0x63,0x68,0x61,0x67,0x72,0x69,0x6e,0, - 0x63,0x68,0x61,0x69,0x73,0x65,0, - 0x63,0x68,0x61,0x6c,0x65,0x75,0x72,0, - 0x63,0x68,0x61,0x6d,0x62,0x72,0x65,0, - 0x63,0x68,0x61,0x6e,0x63,0x65,0, - 0x63,0x68,0x61,0x70,0x69,0x74,0x72,0x65,0, - 0x63,0x68,0x61,0x72,0x62,0x6f,0x6e,0, - 0x63,0x68,0x61,0x73,0x73,0x65,0x75,0x72,0, - 0x63,0x68,0x61,0x74,0x6f,0x6e,0, - 0x63,0x68,0x61,0x75,0x73,0x73,0x6f,0x6e,0, - 0x63,0x68,0x61,0x76,0x69,0x72,0x65,0x72,0, - 0x63,0x68,0x65,0x6d,0x69,0x73,0x65,0, - 0x63,0x68,0x65,0x6e,0x69,0x6c,0x6c,0x65,0, - 0x63,0x68,0x65,0xcc,0x81,0x71,0x75,0x69,0x65,0x72,0, - 0x63,0x68,0x65,0x72,0x63,0x68,0x65,0x72,0, - 0x63,0x68,0x65,0x76,0x61,0x6c,0, - 0x63,0x68,0x69,0x65,0x6e,0, - 0x63,0x68,0x69,0x66,0x66,0x72,0x65,0, - 0x63,0x68,0x69,0x67,0x6e,0x6f,0x6e,0, - 0x63,0x68,0x69,0x6d,0x65,0xcc,0x80,0x72,0x65,0, - 0x63,0x68,0x69,0x6f,0x74,0, - 0x63,0x68,0x6c,0x6f,0x72,0x75,0x72,0x65,0, - 0x63,0x68,0x6f,0x63,0x6f,0x6c,0x61,0x74,0, - 0x63,0x68,0x6f,0x69,0x73,0x69,0x72,0, - 0x63,0x68,0x6f,0x73,0x65,0, - 0x63,0x68,0x6f,0x75,0x65,0x74,0x74,0x65,0, - 0x63,0x68,0x72,0x6f,0x6d,0x65,0, - 0x63,0x68,0x75,0x74,0x65,0, - 0x63,0x69,0x67,0x61,0x72,0x65,0, - 0x63,0x69,0x67,0x6f,0x67,0x6e,0x65,0, - 0x63,0x69,0x6d,0x65,0x6e,0x74,0x65,0x72,0, - 0x63,0x69,0x6e,0x65,0xcc,0x81,0x6d,0x61,0, - 0x63,0x69,0x6e,0x74,0x72,0x65,0x72,0, - 0x63,0x69,0x72,0x63,0x75,0x6c,0x65,0x72,0, - 0x63,0x69,0x72,0x65,0x72,0, - 0x63,0x69,0x72,0x71,0x75,0x65,0, - 0x63,0x69,0x74,0x65,0x72,0x6e,0x65,0, - 0x63,0x69,0x74,0x6f,0x79,0x65,0x6e,0, - 0x63,0x69,0x74,0x72,0x6f,0x6e,0, - 0x63,0x69,0x76,0x69,0x6c,0, - 0x63,0x6c,0x61,0x69,0x72,0x6f,0x6e,0, - 0x63,0x6c,0x61,0x6d,0x65,0x75,0x72,0, - 0x63,0x6c,0x61,0x71,0x75,0x65,0x72,0, - 0x63,0x6c,0x61,0x73,0x73,0x65,0, - 0x63,0x6c,0x61,0x76,0x69,0x65,0x72,0, - 0x63,0x6c,0x69,0x65,0x6e,0x74,0, - 0x63,0x6c,0x69,0x67,0x6e,0x65,0x72,0, - 0x63,0x6c,0x69,0x6d,0x61,0x74,0, - 0x63,0x6c,0x69,0x76,0x61,0x67,0x65,0, - 0x63,0x6c,0x6f,0x63,0x68,0x65,0, - 0x63,0x6c,0x6f,0x6e,0x61,0x67,0x65,0, - 0x63,0x6c,0x6f,0x70,0x6f,0x72,0x74,0x65,0, - 0x63,0x6f,0x62,0x61,0x6c,0x74,0, - 0x63,0x6f,0x62,0x72,0x61,0, - 0x63,0x6f,0x63,0x61,0x73,0x73,0x65,0, - 0x63,0x6f,0x63,0x6f,0x74,0x69,0x65,0x72,0, - 0x63,0x6f,0x64,0x65,0x72,0, - 0x63,0x6f,0x64,0x69,0x66,0x69,0x65,0x72,0, - 0x63,0x6f,0x66,0x66,0x72,0x65,0, - 0x63,0x6f,0x67,0x6e,0x65,0x72,0, - 0x63,0x6f,0x68,0x65,0xcc,0x81,0x73,0x69,0x6f,0x6e,0, - 0x63,0x6f,0x69,0x66,0x66,0x65,0x72,0, - 0x63,0x6f,0x69,0x6e,0x63,0x65,0x72,0, - 0x63,0x6f,0x6c,0x65,0xcc,0x80,0x72,0x65,0, - 0x63,0x6f,0x6c,0x69,0x62,0x72,0x69,0, - 0x63,0x6f,0x6c,0x6c,0x69,0x6e,0x65,0, - 0x63,0x6f,0x6c,0x6d,0x61,0x74,0x65,0x72,0, - 0x63,0x6f,0x6c,0x6f,0x6e,0x65,0x6c,0, - 0x63,0x6f,0x6d,0x62,0x61,0x74,0, - 0x63,0x6f,0x6d,0x65,0xcc,0x81,0x64,0x69,0x65,0, - 0x63,0x6f,0x6d,0x6d,0x61,0x6e,0x64,0x65,0, - 0x63,0x6f,0x6d,0x70,0x61,0x63,0x74,0, - 0x63,0x6f,0x6e,0x63,0x65,0x72,0x74,0, - 0x63,0x6f,0x6e,0x64,0x75,0x69,0x72,0x65,0, - 0x63,0x6f,0x6e,0x66,0x69,0x65,0x72,0, - 0x63,0x6f,0x6e,0x67,0x65,0x6c,0x65,0x72,0, - 0x63,0x6f,0x6e,0x6e,0x6f,0x74,0x65,0x72,0, - 0x63,0x6f,0x6e,0x73,0x6f,0x6e,0x6e,0x65,0, - 0x63,0x6f,0x6e,0x74,0x61,0x63,0x74,0, - 0x63,0x6f,0x6e,0x76,0x65,0x78,0x65,0, - 0x63,0x6f,0x70,0x61,0x69,0x6e,0, - 0x63,0x6f,0x70,0x69,0x65,0, - 0x63,0x6f,0x72,0x61,0x69,0x6c,0, - 0x63,0x6f,0x72,0x62,0x65,0x61,0x75,0, - 0x63,0x6f,0x72,0x64,0x61,0x67,0x65,0, - 0x63,0x6f,0x72,0x6e,0x69,0x63,0x68,0x65,0, - 0x63,0x6f,0x72,0x70,0x75,0x73,0, - 0x63,0x6f,0x72,0x72,0x65,0x63,0x74,0, - 0x63,0x6f,0x72,0x74,0x65,0xcc,0x80,0x67,0x65,0, - 0x63,0x6f,0x73,0x6d,0x69,0x71,0x75,0x65,0, - 0x63,0x6f,0x73,0x74,0x75,0x6d,0x65,0, - 0x63,0x6f,0x74,0x6f,0x6e,0, - 0x63,0x6f,0x75,0x64,0x65,0, - 0x63,0x6f,0x75,0x70,0x75,0x72,0x65,0, - 0x63,0x6f,0x75,0x72,0x61,0x67,0x65,0, - 0x63,0x6f,0x75,0x74,0x65,0x61,0x75,0, - 0x63,0x6f,0x75,0x76,0x72,0x69,0x72,0, - 0x63,0x6f,0x79,0x6f,0x74,0x65,0, - 0x63,0x72,0x61,0x62,0x65,0, - 0x63,0x72,0x61,0x69,0x6e,0x74,0x65,0, - 0x63,0x72,0x61,0x76,0x61,0x74,0x65,0, - 0x63,0x72,0x61,0x79,0x6f,0x6e,0, - 0x63,0x72,0x65,0xcc,0x81,0x61,0x74,0x75,0x72,0x65,0, - 0x63,0x72,0x65,0xcc,0x81,0x64,0x69,0x74,0x65,0x72,0, - 0x63,0x72,0x65,0xcc,0x81,0x6d,0x65,0x75,0x78,0, - 0x63,0x72,0x65,0x75,0x73,0x65,0x72,0, - 0x63,0x72,0x65,0x76,0x65,0x74,0x74,0x65,0, - 0x63,0x72,0x69,0x62,0x6c,0x65,0x72,0, - 0x63,0x72,0x69,0x65,0x72,0, - 0x63,0x72,0x69,0x73,0x74,0x61,0x6c,0, - 0x63,0x72,0x69,0x74,0x65,0xcc,0x80,0x72,0x65,0, - 0x63,0x72,0x6f,0x69,0x72,0x65,0, - 0x63,0x72,0x6f,0x71,0x75,0x65,0x72,0, - 0x63,0x72,0x6f,0x74,0x61,0x6c,0x65,0, - 0x63,0x72,0x75,0x63,0x69,0x61,0x6c,0, - 0x63,0x72,0x75,0x65,0x6c,0, - 0x63,0x72,0x79,0x70,0x74,0x65,0x72,0, - 0x63,0x75,0x62,0x69,0x71,0x75,0x65,0, - 0x63,0x75,0x65,0x69,0x6c,0x6c,0x69,0x72,0, - 0x63,0x75,0x69,0x6c,0x6c,0x65,0xcc,0x80,0x72,0x65,0, - 0x63,0x75,0x69,0x73,0x69,0x6e,0x65,0, - 0x63,0x75,0x69,0x76,0x72,0x65,0, - 0x63,0x75,0x6c,0x6d,0x69,0x6e,0x65,0x72,0, - 0x63,0x75,0x6c,0x74,0x69,0x76,0x65,0x72,0, - 0x63,0x75,0x6d,0x75,0x6c,0x65,0x72,0, - 0x63,0x75,0x70,0x69,0x64,0x65,0, - 0x63,0x75,0x72,0x61,0x74,0x69,0x66,0, - 0x63,0x75,0x72,0x73,0x65,0x75,0x72,0, - 0x63,0x79,0x61,0x6e,0x75,0x72,0x65,0, - 0x63,0x79,0x63,0x6c,0x65,0, - 0x63,0x79,0x6c,0x69,0x6e,0x64,0x72,0x65,0, - 0x63,0x79,0x6e,0x69,0x71,0x75,0x65,0, - 0x64,0x61,0x69,0x67,0x6e,0x65,0x72,0, - 0x64,0x61,0x6d,0x69,0x65,0x72,0, - 0x64,0x61,0x6e,0x67,0x65,0x72,0, - 0x64,0x61,0x6e,0x73,0x65,0x75,0x72,0, - 0x64,0x61,0x75,0x70,0x68,0x69,0x6e,0, - 0x64,0x65,0xcc,0x81,0x62,0x61,0x74,0x74,0x72,0x65,0, - 0x64,0x65,0xcc,0x81,0x62,0x69,0x74,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x62,0x6f,0x72,0x64,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x62,0x72,0x69,0x64,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x62,0x75,0x74,0x61,0x6e,0x74,0, - 0x64,0x65,0xcc,0x81,0x63,0x61,0x6c,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x63,0x65,0x6d,0x62,0x72,0x65,0, - 0x64,0x65,0xcc,0x81,0x63,0x68,0x69,0x72,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x63,0x69,0x64,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x63,0x6c,0x61,0x72,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x63,0x6f,0x72,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x63,0x72,0x69,0x72,0x65,0, - 0x64,0x65,0xcc,0x81,0x63,0x75,0x70,0x6c,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x64,0x61,0x6c,0x65,0, - 0x64,0x65,0xcc,0x81,0x64,0x75,0x63,0x74,0x69,0x66,0, - 0x64,0x65,0xcc,0x81,0x65,0x73,0x73,0x65,0, - 0x64,0x65,0xcc,0x81,0x66,0x65,0x6e,0x73,0x69,0x66,0, - 0x64,0x65,0xcc,0x81,0x66,0x69,0x6c,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x66,0x72,0x61,0x79,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x67,0x61,0x67,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x67,0x69,0x76,0x72,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x67,0x6c,0x75,0x74,0x69,0x72,0, - 0x64,0x65,0xcc,0x81,0x67,0x72,0x61,0x66,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x6a,0x65,0x75,0x6e,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x6c,0x69,0x63,0x65,0, - 0x64,0x65,0xcc,0x81,0x6c,0x6f,0x67,0x65,0x72,0, - 0x64,0x65,0x6d,0x61,0x6e,0x64,0x65,0x72,0, - 0x64,0x65,0x6d,0x65,0x75,0x72,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x6d,0x6f,0x6c,0x69,0x72,0, - 0x64,0x65,0xcc,0x81,0x6e,0x69,0x63,0x68,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x6e,0x6f,0x75,0x65,0x72,0, - 0x64,0x65,0x6e,0x74,0x65,0x6c,0x6c,0x65,0, - 0x64,0x65,0xcc,0x81,0x6e,0x75,0x64,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x70,0x61,0x72,0x74,0, - 0x64,0x65,0xcc,0x81,0x70,0x65,0x6e,0x73,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x70,0x68,0x61,0x73,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x70,0x6c,0x61,0x63,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x70,0x6f,0x73,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x72,0x61,0x6e,0x67,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x72,0x6f,0x62,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x73,0x61,0x73,0x74,0x72,0x65,0, - 0x64,0x65,0x73,0x63,0x65,0x6e,0x74,0x65,0, - 0x64,0x65,0xcc,0x81,0x73,0x65,0x72,0x74,0, - 0x64,0x65,0xcc,0x81,0x73,0x69,0x67,0x6e,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x73,0x6f,0x62,0x65,0xcc,0x81,0x69,0x72,0, - 0x64,0x65,0x73,0x73,0x69,0x6e,0x65,0x72,0, - 0x64,0x65,0x73,0x74,0x72,0x69,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x74,0x61,0x63,0x68,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x74,0x65,0x73,0x74,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x74,0x6f,0x75,0x72,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x74,0x72,0x65,0x73,0x73,0x65,0, - 0x64,0x65,0x76,0x61,0x6e,0x63,0x65,0x72,0, - 0x64,0x65,0x76,0x65,0x6e,0x69,0x72,0, - 0x64,0x65,0x76,0x69,0x6e,0x65,0x72,0, - 0x64,0x65,0x76,0x6f,0x69,0x72,0, - 0x64,0x69,0x61,0x62,0x6c,0x65,0, - 0x64,0x69,0x61,0x6c,0x6f,0x67,0x75,0x65,0, - 0x64,0x69,0x61,0x6d,0x61,0x6e,0x74,0, - 0x64,0x69,0x63,0x74,0x65,0x72,0, - 0x64,0x69,0x66,0x66,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x64,0x69,0x67,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x64,0x69,0x67,0x69,0x74,0x61,0x6c,0, - 0x64,0x69,0x67,0x6e,0x65,0, - 0x64,0x69,0x6c,0x75,0x65,0x72,0, - 0x64,0x69,0x6d,0x61,0x6e,0x63,0x68,0x65,0, - 0x64,0x69,0x6d,0x69,0x6e,0x75,0x65,0x72,0, - 0x64,0x69,0x6f,0x78,0x79,0x64,0x65,0, - 0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x66,0, - 0x64,0x69,0x72,0x69,0x67,0x65,0x72,0, - 0x64,0x69,0x73,0x63,0x75,0x74,0x65,0x72,0, - 0x64,0x69,0x73,0x70,0x6f,0x73,0x65,0x72,0, - 0x64,0x69,0x73,0x73,0x69,0x70,0x65,0x72,0, - 0x64,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0, - 0x64,0x69,0x76,0x65,0x72,0x74,0x69,0x72,0, - 0x64,0x69,0x76,0x69,0x73,0x65,0x72,0, - 0x64,0x6f,0x63,0x69,0x6c,0x65,0, - 0x64,0x6f,0x63,0x74,0x65,0x75,0x72,0, - 0x64,0x6f,0x67,0x6d,0x65,0, - 0x64,0x6f,0x69,0x67,0x74,0, - 0x64,0x6f,0x6d,0x61,0x69,0x6e,0x65,0, - 0x64,0x6f,0x6d,0x69,0x63,0x69,0x6c,0x65,0, - 0x64,0x6f,0x6d,0x70,0x74,0x65,0x72,0, - 0x64,0x6f,0x6e,0x61,0x74,0x65,0x75,0x72,0, - 0x64,0x6f,0x6e,0x6a,0x6f,0x6e,0, - 0x64,0x6f,0x6e,0x6e,0x65,0x72,0, - 0x64,0x6f,0x70,0x61,0x6d,0x69,0x6e,0x65,0, - 0x64,0x6f,0x72,0x74,0x6f,0x69,0x72,0, - 0x64,0x6f,0x72,0x75,0x72,0x65,0, - 0x64,0x6f,0x73,0x61,0x67,0x65,0, - 0x64,0x6f,0x73,0x65,0x75,0x72,0, - 0x64,0x6f,0x73,0x73,0x69,0x65,0x72,0, - 0x64,0x6f,0x74,0x61,0x74,0x69,0x6f,0x6e,0, - 0x64,0x6f,0x75,0x61,0x6e,0x69,0x65,0x72,0, - 0x64,0x6f,0x75,0x62,0x6c,0x65,0, - 0x64,0x6f,0x75,0x63,0x65,0x75,0x72,0, - 0x64,0x6f,0x75,0x74,0x65,0x72,0, - 0x64,0x6f,0x79,0x65,0x6e,0, - 0x64,0x72,0x61,0x67,0x6f,0x6e,0, - 0x64,0x72,0x61,0x70,0x65,0x72,0, - 0x64,0x72,0x65,0x73,0x73,0x65,0x72,0, - 0x64,0x72,0x69,0x62,0x62,0x6c,0x65,0x72,0, - 0x64,0x72,0x6f,0x69,0x74,0x75,0x72,0x65,0, - 0x64,0x75,0x70,0x65,0x72,0x69,0x65,0, - 0x64,0x75,0x70,0x6c,0x65,0x78,0x65,0, - 0x64,0x75,0x72,0x61,0x62,0x6c,0x65,0, - 0x64,0x75,0x72,0x63,0x69,0x72,0, - 0x64,0x79,0x6e,0x61,0x73,0x74,0x69,0x65,0, - 0x65,0xcc,0x81,0x62,0x6c,0x6f,0x75,0x69,0x72,0, - 0x65,0xcc,0x81,0x63,0x61,0x72,0x74,0x65,0x72,0, - 0x65,0xcc,0x81,0x63,0x68,0x61,0x72,0x70,0x65,0, - 0x65,0xcc,0x81,0x63,0x68,0x65,0x6c,0x6c,0x65,0, - 0x65,0xcc,0x81,0x63,0x6c,0x61,0x69,0x72,0x65,0x72,0, - 0x65,0xcc,0x81,0x63,0x6c,0x69,0x70,0x73,0x65,0, - 0x65,0xcc,0x81,0x63,0x6c,0x6f,0x72,0x65,0, - 0x65,0xcc,0x81,0x63,0x6c,0x75,0x73,0x65,0, - 0x65,0xcc,0x81,0x63,0x6f,0x6c,0x65,0, - 0x65,0xcc,0x81,0x63,0x6f,0x6e,0x6f,0x6d,0x69,0x65,0, - 0x65,0xcc,0x81,0x63,0x6f,0x72,0x63,0x65,0, - 0x65,0xcc,0x81,0x63,0x6f,0x75,0x74,0x65,0x72,0, - 0x65,0xcc,0x81,0x63,0x72,0x61,0x73,0x65,0x72,0, - 0x65,0xcc,0x81,0x63,0x72,0x65,0xcc,0x81,0x6d,0x65,0x72,0, - 0x65,0xcc,0x81,0x63,0x72,0x69,0x76,0x61,0x69,0x6e,0, - 0x65,0xcc,0x81,0x63,0x72,0x6f,0x75,0, - 0x65,0xcc,0x81,0x63,0x75,0x6d,0x65,0, - 0x65,0xcc,0x81,0x63,0x75,0x72,0x65,0x75,0x69,0x6c,0, - 0x65,0xcc,0x81,0x64,0x69,0x66,0x69,0x65,0x72,0, - 0x65,0xcc,0x81,0x64,0x75,0x71,0x75,0x65,0x72,0, - 0x65,0x66,0x66,0x61,0x63,0x65,0x72,0, - 0x65,0x66,0x66,0x65,0x63,0x74,0x69,0x66,0, - 0x65,0x66,0x66,0x69,0x67,0x69,0x65,0, - 0x65,0x66,0x66,0x6f,0x72,0x74,0, - 0x65,0x66,0x66,0x72,0x61,0x79,0x65,0x72,0, - 0x65,0x66,0x66,0x75,0x73,0x69,0x6f,0x6e,0, - 0x65,0xcc,0x81,0x67,0x61,0x6c,0x69,0x73,0x65,0x72,0, - 0x65,0xcc,0x81,0x67,0x61,0x72,0x65,0x72,0, - 0x65,0xcc,0x81,0x6a,0x65,0x63,0x74,0x65,0x72,0, - 0x65,0xcc,0x81,0x6c,0x61,0x62,0x6f,0x72,0x65,0x72,0, - 0x65,0xcc,0x81,0x6c,0x61,0x72,0x67,0x69,0x72,0, - 0x65,0xcc,0x81,0x6c,0x65,0x63,0x74,0x72,0x6f,0x6e,0, - 0x65,0xcc,0x81,0x6c,0x65,0xcc,0x81,0x67,0x61,0x6e,0x74,0, - 0x65,0xcc,0x81,0x6c,0x65,0xcc,0x81,0x70,0x68,0x61,0x6e,0x74,0, - 0x65,0xcc,0x81,0x6c,0x65,0xcc,0x80,0x76,0x65,0, - 0x65,0xcc,0x81,0x6c,0x69,0x67,0x69,0x62,0x6c,0x65,0, - 0x65,0xcc,0x81,0x6c,0x69,0x74,0x69,0x73,0x6d,0x65,0, - 0x65,0xcc,0x81,0x6c,0x6f,0x67,0x65,0, - 0x65,0xcc,0x81,0x6c,0x75,0x63,0x69,0x64,0x65,0x72,0, - 0x65,0xcc,0x81,0x6c,0x75,0x64,0x65,0x72,0, - 0x65,0x6d,0x62,0x61,0x6c,0x6c,0x65,0x72,0, - 0x65,0x6d,0x62,0x65,0x6c,0x6c,0x69,0x72,0, - 0x65,0x6d,0x62,0x72,0x79,0x6f,0x6e,0, - 0x65,0xcc,0x81,0x6d,0x65,0x72,0x61,0x75,0x64,0x65,0, - 0x65,0xcc,0x81,0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0, - 0x65,0x6d,0x6d,0x65,0x6e,0x65,0x72,0, - 0x65,0xcc,0x81,0x6d,0x6f,0x74,0x69,0x6f,0x6e,0, - 0x65,0xcc,0x81,0x6d,0x6f,0x75,0x76,0x6f,0x69,0x72,0, - 0x65,0x6d,0x70,0x65,0x72,0x65,0x75,0x72,0, - 0x65,0x6d,0x70,0x6c,0x6f,0x79,0x65,0x72,0, - 0x65,0x6d,0x70,0x6f,0x72,0x74,0x65,0x72,0, - 0x65,0x6d,0x70,0x72,0x69,0x73,0x65,0, - 0x65,0xcc,0x81,0x6d,0x75,0x6c,0x73,0x69,0x6f,0x6e,0, - 0x65,0x6e,0x63,0x61,0x64,0x72,0x65,0x72,0, - 0x65,0x6e,0x63,0x68,0x65,0xcc,0x80,0x72,0x65,0, - 0x65,0x6e,0x63,0x6c,0x61,0x76,0x65,0, - 0x65,0x6e,0x63,0x6f,0x63,0x68,0x65,0, - 0x65,0x6e,0x64,0x69,0x67,0x75,0x65,0x72,0, - 0x65,0x6e,0x64,0x6f,0x73,0x73,0x65,0x72,0, - 0x65,0x6e,0x64,0x72,0x6f,0x69,0x74,0, - 0x65,0x6e,0x64,0x75,0x69,0x72,0x65,0, - 0x65,0xcc,0x81,0x6e,0x65,0x72,0x67,0x69,0x65,0, - 0x65,0x6e,0x66,0x61,0x6e,0x63,0x65,0, - 0x65,0x6e,0x66,0x65,0x72,0x6d,0x65,0x72,0, - 0x65,0x6e,0x66,0x6f,0x75,0x69,0x72,0, - 0x65,0x6e,0x67,0x61,0x67,0x65,0x72,0, - 0x65,0x6e,0x67,0x69,0x6e,0, - 0x65,0x6e,0x67,0x6c,0x6f,0x62,0x65,0x72,0, - 0x65,0xcc,0x81,0x6e,0x69,0x67,0x6d,0x65,0, - 0x65,0x6e,0x6a,0x61,0x6d,0x62,0x65,0x72,0, - 0x65,0x6e,0x6a,0x65,0x75,0, - 0x65,0x6e,0x6c,0x65,0x76,0x65,0x72,0, - 0x65,0x6e,0x6e,0x65,0x6d,0x69,0, - 0x65,0x6e,0x6e,0x75,0x79,0x65,0x75,0x78,0, - 0x65,0x6e,0x72,0x69,0x63,0x68,0x69,0x72,0, - 0x65,0x6e,0x72,0x6f,0x62,0x61,0x67,0x65,0, - 0x65,0x6e,0x73,0x65,0x69,0x67,0x6e,0x65,0, - 0x65,0x6e,0x74,0x61,0x73,0x73,0x65,0x72,0, - 0x65,0x6e,0x74,0x65,0x6e,0x64,0x72,0x65,0, - 0x65,0x6e,0x74,0x69,0x65,0x72,0, - 0x65,0x6e,0x74,0x6f,0x75,0x72,0x65,0x72,0, - 0x65,0x6e,0x74,0x72,0x61,0x76,0x65,0x72,0, - 0x65,0xcc,0x81,0x6e,0x75,0x6d,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x65,0x6e,0x76,0x61,0x68,0x69,0x72,0, - 0x65,0x6e,0x76,0x69,0x61,0x62,0x6c,0x65,0, - 0x65,0x6e,0x76,0x6f,0x79,0x65,0x72,0, - 0x65,0x6e,0x7a,0x79,0x6d,0x65,0, - 0x65,0xcc,0x81,0x6f,0x6c,0x69,0x65,0x6e,0, - 0x65,0xcc,0x81,0x70,0x61,0x69,0x73,0x73,0x69,0x72,0, - 0x65,0xcc,0x81,0x70,0x61,0x72,0x67,0x6e,0x65,0, - 0x65,0xcc,0x81,0x70,0x61,0x74,0x61,0x6e,0x74,0, - 0x65,0xcc,0x81,0x70,0x61,0x75,0x6c,0x65,0, - 0x65,0xcc,0x81,0x70,0x69,0x63,0x65,0x72,0x69,0x65,0, - 0x65,0xcc,0x81,0x70,0x69,0x64,0x65,0xcc,0x81,0x6d,0x69,0x65,0, - 0x65,0xcc,0x81,0x70,0x69,0x65,0x72,0, - 0x65,0xcc,0x81,0x70,0x69,0x6c,0x6f,0x67,0x75,0x65,0, - 0x65,0xcc,0x81,0x70,0x69,0x6e,0x65,0, - 0x65,0xcc,0x81,0x70,0x69,0x73,0x6f,0x64,0x65,0, - 0x65,0xcc,0x81,0x70,0x69,0x74,0x61,0x70,0x68,0x65,0, - 0x65,0xcc,0x81,0x70,0x6f,0x71,0x75,0x65,0, - 0x65,0xcc,0x81,0x70,0x72,0x65,0x75,0x76,0x65,0, - 0x65,0xcc,0x81,0x70,0x72,0x6f,0x75,0x76,0x65,0x72,0, - 0x65,0xcc,0x81,0x70,0x75,0x69,0x73,0x61,0x6e,0x74,0, - 0x65,0xcc,0x81,0x71,0x75,0x65,0x72,0x72,0x65,0, - 0x65,0xcc,0x81,0x71,0x75,0x69,0x70,0x65,0, - 0x65,0xcc,0x81,0x72,0x69,0x67,0x65,0x72,0, - 0x65,0xcc,0x81,0x72,0x6f,0x73,0x69,0x6f,0x6e,0, - 0x65,0x72,0x72,0x65,0x75,0x72,0, - 0x65,0xcc,0x81,0x72,0x75,0x70,0x74,0x69,0x6f,0x6e,0, - 0x65,0x73,0x63,0x61,0x6c,0x69,0x65,0x72,0, - 0x65,0x73,0x70,0x61,0x64,0x6f,0x6e,0, - 0x65,0x73,0x70,0x65,0xcc,0x80,0x63,0x65,0, - 0x65,0x73,0x70,0x69,0x65,0xcc,0x80,0x67,0x6c,0x65,0, - 0x65,0x73,0x70,0x6f,0x69,0x72,0, - 0x65,0x73,0x70,0x72,0x69,0x74,0, - 0x65,0x73,0x71,0x75,0x69,0x76,0x65,0x72,0, - 0x65,0x73,0x73,0x61,0x79,0x65,0x72,0, - 0x65,0x73,0x73,0x65,0x6e,0x63,0x65,0, - 0x65,0x73,0x73,0x69,0x65,0x75,0, - 0x65,0x73,0x73,0x6f,0x72,0x65,0x72,0, - 0x65,0x73,0x74,0x69,0x6d,0x65,0, - 0x65,0x73,0x74,0x6f,0x6d,0x61,0x63,0, - 0x65,0x73,0x74,0x72,0x61,0x64,0x65,0, - 0x65,0xcc,0x81,0x74,0x61,0x67,0x65,0xcc,0x80,0x72,0x65,0, - 0x65,0xcc,0x81,0x74,0x61,0x6c,0x65,0x72,0, - 0x65,0xcc,0x81,0x74,0x61,0x6e,0x63,0x68,0x65,0, - 0x65,0xcc,0x81,0x74,0x61,0x74,0x69,0x71,0x75,0x65,0, - 0x65,0xcc,0x81,0x74,0x65,0x69,0x6e,0x64,0x72,0x65,0, - 0x65,0xcc,0x81,0x74,0x65,0x6e,0x64,0x6f,0x69,0x72,0, - 0x65,0xcc,0x81,0x74,0x65,0x72,0x6e,0x65,0x6c,0, - 0x65,0xcc,0x81,0x74,0x68,0x61,0x6e,0x6f,0x6c,0, - 0x65,0xcc,0x81,0x74,0x68,0x69,0x71,0x75,0x65,0, - 0x65,0x74,0x68,0x6e,0x69,0x65,0, - 0x65,0xcc,0x81,0x74,0x69,0x72,0x65,0x72,0, - 0x65,0xcc,0x81,0x74,0x6f,0x66,0x66,0x65,0x72,0, - 0x65,0xcc,0x81,0x74,0x6f,0x69,0x6c,0x65,0, - 0x65,0xcc,0x81,0x74,0x6f,0x6e,0x6e,0x61,0x6e,0x74,0, - 0x65,0xcc,0x81,0x74,0x6f,0x75,0x72,0x64,0x69,0x72,0, - 0x65,0xcc,0x81,0x74,0x72,0x61,0x6e,0x67,0x65,0, - 0x65,0xcc,0x81,0x74,0x72,0x6f,0x69,0x74,0, - 0x65,0xcc,0x81,0x74,0x75,0x64,0x65,0, - 0x65,0x75,0x70,0x68,0x6f,0x72,0x69,0x65,0, - 0x65,0xcc,0x81,0x76,0x61,0x6c,0x75,0x65,0x72,0, - 0x65,0xcc,0x81,0x76,0x61,0x73,0x69,0x6f,0x6e,0, - 0x65,0xcc,0x81,0x76,0x65,0x6e,0x74,0x61,0x69,0x6c,0, - 0x65,0xcc,0x81,0x76,0x69,0x64,0x65,0x6e,0x63,0x65,0, - 0x65,0xcc,0x81,0x76,0x69,0x74,0x65,0x72,0, - 0x65,0xcc,0x81,0x76,0x6f,0x6c,0x75,0x74,0x69,0x66,0, - 0x65,0xcc,0x81,0x76,0x6f,0x71,0x75,0x65,0x72,0, - 0x65,0x78,0x61,0x63,0x74,0, - 0x65,0x78,0x61,0x67,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x65,0x78,0x61,0x75,0x63,0x65,0x72,0, - 0x65,0x78,0x63,0x65,0x6c,0x6c,0x65,0x72,0, - 0x65,0x78,0x63,0x69,0x74,0x61,0x6e,0x74,0, - 0x65,0x78,0x63,0x6c,0x75,0x73,0x69,0x66,0, - 0x65,0x78,0x63,0x75,0x73,0x65,0, - 0x65,0x78,0x65,0xcc,0x81,0x63,0x75,0x74,0x65,0x72,0, - 0x65,0x78,0x65,0x6d,0x70,0x6c,0x65,0, - 0x65,0x78,0x65,0x72,0x63,0x65,0x72,0, - 0x65,0x78,0x68,0x61,0x6c,0x65,0x72,0, - 0x65,0x78,0x68,0x6f,0x72,0x74,0x65,0x72,0, - 0x65,0x78,0x69,0x67,0x65,0x6e,0x63,0x65,0, - 0x65,0x78,0x69,0x6c,0x65,0x72,0, - 0x65,0x78,0x69,0x73,0x74,0x65,0x72,0, - 0x65,0x78,0x6f,0x74,0x69,0x71,0x75,0x65,0, - 0x65,0x78,0x70,0x65,0xcc,0x81,0x64,0x69,0x65,0x72,0, - 0x65,0x78,0x70,0x6c,0x6f,0x72,0x65,0x72,0, - 0x65,0x78,0x70,0x6f,0x73,0x65,0x72,0, - 0x65,0x78,0x70,0x72,0x69,0x6d,0x65,0x72,0, - 0x65,0x78,0x71,0x75,0x69,0x73,0, - 0x65,0x78,0x74,0x65,0x6e,0x73,0x69,0x66,0, - 0x65,0x78,0x74,0x72,0x61,0x69,0x72,0x65,0, - 0x65,0x78,0x75,0x6c,0x74,0x65,0x72,0, - 0x66,0x61,0x62,0x6c,0x65,0, - 0x66,0x61,0x62,0x75,0x6c,0x65,0x75,0x78,0, - 0x66,0x61,0x63,0x65,0x74,0x74,0x65,0, - 0x66,0x61,0x63,0x69,0x6c,0x65,0, - 0x66,0x61,0x63,0x74,0x75,0x72,0x65,0, - 0x66,0x61,0x69,0x62,0x6c,0x69,0x72,0, - 0x66,0x61,0x6c,0x61,0x69,0x73,0x65,0, - 0x66,0x61,0x6d,0x65,0x75,0x78,0, - 0x66,0x61,0x6d,0x69,0x6c,0x6c,0x65,0, - 0x66,0x61,0x72,0x63,0x65,0x75,0x72,0, - 0x66,0x61,0x72,0x66,0x65,0x6c,0x75,0, - 0x66,0x61,0x72,0x69,0x6e,0x65,0, - 0x66,0x61,0x72,0x6f,0x75,0x63,0x68,0x65,0, - 0x66,0x61,0x73,0x63,0x69,0x6e,0x65,0x72,0, - 0x66,0x61,0x74,0x61,0x6c,0, - 0x66,0x61,0x74,0x69,0x67,0x75,0x65,0, - 0x66,0x61,0x75,0x63,0x6f,0x6e,0, - 0x66,0x61,0x75,0x74,0x69,0x66,0, - 0x66,0x61,0x76,0x65,0x75,0x72,0, - 0x66,0x61,0x76,0x6f,0x72,0x69,0, - 0x66,0x65,0xcc,0x81,0x62,0x72,0x69,0x6c,0x65,0, - 0x66,0x65,0xcc,0x81,0x63,0x6f,0x6e,0x64,0x65,0x72,0, - 0x66,0x65,0xcc,0x81,0x64,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x66,0x65,0xcc,0x81,0x6c,0x69,0x6e,0, - 0x66,0x65,0x6d,0x6d,0x65,0, - 0x66,0x65,0xcc,0x81,0x6d,0x75,0x72,0, - 0x66,0x65,0x6e,0x64,0x6f,0x69,0x72,0, - 0x66,0x65,0xcc,0x81,0x6f,0x64,0x61,0x6c,0, - 0x66,0x65,0x72,0x6d,0x65,0x72,0, - 0x66,0x65,0xcc,0x81,0x72,0x6f,0x63,0x65,0, - 0x66,0x65,0x72,0x76,0x65,0x75,0x72,0, - 0x66,0x65,0x73,0x74,0x69,0x76,0x61,0x6c,0, - 0x66,0x65,0x75,0x69,0x6c,0x6c,0x65,0, - 0x66,0x65,0x75,0x74,0x72,0x65,0, - 0x66,0x65,0xcc,0x81,0x76,0x72,0x69,0x65,0x72,0, - 0x66,0x69,0x61,0x73,0x63,0x6f,0, - 0x66,0x69,0x63,0x65,0x6c,0x65,0x72,0, - 0x66,0x69,0x63,0x74,0x69,0x66,0, - 0x66,0x69,0x64,0x65,0xcc,0x80,0x6c,0x65,0, - 0x66,0x69,0x67,0x75,0x72,0x65,0, - 0x66,0x69,0x6c,0x61,0x74,0x75,0x72,0x65,0, - 0x66,0x69,0x6c,0x65,0x74,0x61,0x67,0x65,0, - 0x66,0x69,0x6c,0x69,0x65,0xcc,0x80,0x72,0x65,0, - 0x66,0x69,0x6c,0x6c,0x65,0x75,0x6c,0, - 0x66,0x69,0x6c,0x6d,0x65,0x72,0, - 0x66,0x69,0x6c,0x6f,0x75,0, - 0x66,0x69,0x6c,0x74,0x72,0x65,0x72,0, - 0x66,0x69,0x6e,0x61,0x6e,0x63,0x65,0x72,0, - 0x66,0x69,0x6e,0x69,0x72,0, - 0x66,0x69,0x6f,0x6c,0x65,0, - 0x66,0x69,0x72,0x6d,0x65,0, - 0x66,0x69,0x73,0x73,0x75,0x72,0x65,0, - 0x66,0x69,0x78,0x65,0x72,0, - 0x66,0x6c,0x61,0x69,0x72,0x65,0x72,0, - 0x66,0x6c,0x61,0x6d,0x6d,0x65,0, - 0x66,0x6c,0x61,0x73,0x71,0x75,0x65,0, - 0x66,0x6c,0x61,0x74,0x74,0x65,0x75,0x72,0, - 0x66,0x6c,0x65,0xcc,0x81,0x61,0x75,0, - 0x66,0x6c,0x65,0xcc,0x80,0x63,0x68,0x65,0, - 0x66,0x6c,0x65,0x75,0x72,0, - 0x66,0x6c,0x65,0x78,0x69,0x6f,0x6e,0, - 0x66,0x6c,0x6f,0x63,0x6f,0x6e,0, - 0x66,0x6c,0x6f,0x72,0x65,0, - 0x66,0x6c,0x75,0x63,0x74,0x75,0x65,0x72,0, - 0x66,0x6c,0x75,0x69,0x64,0x65,0, - 0x66,0x6c,0x75,0x76,0x69,0x61,0x6c,0, - 0x66,0x6f,0x6c,0x69,0x65,0, - 0x66,0x6f,0x6e,0x64,0x65,0x72,0x69,0x65,0, - 0x66,0x6f,0x6e,0x67,0x69,0x62,0x6c,0x65,0, - 0x66,0x6f,0x6e,0x74,0x61,0x69,0x6e,0x65,0, - 0x66,0x6f,0x72,0x63,0x65,0x72,0, - 0x66,0x6f,0x72,0x67,0x65,0x72,0x6f,0x6e,0, - 0x66,0x6f,0x72,0x6d,0x75,0x6c,0x65,0x72,0, - 0x66,0x6f,0x72,0x74,0x75,0x6e,0x65,0, - 0x66,0x6f,0x73,0x73,0x69,0x6c,0x65,0, - 0x66,0x6f,0x75,0x64,0x72,0x65,0, - 0x66,0x6f,0x75,0x67,0x65,0xcc,0x80,0x72,0x65,0, - 0x66,0x6f,0x75,0x69,0x6c,0x6c,0x65,0x72,0, - 0x66,0x6f,0x75,0x6c,0x75,0x72,0x65,0, - 0x66,0x6f,0x75,0x72,0x6d,0x69,0, - 0x66,0x72,0x61,0x67,0x69,0x6c,0x65,0, - 0x66,0x72,0x61,0x69,0x73,0x65,0, - 0x66,0x72,0x61,0x6e,0x63,0x68,0x69,0x72,0, - 0x66,0x72,0x61,0x70,0x70,0x65,0x72,0, - 0x66,0x72,0x61,0x79,0x65,0x75,0x72,0, - 0x66,0x72,0x65,0xcc,0x81,0x67,0x61,0x74,0x65,0, - 0x66,0x72,0x65,0x69,0x6e,0x65,0x72,0, - 0x66,0x72,0x65,0x6c,0x6f,0x6e,0, - 0x66,0x72,0x65,0xcc,0x81,0x6d,0x69,0x72,0, - 0x66,0x72,0x65,0xcc,0x81,0x6e,0x65,0xcc,0x81,0x73,0x69,0x65,0, - 0x66,0x72,0x65,0xcc,0x80,0x72,0x65,0, - 0x66,0x72,0x69,0x61,0x62,0x6c,0x65,0, - 0x66,0x72,0x69,0x63,0x74,0x69,0x6f,0x6e,0, - 0x66,0x72,0x69,0x73,0x73,0x6f,0x6e,0, - 0x66,0x72,0x69,0x76,0x6f,0x6c,0x65,0, - 0x66,0x72,0x6f,0x69,0x64,0, - 0x66,0x72,0x6f,0x6d,0x61,0x67,0x65,0, - 0x66,0x72,0x6f,0x6e,0x74,0x61,0x6c,0, - 0x66,0x72,0x6f,0x74,0x74,0x65,0x72,0, - 0x66,0x72,0x75,0x69,0x74,0, - 0x66,0x75,0x67,0x69,0x74,0x69,0x66,0, - 0x66,0x75,0x69,0x74,0x65,0, - 0x66,0x75,0x72,0x65,0x75,0x72,0, - 0x66,0x75,0x72,0x69,0x65,0x75,0x78,0, - 0x66,0x75,0x72,0x74,0x69,0x66,0, - 0x66,0x75,0x73,0x69,0x6f,0x6e,0, - 0x66,0x75,0x74,0x75,0x72,0, - 0x67,0x61,0x67,0x6e,0x65,0x72,0, - 0x67,0x61,0x6c,0x61,0x78,0x69,0x65,0, - 0x67,0x61,0x6c,0x65,0x72,0x69,0x65,0, - 0x67,0x61,0x6d,0x62,0x61,0x64,0x65,0x72,0, - 0x67,0x61,0x72,0x61,0x6e,0x74,0x69,0x72,0, - 0x67,0x61,0x72,0x64,0x69,0x65,0x6e,0, - 0x67,0x61,0x72,0x6e,0x69,0x72,0, - 0x67,0x61,0x72,0x72,0x69,0x67,0x75,0x65,0, - 0x67,0x61,0x7a,0x65,0x6c,0x6c,0x65,0, - 0x67,0x61,0x7a,0x6f,0x6e,0, - 0x67,0x65,0xcc,0x81,0x61,0x6e,0x74,0, - 0x67,0x65,0xcc,0x81,0x6c,0x61,0x74,0x69,0x6e,0x65,0, - 0x67,0x65,0xcc,0x81,0x6c,0x75,0x6c,0x65,0, - 0x67,0x65,0x6e,0x64,0x61,0x72,0x6d,0x65,0, - 0x67,0x65,0xcc,0x81,0x6e,0x65,0xcc,0x81,0x72,0x61,0x6c,0, - 0x67,0x65,0xcc,0x81,0x6e,0x69,0x65,0, - 0x67,0x65,0x6e,0x6f,0x75,0, - 0x67,0x65,0x6e,0x74,0x69,0x6c,0, - 0x67,0x65,0xcc,0x81,0x6f,0x6c,0x6f,0x67,0x69,0x65,0, - 0x67,0x65,0xcc,0x81,0x6f,0x6d,0x65,0xcc,0x80,0x74,0x72,0x65,0, - 0x67,0x65,0xcc,0x81,0x72,0x61,0x6e,0x69,0x75,0x6d,0, - 0x67,0x65,0x72,0x6d,0x65,0, - 0x67,0x65,0x73,0x74,0x75,0x65,0x6c,0, - 0x67,0x65,0x79,0x73,0x65,0x72,0, - 0x67,0x69,0x62,0x69,0x65,0x72,0, - 0x67,0x69,0x63,0x6c,0x65,0x72,0, - 0x67,0x69,0x72,0x61,0x66,0x65,0, - 0x67,0x69,0x76,0x72,0x65,0, - 0x67,0x6c,0x61,0x63,0x65,0, - 0x67,0x6c,0x61,0x69,0x76,0x65,0, - 0x67,0x6c,0x69,0x73,0x73,0x65,0x72,0, - 0x67,0x6c,0x6f,0x62,0x65,0, - 0x67,0x6c,0x6f,0x69,0x72,0x65,0, - 0x67,0x6c,0x6f,0x72,0x69,0x65,0x75,0x78,0, - 0x67,0x6f,0x6c,0x66,0x65,0x75,0x72,0, - 0x67,0x6f,0x6d,0x6d,0x65,0, - 0x67,0x6f,0x6e,0x66,0x6c,0x65,0x72,0, - 0x67,0x6f,0x72,0x67,0x65,0, - 0x67,0x6f,0x72,0x69,0x6c,0x6c,0x65,0, - 0x67,0x6f,0x75,0x64,0x72,0x6f,0x6e,0, - 0x67,0x6f,0x75,0x66,0x66,0x72,0x65,0, - 0x67,0x6f,0x75,0x6c,0x6f,0x74,0, - 0x67,0x6f,0x75,0x70,0x69,0x6c,0x6c,0x65,0, - 0x67,0x6f,0x75,0x72,0x6d,0x61,0x6e,0x64,0, - 0x67,0x6f,0x75,0x74,0x74,0x65,0, - 0x67,0x72,0x61,0x64,0x75,0x65,0x6c,0, - 0x67,0x72,0x61,0x66,0x66,0x69,0x74,0x69,0, - 0x67,0x72,0x61,0x69,0x6e,0x65,0, - 0x67,0x72,0x61,0x6e,0x64,0, - 0x67,0x72,0x61,0x70,0x70,0x69,0x6e,0, - 0x67,0x72,0x61,0x74,0x75,0x69,0x74,0, - 0x67,0x72,0x61,0x76,0x69,0x72,0, - 0x67,0x72,0x65,0x6e,0x61,0x74,0, - 0x67,0x72,0x69,0x66,0x66,0x75,0x72,0x65,0, - 0x67,0x72,0x69,0x6c,0x6c,0x65,0x72,0, - 0x67,0x72,0x69,0x6d,0x70,0x65,0x72,0, - 0x67,0x72,0x6f,0x67,0x6e,0x65,0x72,0, - 0x67,0x72,0x6f,0x6e,0x64,0x65,0x72,0, - 0x67,0x72,0x6f,0x74,0x74,0x65,0, - 0x67,0x72,0x6f,0x75,0x70,0x65,0, - 0x67,0x72,0x75,0x67,0x65,0x72,0, - 0x67,0x72,0x75,0x74,0x69,0x65,0x72,0, - 0x67,0x72,0x75,0x79,0x65,0xcc,0x80,0x72,0x65,0, - 0x67,0x75,0x65,0xcc,0x81,0x70,0x61,0x72,0x64,0, - 0x67,0x75,0x65,0x72,0x72,0x69,0x65,0x72,0, - 0x67,0x75,0x69,0x64,0x65,0, - 0x67,0x75,0x69,0x6d,0x61,0x75,0x76,0x65,0, - 0x67,0x75,0x69,0x74,0x61,0x72,0x65,0, - 0x67,0x75,0x73,0x74,0x61,0x74,0x69,0x66,0, - 0x67,0x79,0x6d,0x6e,0x61,0x73,0x74,0x65,0, - 0x67,0x79,0x72,0x6f,0x73,0x74,0x61,0x74,0, - 0x68,0x61,0x62,0x69,0x74,0x75,0x64,0x65,0, - 0x68,0x61,0x63,0x68,0x6f,0x69,0x72,0, - 0x68,0x61,0x6c,0x74,0x65,0, - 0x68,0x61,0x6d,0x65,0x61,0x75,0, - 0x68,0x61,0x6e,0x67,0x61,0x72,0, - 0x68,0x61,0x6e,0x6e,0x65,0x74,0x6f,0x6e,0, - 0x68,0x61,0x72,0x69,0x63,0x6f,0x74,0, - 0x68,0x61,0x72,0x6d,0x6f,0x6e,0x69,0x65,0, - 0x68,0x61,0x72,0x70,0x6f,0x6e,0, - 0x68,0x61,0x73,0x61,0x72,0x64,0, - 0x68,0x65,0xcc,0x81,0x6c,0x69,0x75,0x6d,0, - 0x68,0x65,0xcc,0x81,0x6d,0x61,0x74,0x6f,0x6d,0x65,0, - 0x68,0x65,0x72,0x62,0x65,0, - 0x68,0x65,0xcc,0x81,0x72,0x69,0x73,0x73,0x6f,0x6e,0, - 0x68,0x65,0x72,0x6d,0x69,0x6e,0x65,0, - 0x68,0x65,0xcc,0x81,0x72,0x6f,0x6e,0, - 0x68,0x65,0xcc,0x81,0x73,0x69,0x74,0x65,0x72,0, - 0x68,0x65,0x75,0x72,0x65,0x75,0x78,0, - 0x68,0x69,0x62,0x65,0x72,0x6e,0x65,0x72,0, - 0x68,0x69,0x62,0x6f,0x75,0, - 0x68,0x69,0x6c,0x61,0x72,0x61,0x6e,0x74,0, - 0x68,0x69,0x73,0x74,0x6f,0x69,0x72,0x65,0, - 0x68,0x69,0x76,0x65,0x72,0, - 0x68,0x6f,0x6d,0x61,0x72,0x64,0, - 0x68,0x6f,0x6d,0x6d,0x61,0x67,0x65,0, - 0x68,0x6f,0x6d,0x6f,0x67,0x65,0xcc,0x80,0x6e,0x65,0, - 0x68,0x6f,0x6e,0x6e,0x65,0x75,0x72,0, - 0x68,0x6f,0x6e,0x6f,0x72,0x65,0x72,0, - 0x68,0x6f,0x6e,0x74,0x65,0x75,0x78,0, - 0x68,0x6f,0x72,0x64,0x65,0, - 0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0, - 0x68,0x6f,0x72,0x6c,0x6f,0x67,0x65,0, - 0x68,0x6f,0x72,0x6d,0x6f,0x6e,0x65,0, - 0x68,0x6f,0x72,0x72,0x69,0x62,0x6c,0x65,0, - 0x68,0x6f,0x75,0x6c,0x65,0x75,0x78,0, - 0x68,0x6f,0x75,0x73,0x73,0x65,0, - 0x68,0x75,0x62,0x6c,0x6f,0x74,0, - 0x68,0x75,0x69,0x6c,0x65,0x75,0x78,0, - 0x68,0x75,0x6d,0x61,0x69,0x6e,0, - 0x68,0x75,0x6d,0x62,0x6c,0x65,0, - 0x68,0x75,0x6d,0x69,0x64,0x65,0, - 0x68,0x75,0x6d,0x6f,0x75,0x72,0, - 0x68,0x75,0x72,0x6c,0x65,0x72,0, - 0x68,0x79,0x64,0x72,0x6f,0x6d,0x65,0x6c,0, - 0x68,0x79,0x67,0x69,0x65,0xcc,0x80,0x6e,0x65,0, - 0x68,0x79,0x6d,0x6e,0x65,0, - 0x68,0x79,0x70,0x6e,0x6f,0x73,0x65,0, - 0x69,0x64,0x79,0x6c,0x6c,0x65,0, - 0x69,0x67,0x6e,0x6f,0x72,0x65,0x72,0, - 0x69,0x67,0x75,0x61,0x6e,0x65,0, - 0x69,0x6c,0x6c,0x69,0x63,0x69,0x74,0x65,0, - 0x69,0x6c,0x6c,0x75,0x73,0x69,0x6f,0x6e,0, - 0x69,0x6d,0x61,0x67,0x65,0, - 0x69,0x6d,0x62,0x69,0x62,0x65,0x72,0, - 0x69,0x6d,0x69,0x74,0x65,0x72,0, - 0x69,0x6d,0x6d,0x65,0x6e,0x73,0x65,0, - 0x69,0x6d,0x6d,0x6f,0x62,0x69,0x6c,0x65,0, - 0x69,0x6d,0x6d,0x75,0x61,0x62,0x6c,0x65,0, - 0x69,0x6d,0x70,0x61,0x63,0x74,0, - 0x69,0x6d,0x70,0x65,0xcc,0x81,0x72,0x69,0x61,0x6c,0, - 0x69,0x6d,0x70,0x6c,0x6f,0x72,0x65,0x72,0, - 0x69,0x6d,0x70,0x6f,0x73,0x65,0x72,0, - 0x69,0x6d,0x70,0x72,0x69,0x6d,0x65,0x72,0, - 0x69,0x6d,0x70,0x75,0x74,0x65,0x72,0, - 0x69,0x6e,0x63,0x61,0x72,0x6e,0x65,0x72,0, - 0x69,0x6e,0x63,0x65,0x6e,0x64,0x69,0x65,0, - 0x69,0x6e,0x63,0x69,0x64,0x65,0x6e,0x74,0, - 0x69,0x6e,0x63,0x6c,0x69,0x6e,0x65,0x72,0, - 0x69,0x6e,0x63,0x6f,0x6c,0x6f,0x72,0x65,0, - 0x69,0x6e,0x64,0x65,0x78,0x65,0x72,0, - 0x69,0x6e,0x64,0x69,0x63,0x65,0, - 0x69,0x6e,0x64,0x75,0x63,0x74,0x69,0x66,0, - 0x69,0x6e,0x65,0xcc,0x81,0x64,0x69,0x74,0, - 0x69,0x6e,0x65,0x70,0x74,0x69,0x65,0, - 0x69,0x6e,0x65,0x78,0x61,0x63,0x74,0, - 0x69,0x6e,0x66,0x69,0x6e,0x69,0, - 0x69,0x6e,0x66,0x6c,0x69,0x67,0x65,0x72,0, - 0x69,0x6e,0x66,0x6f,0x72,0x6d,0x65,0x72,0, - 0x69,0x6e,0x66,0x75,0x73,0x69,0x6f,0x6e,0, - 0x69,0x6e,0x67,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x69,0x6e,0x68,0x61,0x6c,0x65,0x72,0, - 0x69,0x6e,0x68,0x69,0x62,0x65,0x72,0, - 0x69,0x6e,0x6a,0x65,0x63,0x74,0x65,0x72,0, - 0x69,0x6e,0x6a,0x75,0x72,0x65,0, - 0x69,0x6e,0x6e,0x6f,0x63,0x65,0x6e,0x74,0, - 0x69,0x6e,0x6f,0x63,0x75,0x6c,0x65,0x72,0, - 0x69,0x6e,0x6f,0x6e,0x64,0x65,0x72,0, - 0x69,0x6e,0x73,0x63,0x72,0x69,0x72,0x65,0, - 0x69,0x6e,0x73,0x65,0x63,0x74,0x65,0, - 0x69,0x6e,0x73,0x69,0x67,0x6e,0x65,0, - 0x69,0x6e,0x73,0x6f,0x6c,0x69,0x74,0x65,0, - 0x69,0x6e,0x73,0x70,0x69,0x72,0x65,0x72,0, - 0x69,0x6e,0x73,0x74,0x69,0x6e,0x63,0x74,0, - 0x69,0x6e,0x73,0x75,0x6c,0x74,0x65,0x72,0, - 0x69,0x6e,0x74,0x61,0x63,0x74,0, - 0x69,0x6e,0x74,0x65,0x6e,0x73,0x65,0, - 0x69,0x6e,0x74,0x69,0x6d,0x65,0, - 0x69,0x6e,0x74,0x72,0x69,0x67,0x75,0x65,0, - 0x69,0x6e,0x74,0x75,0x69,0x74,0x69,0x66,0, - 0x69,0x6e,0x75,0x74,0x69,0x6c,0x65,0, - 0x69,0x6e,0x76,0x61,0x73,0x69,0x6f,0x6e,0, - 0x69,0x6e,0x76,0x65,0x6e,0x74,0x65,0x72,0, - 0x69,0x6e,0x76,0x69,0x74,0x65,0x72,0, - 0x69,0x6e,0x76,0x6f,0x71,0x75,0x65,0x72,0, - 0x69,0x72,0x6f,0x6e,0x69,0x71,0x75,0x65,0, - 0x69,0x72,0x72,0x61,0x64,0x69,0x65,0x72,0, - 0x69,0x72,0x72,0x65,0xcc,0x81,0x65,0x6c,0, - 0x69,0x72,0x72,0x69,0x74,0x65,0x72,0, - 0x69,0x73,0x6f,0x6c,0x65,0x72,0, - 0x69,0x76,0x6f,0x69,0x72,0x65,0, - 0x69,0x76,0x72,0x65,0x73,0x73,0x65,0, - 0x6a,0x61,0x67,0x75,0x61,0x72,0, - 0x6a,0x61,0x69,0x6c,0x6c,0x69,0x72,0, - 0x6a,0x61,0x6d,0x62,0x65,0, - 0x6a,0x61,0x6e,0x76,0x69,0x65,0x72,0, - 0x6a,0x61,0x72,0x64,0x69,0x6e,0, - 0x6a,0x61,0x75,0x67,0x65,0x72,0, - 0x6a,0x61,0x75,0x6e,0x65,0, - 0x6a,0x61,0x76,0x65,0x6c,0x6f,0x74,0, - 0x6a,0x65,0x74,0x61,0x62,0x6c,0x65,0, - 0x6a,0x65,0x74,0x6f,0x6e,0, - 0x6a,0x65,0x75,0x64,0x69,0, - 0x6a,0x65,0x75,0x6e,0x65,0x73,0x73,0x65,0, - 0x6a,0x6f,0x69,0x6e,0x64,0x72,0x65,0, - 0x6a,0x6f,0x6e,0x63,0x68,0x65,0x72,0, - 0x6a,0x6f,0x6e,0x67,0x6c,0x65,0x72,0, - 0x6a,0x6f,0x75,0x65,0x75,0x72,0, - 0x6a,0x6f,0x75,0x69,0x73,0x73,0x69,0x66,0, - 0x6a,0x6f,0x75,0x72,0x6e,0x61,0x6c,0, - 0x6a,0x6f,0x76,0x69,0x61,0x6c,0, - 0x6a,0x6f,0x79,0x61,0x75,0, - 0x6a,0x6f,0x79,0x65,0x75,0x78,0, - 0x6a,0x75,0x62,0x69,0x6c,0x65,0x72,0, - 0x6a,0x75,0x67,0x65,0x6d,0x65,0x6e,0x74,0, - 0x6a,0x75,0x6e,0x69,0x6f,0x72,0, - 0x6a,0x75,0x70,0x6f,0x6e,0, - 0x6a,0x75,0x72,0x69,0x73,0x74,0x65,0, - 0x6a,0x75,0x73,0x74,0x69,0x63,0x65,0, - 0x6a,0x75,0x74,0x65,0x75,0x78,0, - 0x6a,0x75,0x76,0x65,0xcc,0x81,0x6e,0x69,0x6c,0x65,0, - 0x6b,0x61,0x79,0x61,0x6b,0, - 0x6b,0x69,0x6d,0x6f,0x6e,0x6f,0, - 0x6b,0x69,0x6f,0x73,0x71,0x75,0x65,0, - 0x6c,0x61,0x62,0x65,0x6c,0, - 0x6c,0x61,0x62,0x69,0x61,0x6c,0, - 0x6c,0x61,0x62,0x6f,0x75,0x72,0x65,0x72,0, - 0x6c,0x61,0x63,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x6c,0x61,0x63,0x74,0x6f,0x73,0x65,0, - 0x6c,0x61,0x67,0x75,0x6e,0x65,0, - 0x6c,0x61,0x69,0x6e,0x65,0, - 0x6c,0x61,0x69,0x73,0x73,0x65,0x72,0, - 0x6c,0x61,0x69,0x74,0x69,0x65,0x72,0, - 0x6c,0x61,0x6d,0x62,0x65,0x61,0x75,0, - 0x6c,0x61,0x6d,0x65,0x6c,0x6c,0x65,0, - 0x6c,0x61,0x6d,0x70,0x65,0, - 0x6c,0x61,0x6e,0x63,0x65,0x75,0x72,0, - 0x6c,0x61,0x6e,0x67,0x61,0x67,0x65,0, - 0x6c,0x61,0x6e,0x74,0x65,0x72,0x6e,0x65,0, - 0x6c,0x61,0x70,0x69,0x6e,0, - 0x6c,0x61,0x72,0x67,0x65,0x75,0x72,0, - 0x6c,0x61,0x72,0x6d,0x65,0, - 0x6c,0x61,0x75,0x72,0x69,0x65,0x72,0, - 0x6c,0x61,0x76,0x61,0x62,0x6f,0, - 0x6c,0x61,0x76,0x6f,0x69,0x72,0, - 0x6c,0x65,0x63,0x74,0x75,0x72,0x65,0, - 0x6c,0x65,0xcc,0x81,0x67,0x61,0x6c,0, - 0x6c,0x65,0xcc,0x81,0x67,0x65,0x72,0, - 0x6c,0x65,0xcc,0x81,0x67,0x75,0x6d,0x65,0, - 0x6c,0x65,0x73,0x73,0x69,0x76,0x65,0, - 0x6c,0x65,0x74,0x74,0x72,0x65,0, - 0x6c,0x65,0x76,0x69,0x65,0x72,0, - 0x6c,0x65,0x78,0x69,0x71,0x75,0x65,0, - 0x6c,0x65,0xcc,0x81,0x7a,0x61,0x72,0x64,0, - 0x6c,0x69,0x61,0x73,0x73,0x65,0, - 0x6c,0x69,0x62,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x6c,0x69,0x62,0x72,0x65,0, - 0x6c,0x69,0x63,0x65,0x6e,0x63,0x65,0, - 0x6c,0x69,0x63,0x6f,0x72,0x6e,0x65,0, - 0x6c,0x69,0x65,0xcc,0x80,0x67,0x65,0, - 0x6c,0x69,0x65,0xcc,0x80,0x76,0x72,0x65,0, - 0x6c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0, - 0x6c,0x69,0x67,0x6f,0x74,0x65,0x72,0, - 0x6c,0x69,0x67,0x75,0x65,0, - 0x6c,0x69,0x6d,0x65,0x72,0, - 0x6c,0x69,0x6d,0x69,0x74,0x65,0, - 0x6c,0x69,0x6d,0x6f,0x6e,0x61,0x64,0x65,0, - 0x6c,0x69,0x6d,0x70,0x69,0x64,0x65,0, - 0x6c,0x69,0x6e,0x65,0xcc,0x81,0x61,0x69,0x72,0x65,0, - 0x6c,0x69,0x6e,0x67,0x6f,0x74,0, - 0x6c,0x69,0x6f,0x6e,0x63,0x65,0x61,0x75,0, - 0x6c,0x69,0x71,0x75,0x69,0x64,0x65,0, - 0x6c,0x69,0x73,0x69,0x65,0xcc,0x80,0x72,0x65,0, - 0x6c,0x69,0x73,0x74,0x65,0x72,0, - 0x6c,0x69,0x74,0x68,0x69,0x75,0x6d,0, - 0x6c,0x69,0x74,0x69,0x67,0x65,0, - 0x6c,0x69,0x74,0x74,0x6f,0x72,0x61,0x6c,0, - 0x6c,0x69,0x76,0x72,0x65,0x75,0x72,0, - 0x6c,0x6f,0x67,0x69,0x71,0x75,0x65,0, - 0x6c,0x6f,0x69,0x6e,0x74,0x61,0x69,0x6e,0, - 0x6c,0x6f,0x69,0x73,0x69,0x72,0, - 0x6c,0x6f,0x6d,0x62,0x72,0x69,0x63,0, - 0x6c,0x6f,0x74,0x65,0x72,0x69,0x65,0, - 0x6c,0x6f,0x75,0x65,0x72,0, - 0x6c,0x6f,0x75,0x72,0x64,0, - 0x6c,0x6f,0x75,0x74,0x72,0x65,0, - 0x6c,0x6f,0x75,0x76,0x65,0, - 0x6c,0x6f,0x79,0x61,0x6c,0, - 0x6c,0x75,0x62,0x69,0x65,0, - 0x6c,0x75,0x63,0x69,0x64,0x65,0, - 0x6c,0x75,0x63,0x72,0x61,0x74,0x69,0x66,0, - 0x6c,0x75,0x65,0x75,0x72,0, - 0x6c,0x75,0x67,0x75,0x62,0x72,0x65,0, - 0x6c,0x75,0x69,0x73,0x61,0x6e,0x74,0, - 0x6c,0x75,0x6d,0x69,0x65,0xcc,0x80,0x72,0x65,0, - 0x6c,0x75,0x6e,0x61,0x69,0x72,0x65,0, - 0x6c,0x75,0x6e,0x64,0x69,0, - 0x6c,0x75,0x72,0x6f,0x6e,0, - 0x6c,0x75,0x74,0x74,0x65,0x72,0, - 0x6c,0x75,0x78,0x75,0x65,0x75,0x78,0, - 0x6d,0x61,0x63,0x68,0x69,0x6e,0x65,0, - 0x6d,0x61,0x67,0x61,0x73,0x69,0x6e,0, - 0x6d,0x61,0x67,0x65,0x6e,0x74,0x61,0, - 0x6d,0x61,0x67,0x69,0x71,0x75,0x65,0, - 0x6d,0x61,0x69,0x67,0x72,0x65,0, - 0x6d,0x61,0x69,0x6c,0x6c,0x6f,0x6e,0, - 0x6d,0x61,0x69,0x6e,0x74,0x69,0x65,0x6e,0, - 0x6d,0x61,0x69,0x72,0x69,0x65,0, - 0x6d,0x61,0x69,0x73,0x6f,0x6e,0, - 0x6d,0x61,0x6a,0x6f,0x72,0x65,0x72,0, - 0x6d,0x61,0x6c,0x61,0x78,0x65,0x72,0, - 0x6d,0x61,0x6c,0x65,0xcc,0x81,0x66,0x69,0x63,0x65,0, - 0x6d,0x61,0x6c,0x68,0x65,0x75,0x72,0, - 0x6d,0x61,0x6c,0x69,0x63,0x65,0, - 0x6d,0x61,0x6c,0x6c,0x65,0x74,0x74,0x65,0, - 0x6d,0x61,0x6d,0x6d,0x6f,0x75,0x74,0x68,0, - 0x6d,0x61,0x6e,0x64,0x61,0x74,0x65,0x72,0, - 0x6d,0x61,0x6e,0x69,0x61,0x62,0x6c,0x65,0, - 0x6d,0x61,0x6e,0x71,0x75,0x61,0x6e,0x74,0, - 0x6d,0x61,0x6e,0x74,0x65,0x61,0x75,0, - 0x6d,0x61,0x6e,0x75,0x65,0x6c,0, - 0x6d,0x61,0x72,0x61,0x74,0x68,0x6f,0x6e,0, - 0x6d,0x61,0x72,0x62,0x72,0x65,0, - 0x6d,0x61,0x72,0x63,0x68,0x61,0x6e,0x64,0, - 0x6d,0x61,0x72,0x64,0x69,0, - 0x6d,0x61,0x72,0x69,0x74,0x69,0x6d,0x65,0, - 0x6d,0x61,0x72,0x71,0x75,0x65,0x75,0x72,0, - 0x6d,0x61,0x72,0x72,0x6f,0x6e,0, - 0x6d,0x61,0x72,0x74,0x65,0x6c,0x65,0x72,0, - 0x6d,0x61,0x73,0x63,0x6f,0x74,0x74,0x65,0, - 0x6d,0x61,0x73,0x73,0x69,0x66,0, - 0x6d,0x61,0x74,0x65,0xcc,0x81,0x72,0x69,0x65,0x6c,0, - 0x6d,0x61,0x74,0x69,0x65,0xcc,0x80,0x72,0x65,0, - 0x6d,0x61,0x74,0x72,0x61,0x71,0x75,0x65,0, - 0x6d,0x61,0x75,0x64,0x69,0x72,0x65,0, - 0x6d,0x61,0x75,0x73,0x73,0x61,0x64,0x65,0, - 0x6d,0x61,0x75,0x76,0x65,0, - 0x6d,0x61,0x78,0x69,0x6d,0x61,0x6c,0, - 0x6d,0x65,0xcc,0x81,0x63,0x68,0x61,0x6e,0x74,0, - 0x6d,0x65,0xcc,0x81,0x63,0x6f,0x6e,0x6e,0x75,0, - 0x6d,0x65,0xcc,0x81,0x64,0x61,0x69,0x6c,0x6c,0x65,0, - 0x6d,0x65,0xcc,0x81,0x64,0x65,0x63,0x69,0x6e,0, - 0x6d,0x65,0xcc,0x81,0x64,0x69,0x74,0x65,0x72,0, - 0x6d,0x65,0xcc,0x81,0x64,0x75,0x73,0x65,0, - 0x6d,0x65,0x69,0x6c,0x6c,0x65,0x75,0x72,0, - 0x6d,0x65,0xcc,0x81,0x6c,0x61,0x6e,0x67,0x65,0, - 0x6d,0x65,0xcc,0x81,0x6c,0x6f,0x64,0x69,0x65,0, - 0x6d,0x65,0x6d,0x62,0x72,0x65,0, - 0x6d,0x65,0xcc,0x81,0x6d,0x6f,0x69,0x72,0x65,0, - 0x6d,0x65,0x6e,0x61,0x63,0x65,0x72,0, - 0x6d,0x65,0x6e,0x65,0x72,0, - 0x6d,0x65,0x6e,0x68,0x69,0x72,0, - 0x6d,0x65,0x6e,0x73,0x6f,0x6e,0x67,0x65,0, - 0x6d,0x65,0x6e,0x74,0x6f,0x72,0, - 0x6d,0x65,0x72,0x63,0x72,0x65,0x64,0x69,0, - 0x6d,0x65,0xcc,0x81,0x72,0x69,0x74,0x65,0, - 0x6d,0x65,0x72,0x6c,0x65,0, - 0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x72,0, - 0x6d,0x65,0x73,0x75,0x72,0x65,0, - 0x6d,0x65,0xcc,0x81,0x74,0x61,0x6c,0, - 0x6d,0x65,0xcc,0x81,0x74,0x65,0xcc,0x81,0x6f,0x72,0x65,0, - 0x6d,0x65,0xcc,0x81,0x74,0x68,0x6f,0x64,0x65,0, - 0x6d,0x65,0xcc,0x81,0x74,0x69,0x65,0x72,0, - 0x6d,0x65,0x75,0x62,0x6c,0x65,0, - 0x6d,0x69,0x61,0x75,0x6c,0x65,0x72,0, - 0x6d,0x69,0x63,0x72,0x6f,0x62,0x65,0, - 0x6d,0x69,0x65,0x74,0x74,0x65,0, - 0x6d,0x69,0x67,0x6e,0x6f,0x6e,0, - 0x6d,0x69,0x67,0x72,0x65,0x72,0, - 0x6d,0x69,0x6c,0x69,0x65,0x75,0, - 0x6d,0x69,0x6c,0x6c,0x69,0x6f,0x6e,0, - 0x6d,0x69,0x6d,0x69,0x71,0x75,0x65,0, - 0x6d,0x69,0x6e,0x63,0x65,0, - 0x6d,0x69,0x6e,0x65,0xcc,0x81,0x72,0x61,0x6c,0, - 0x6d,0x69,0x6e,0x69,0x6d,0x61,0x6c,0, - 0x6d,0x69,0x6e,0x6f,0x72,0x65,0x72,0, - 0x6d,0x69,0x6e,0x75,0x74,0x65,0, - 0x6d,0x69,0x72,0x61,0x63,0x6c,0x65,0, - 0x6d,0x69,0x72,0x6f,0x69,0x74,0x65,0x72,0, - 0x6d,0x69,0x73,0x73,0x69,0x6c,0x65,0, - 0x6d,0x69,0x78,0x74,0x65,0, - 0x6d,0x6f,0x62,0x69,0x6c,0x65,0, - 0x6d,0x6f,0x64,0x65,0x72,0x6e,0x65,0, - 0x6d,0x6f,0x65,0x6c,0x6c,0x65,0x75,0x78,0, - 0x6d,0x6f,0x6e,0x64,0x69,0x61,0x6c,0, - 0x6d,0x6f,0x6e,0x69,0x74,0x65,0x75,0x72,0, - 0x6d,0x6f,0x6e,0x6e,0x61,0x69,0x65,0, - 0x6d,0x6f,0x6e,0x6f,0x74,0x6f,0x6e,0x65,0, - 0x6d,0x6f,0x6e,0x73,0x74,0x72,0x65,0, - 0x6d,0x6f,0x6e,0x74,0x61,0x67,0x6e,0x65,0, - 0x6d,0x6f,0x6e,0x75,0x6d,0x65,0x6e,0x74,0, - 0x6d,0x6f,0x71,0x75,0x65,0x75,0x72,0, - 0x6d,0x6f,0x72,0x63,0x65,0x61,0x75,0, - 0x6d,0x6f,0x72,0x73,0x75,0x72,0x65,0, - 0x6d,0x6f,0x72,0x74,0x69,0x65,0x72,0, - 0x6d,0x6f,0x74,0x65,0x75,0x72,0, - 0x6d,0x6f,0x74,0x69,0x66,0, - 0x6d,0x6f,0x75,0x63,0x68,0x65,0, - 0x6d,0x6f,0x75,0x66,0x6c,0x65,0, - 0x6d,0x6f,0x75,0x6c,0x69,0x6e,0, - 0x6d,0x6f,0x75,0x73,0x73,0x6f,0x6e,0, - 0x6d,0x6f,0x75,0x74,0x6f,0x6e,0, - 0x6d,0x6f,0x75,0x76,0x61,0x6e,0x74,0, - 0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x65,0, - 0x6d,0x75,0x6e,0x69,0x74,0x69,0x6f,0x6e,0, - 0x6d,0x75,0x72,0x61,0x69,0x6c,0x6c,0x65,0, - 0x6d,0x75,0x72,0x65,0xcc,0x80,0x6e,0x65,0, - 0x6d,0x75,0x72,0x6d,0x75,0x72,0x65,0, - 0x6d,0x75,0x73,0x63,0x6c,0x65,0, - 0x6d,0x75,0x73,0x65,0xcc,0x81,0x75,0x6d,0, - 0x6d,0x75,0x73,0x69,0x63,0x69,0x65,0x6e,0, - 0x6d,0x75,0x74,0x61,0x74,0x69,0x6f,0x6e,0, - 0x6d,0x75,0x74,0x65,0x72,0, - 0x6d,0x75,0x74,0x75,0x65,0x6c,0, - 0x6d,0x79,0x72,0x69,0x61,0x64,0x65,0, - 0x6d,0x79,0x72,0x74,0x69,0x6c,0x6c,0x65,0, - 0x6d,0x79,0x73,0x74,0x65,0xcc,0x80,0x72,0x65,0, - 0x6d,0x79,0x74,0x68,0x69,0x71,0x75,0x65,0, - 0x6e,0x61,0x67,0x65,0x75,0x72,0, - 0x6e,0x61,0x70,0x70,0x65,0, - 0x6e,0x61,0x72,0x71,0x75,0x6f,0x69,0x73,0, - 0x6e,0x61,0x72,0x72,0x65,0x72,0, - 0x6e,0x61,0x74,0x61,0x74,0x69,0x6f,0x6e,0, - 0x6e,0x61,0x74,0x69,0x6f,0x6e,0, - 0x6e,0x61,0x74,0x75,0x72,0x65,0, - 0x6e,0x61,0x75,0x66,0x72,0x61,0x67,0x65,0, - 0x6e,0x61,0x75,0x74,0x69,0x71,0x75,0x65,0, - 0x6e,0x61,0x76,0x69,0x72,0x65,0, - 0x6e,0x65,0xcc,0x81,0x62,0x75,0x6c,0x65,0x75,0x78,0, - 0x6e,0x65,0x63,0x74,0x61,0x72,0, - 0x6e,0x65,0xcc,0x81,0x66,0x61,0x73,0x74,0x65,0, - 0x6e,0x65,0xcc,0x81,0x67,0x61,0x74,0x69,0x6f,0x6e,0, - 0x6e,0x65,0xcc,0x81,0x67,0x6c,0x69,0x67,0x65,0x72,0, - 0x6e,0x65,0xcc,0x81,0x67,0x6f,0x63,0x69,0x65,0x72,0, - 0x6e,0x65,0x69,0x67,0x65,0, - 0x6e,0x65,0x72,0x76,0x65,0x75,0x78,0, - 0x6e,0x65,0x74,0x74,0x6f,0x79,0x65,0x72,0, - 0x6e,0x65,0x75,0x72,0x6f,0x6e,0x65,0, - 0x6e,0x65,0x75,0x74,0x72,0x6f,0x6e,0, - 0x6e,0x65,0x76,0x65,0x75,0, - 0x6e,0x69,0x63,0x68,0x65,0, - 0x6e,0x69,0x63,0x6b,0x65,0x6c,0, - 0x6e,0x69,0x74,0x72,0x61,0x74,0x65,0, - 0x6e,0x69,0x76,0x65,0x61,0x75,0, - 0x6e,0x6f,0x62,0x6c,0x65,0, - 0x6e,0x6f,0x63,0x69,0x66,0, - 0x6e,0x6f,0x63,0x74,0x75,0x72,0x6e,0x65,0, - 0x6e,0x6f,0x69,0x72,0x63,0x65,0x75,0x72,0, - 0x6e,0x6f,0x69,0x73,0x65,0x74,0x74,0x65,0, - 0x6e,0x6f,0x6d,0x61,0x64,0x65,0, - 0x6e,0x6f,0x6d,0x62,0x72,0x65,0x75,0x78,0, - 0x6e,0x6f,0x6d,0x6d,0x65,0x72,0, - 0x6e,0x6f,0x72,0x6d,0x61,0x74,0x69,0x66,0, - 0x6e,0x6f,0x74,0x61,0x62,0x6c,0x65,0, - 0x6e,0x6f,0x74,0x69,0x66,0x69,0x65,0x72,0, - 0x6e,0x6f,0x74,0x6f,0x69,0x72,0x65,0, - 0x6e,0x6f,0x75,0x72,0x72,0x69,0x72,0, - 0x6e,0x6f,0x75,0x76,0x65,0x61,0x75,0, - 0x6e,0x6f,0x76,0x61,0x74,0x65,0x75,0x72,0, - 0x6e,0x6f,0x76,0x65,0x6d,0x62,0x72,0x65,0, - 0x6e,0x6f,0x76,0x69,0x63,0x65,0, - 0x6e,0x75,0x61,0x67,0x65,0, - 0x6e,0x75,0x61,0x6e,0x63,0x65,0x72,0, - 0x6e,0x75,0x69,0x72,0x65,0, - 0x6e,0x75,0x69,0x73,0x69,0x62,0x6c,0x65,0, - 0x6e,0x75,0x6d,0x65,0xcc,0x81,0x72,0x6f,0, - 0x6e,0x75,0x70,0x74,0x69,0x61,0x6c,0, - 0x6e,0x75,0x71,0x75,0x65,0, - 0x6e,0x75,0x74,0x72,0x69,0x74,0x69,0x66,0, - 0x6f,0x62,0x65,0xcc,0x81,0x69,0x72,0, - 0x6f,0x62,0x6a,0x65,0x63,0x74,0x69,0x66,0, - 0x6f,0x62,0x6c,0x69,0x67,0x65,0x72,0, - 0x6f,0x62,0x73,0x63,0x75,0x72,0, - 0x6f,0x62,0x73,0x65,0x72,0x76,0x65,0x72,0, - 0x6f,0x62,0x73,0x74,0x61,0x63,0x6c,0x65,0, - 0x6f,0x62,0x74,0x65,0x6e,0x69,0x72,0, - 0x6f,0x62,0x74,0x75,0x72,0x65,0x72,0, - 0x6f,0x63,0x63,0x61,0x73,0x69,0x6f,0x6e,0, - 0x6f,0x63,0x63,0x75,0x70,0x65,0x72,0, - 0x6f,0x63,0x65,0xcc,0x81,0x61,0x6e,0, - 0x6f,0x63,0x74,0x6f,0x62,0x72,0x65,0, - 0x6f,0x63,0x74,0x72,0x6f,0x79,0x65,0x72,0, - 0x6f,0x63,0x74,0x75,0x70,0x6c,0x65,0x72,0, - 0x6f,0x63,0x75,0x6c,0x61,0x69,0x72,0x65,0, - 0x6f,0x64,0x65,0x75,0x72,0, - 0x6f,0x64,0x6f,0x72,0x61,0x6e,0x74,0, - 0x6f,0x66,0x66,0x65,0x6e,0x73,0x65,0x72,0, - 0x6f,0x66,0x66,0x69,0x63,0x69,0x65,0x72,0, - 0x6f,0x66,0x66,0x72,0x69,0x72,0, - 0x6f,0x67,0x69,0x76,0x65,0, - 0x6f,0x69,0x73,0x65,0x61,0x75,0, - 0x6f,0x69,0x73,0x69,0x6c,0x6c,0x6f,0x6e,0, - 0x6f,0x6c,0x66,0x61,0x63,0x74,0x69,0x66,0, - 0x6f,0x6c,0x69,0x76,0x69,0x65,0x72,0, - 0x6f,0x6d,0x62,0x72,0x61,0x67,0x65,0, - 0x6f,0x6d,0x65,0x74,0x74,0x72,0x65,0, - 0x6f,0x6e,0x63,0x74,0x75,0x65,0x75,0x78,0, - 0x6f,0x6e,0x64,0x75,0x6c,0x65,0x72,0, - 0x6f,0x6e,0x65,0xcc,0x81,0x72,0x65,0x75,0x78,0, - 0x6f,0x6e,0x69,0x72,0x69,0x71,0x75,0x65,0, - 0x6f,0x70,0x61,0x6c,0x65,0, - 0x6f,0x70,0x61,0x71,0x75,0x65,0, - 0x6f,0x70,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x6f,0x70,0x69,0x6e,0x69,0x6f,0x6e,0, - 0x6f,0x70,0x70,0x6f,0x72,0x74,0x75,0x6e,0, - 0x6f,0x70,0x70,0x72,0x69,0x6d,0x65,0x72,0, - 0x6f,0x70,0x74,0x65,0x72,0, - 0x6f,0x70,0x74,0x69,0x71,0x75,0x65,0, - 0x6f,0x72,0x61,0x67,0x65,0x75,0x78,0, - 0x6f,0x72,0x61,0x6e,0x67,0x65,0, - 0x6f,0x72,0x62,0x69,0x74,0x65,0, - 0x6f,0x72,0x64,0x6f,0x6e,0x6e,0x65,0x72,0, - 0x6f,0x72,0x65,0x69,0x6c,0x6c,0x65,0, - 0x6f,0x72,0x67,0x61,0x6e,0x65,0, - 0x6f,0x72,0x67,0x75,0x65,0x69,0x6c,0, - 0x6f,0x72,0x69,0x66,0x69,0x63,0x65,0, - 0x6f,0x72,0x6e,0x65,0x6d,0x65,0x6e,0x74,0, - 0x6f,0x72,0x71,0x75,0x65,0, - 0x6f,0x72,0x74,0x69,0x65,0, - 0x6f,0x73,0x63,0x69,0x6c,0x6c,0x65,0x72,0, - 0x6f,0x73,0x6d,0x6f,0x73,0x65,0, - 0x6f,0x73,0x73,0x61,0x74,0x75,0x72,0x65,0, - 0x6f,0x74,0x61,0x72,0x69,0x65,0, - 0x6f,0x75,0x72,0x61,0x67,0x61,0x6e,0, - 0x6f,0x75,0x72,0x73,0x6f,0x6e,0, - 0x6f,0x75,0x74,0x69,0x6c,0, - 0x6f,0x75,0x74,0x72,0x61,0x67,0x65,0x72,0, - 0x6f,0x75,0x76,0x72,0x61,0x67,0x65,0, - 0x6f,0x76,0x61,0x74,0x69,0x6f,0x6e,0, - 0x6f,0x78,0x79,0x64,0x65,0, - 0x6f,0x78,0x79,0x67,0x65,0xcc,0x80,0x6e,0x65,0, - 0x6f,0x7a,0x6f,0x6e,0x65,0, - 0x70,0x61,0x69,0x73,0x69,0x62,0x6c,0x65,0, - 0x70,0x61,0x6c,0x61,0x63,0x65,0, - 0x70,0x61,0x6c,0x6d,0x61,0x72,0x65,0xcc,0x80,0x73,0, - 0x70,0x61,0x6c,0x6f,0x75,0x72,0x64,0x65,0, - 0x70,0x61,0x6c,0x70,0x65,0x72,0, - 0x70,0x61,0x6e,0x61,0x63,0x68,0x65,0, - 0x70,0x61,0x6e,0x64,0x61,0, - 0x70,0x61,0x6e,0x67,0x6f,0x6c,0x69,0x6e,0, - 0x70,0x61,0x6e,0x69,0x71,0x75,0x65,0x72,0, - 0x70,0x61,0x6e,0x6e,0x65,0x61,0x75,0, - 0x70,0x61,0x6e,0x6f,0x72,0x61,0x6d,0x61,0, - 0x70,0x61,0x6e,0x74,0x61,0x6c,0x6f,0x6e,0, - 0x70,0x61,0x70,0x61,0x79,0x65,0, - 0x70,0x61,0x70,0x69,0x65,0x72,0, - 0x70,0x61,0x70,0x6f,0x74,0x65,0x72,0, - 0x70,0x61,0x70,0x79,0x72,0x75,0x73,0, - 0x70,0x61,0x72,0x61,0x64,0x6f,0x78,0x65,0, - 0x70,0x61,0x72,0x63,0x65,0x6c,0x6c,0x65,0, - 0x70,0x61,0x72,0x65,0x73,0x73,0x65,0, - 0x70,0x61,0x72,0x66,0x75,0x6d,0x65,0x72,0, - 0x70,0x61,0x72,0x6c,0x65,0x72,0, - 0x70,0x61,0x72,0x6f,0x6c,0x65,0, - 0x70,0x61,0x72,0x72,0x61,0x69,0x6e,0, - 0x70,0x61,0x72,0x73,0x65,0x6d,0x65,0x72,0, - 0x70,0x61,0x72,0x74,0x61,0x67,0x65,0x72,0, - 0x70,0x61,0x72,0x75,0x72,0x65,0, - 0x70,0x61,0x72,0x76,0x65,0x6e,0x69,0x72,0, - 0x70,0x61,0x73,0x73,0x69,0x6f,0x6e,0, - 0x70,0x61,0x73,0x74,0x65,0xcc,0x80,0x71,0x75,0x65,0, - 0x70,0x61,0x74,0x65,0x72,0x6e,0x65,0x6c,0, - 0x70,0x61,0x74,0x69,0x65,0x6e,0x63,0x65,0, - 0x70,0x61,0x74,0x72,0x6f,0x6e,0, - 0x70,0x61,0x76,0x69,0x6c,0x6c,0x6f,0x6e,0, - 0x70,0x61,0x76,0x6f,0x69,0x73,0x65,0x72,0, - 0x70,0x61,0x79,0x65,0x72,0, - 0x70,0x61,0x79,0x73,0x61,0x67,0x65,0, - 0x70,0x65,0x69,0x67,0x6e,0x65,0, - 0x70,0x65,0x69,0x6e,0x74,0x72,0x65,0, - 0x70,0x65,0x6c,0x61,0x67,0x65,0, - 0x70,0x65,0xcc,0x81,0x6c,0x69,0x63,0x61,0x6e,0, - 0x70,0x65,0x6c,0x6c,0x65,0, - 0x70,0x65,0x6c,0x6f,0x75,0x73,0x65,0, - 0x70,0x65,0x6c,0x75,0x63,0x68,0x65,0, - 0x70,0x65,0x6e,0x64,0x75,0x6c,0x65,0, - 0x70,0x65,0xcc,0x81,0x6e,0x65,0xcc,0x81,0x74,0x72,0x65,0x72,0, - 0x70,0x65,0xcc,0x81,0x6e,0x69,0x62,0x6c,0x65,0, - 0x70,0x65,0x6e,0x73,0x69,0x66,0, - 0x70,0x65,0xcc,0x81,0x6e,0x75,0x72,0x69,0x65,0, - 0x70,0x65,0xcc,0x81,0x70,0x69,0x74,0x65,0, - 0x70,0x65,0xcc,0x81,0x70,0x6c,0x75,0x6d,0, - 0x70,0x65,0x72,0x64,0x72,0x69,0x78,0, - 0x70,0x65,0x72,0x66,0x6f,0x72,0x65,0x72,0, - 0x70,0x65,0xcc,0x81,0x72,0x69,0x6f,0x64,0x65,0, - 0x70,0x65,0x72,0x6d,0x75,0x74,0x65,0x72,0, - 0x70,0x65,0x72,0x70,0x6c,0x65,0x78,0x65,0, - 0x70,0x65,0x72,0x73,0x69,0x6c,0, - 0x70,0x65,0x72,0x74,0x65,0, - 0x70,0x65,0x73,0x65,0x72,0, - 0x70,0x65,0xcc,0x81,0x74,0x61,0x6c,0x65,0, - 0x70,0x65,0x74,0x69,0x74,0, - 0x70,0x65,0xcc,0x81,0x74,0x72,0x69,0x72,0, - 0x70,0x65,0x75,0x70,0x6c,0x65,0, - 0x70,0x68,0x61,0x72,0x61,0x6f,0x6e,0, - 0x70,0x68,0x6f,0x62,0x69,0x65,0, - 0x70,0x68,0x6f,0x71,0x75,0x65,0, - 0x70,0x68,0x6f,0x74,0x6f,0x6e,0, - 0x70,0x68,0x72,0x61,0x73,0x65,0, - 0x70,0x68,0x79,0x73,0x69,0x71,0x75,0x65,0, - 0x70,0x69,0x61,0x6e,0x6f,0, - 0x70,0x69,0x63,0x74,0x75,0x72,0x61,0x6c,0, - 0x70,0x69,0x65,0xcc,0x80,0x63,0x65,0, - 0x70,0x69,0x65,0x72,0x72,0x65,0, - 0x70,0x69,0x65,0x75,0x76,0x72,0x65,0, - 0x70,0x69,0x6c,0x6f,0x74,0x65,0, - 0x70,0x69,0x6e,0x63,0x65,0x61,0x75,0, - 0x70,0x69,0x70,0x65,0x74,0x74,0x65,0, - 0x70,0x69,0x71,0x75,0x65,0x72,0, - 0x70,0x69,0x72,0x6f,0x67,0x75,0x65,0, - 0x70,0x69,0x73,0x63,0x69,0x6e,0x65,0, - 0x70,0x69,0x73,0x74,0x6f,0x6e,0, - 0x70,0x69,0x76,0x6f,0x74,0x65,0x72,0, - 0x70,0x69,0x78,0x65,0x6c,0, - 0x70,0x69,0x7a,0x7a,0x61,0, - 0x70,0x6c,0x61,0x63,0x61,0x72,0x64,0, - 0x70,0x6c,0x61,0x66,0x6f,0x6e,0x64,0, - 0x70,0x6c,0x61,0x69,0x73,0x69,0x72,0, - 0x70,0x6c,0x61,0x6e,0x65,0x72,0, - 0x70,0x6c,0x61,0x71,0x75,0x65,0, - 0x70,0x6c,0x61,0x73,0x74,0x72,0x6f,0x6e,0, - 0x70,0x6c,0x61,0x74,0x65,0x61,0x75,0, - 0x70,0x6c,0x65,0x75,0x72,0x65,0x72,0, - 0x70,0x6c,0x65,0x78,0x75,0x73,0, - 0x70,0x6c,0x69,0x61,0x67,0x65,0, - 0x70,0x6c,0x6f,0x6d,0x62,0, - 0x70,0x6c,0x6f,0x6e,0x67,0x65,0x72,0, - 0x70,0x6c,0x75,0x69,0x65,0, - 0x70,0x6c,0x75,0x6d,0x61,0x67,0x65,0, - 0x70,0x6f,0x63,0x68,0x65,0x74,0x74,0x65,0, - 0x70,0x6f,0x65,0xcc,0x81,0x73,0x69,0x65,0, - 0x70,0x6f,0x65,0xcc,0x80,0x74,0x65,0, - 0x70,0x6f,0x69,0x6e,0x74,0x65,0, - 0x70,0x6f,0x69,0x72,0x69,0x65,0x72,0, - 0x70,0x6f,0x69,0x73,0x73,0x6f,0x6e,0, - 0x70,0x6f,0x69,0x76,0x72,0x65,0, - 0x70,0x6f,0x6c,0x61,0x69,0x72,0x65,0, - 0x70,0x6f,0x6c,0x69,0x63,0x69,0x65,0x72,0, - 0x70,0x6f,0x6c,0x6c,0x65,0x6e,0, - 0x70,0x6f,0x6c,0x79,0x67,0x6f,0x6e,0x65,0, - 0x70,0x6f,0x6d,0x6d,0x61,0x64,0x65,0, - 0x70,0x6f,0x6d,0x70,0x69,0x65,0x72,0, - 0x70,0x6f,0x6e,0x63,0x74,0x75,0x65,0x6c,0, - 0x70,0x6f,0x6e,0x64,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x70,0x6f,0x6e,0x65,0x79,0, - 0x70,0x6f,0x72,0x74,0x69,0x71,0x75,0x65,0, - 0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0, - 0x70,0x6f,0x73,0x73,0x65,0xcc,0x81,0x64,0x65,0x72,0, - 0x70,0x6f,0x73,0x74,0x75,0x72,0x65,0, - 0x70,0x6f,0x74,0x61,0x67,0x65,0x72,0, - 0x70,0x6f,0x74,0x65,0x61,0x75,0, - 0x70,0x6f,0x74,0x69,0x6f,0x6e,0, - 0x70,0x6f,0x75,0x63,0x65,0, - 0x70,0x6f,0x75,0x6c,0x61,0x69,0x6e,0, - 0x70,0x6f,0x75,0x6d,0x6f,0x6e,0, - 0x70,0x6f,0x75,0x72,0x70,0x72,0x65,0, - 0x70,0x6f,0x75,0x73,0x73,0x69,0x6e,0, - 0x70,0x6f,0x75,0x76,0x6f,0x69,0x72,0, - 0x70,0x72,0x61,0x69,0x72,0x69,0x65,0, - 0x70,0x72,0x61,0x74,0x69,0x71,0x75,0x65,0, - 0x70,0x72,0x65,0xcc,0x81,0x63,0x69,0x65,0x75,0x78,0, - 0x70,0x72,0x65,0xcc,0x81,0x64,0x69,0x72,0x65,0, - 0x70,0x72,0x65,0xcc,0x81,0x66,0x69,0x78,0x65,0, - 0x70,0x72,0x65,0xcc,0x81,0x6c,0x75,0x64,0x65,0, - 0x70,0x72,0x65,0xcc,0x81,0x6e,0x6f,0x6d,0, - 0x70,0x72,0x65,0xcc,0x81,0x73,0x65,0x6e,0x63,0x65,0, - 0x70,0x72,0x65,0xcc,0x81,0x74,0x65,0x78,0x74,0x65,0, - 0x70,0x72,0x65,0xcc,0x81,0x76,0x6f,0x69,0x72,0, - 0x70,0x72,0x69,0x6d,0x69,0x74,0x69,0x66,0, - 0x70,0x72,0x69,0x6e,0x63,0x65,0, - 0x70,0x72,0x69,0x73,0x6f,0x6e,0, - 0x70,0x72,0x69,0x76,0x65,0x72,0, - 0x70,0x72,0x6f,0x62,0x6c,0x65,0xcc,0x80,0x6d,0x65,0, - 0x70,0x72,0x6f,0x63,0x65,0xcc,0x81,0x64,0x65,0x72,0, - 0x70,0x72,0x6f,0x64,0x69,0x67,0x65,0, - 0x70,0x72,0x6f,0x66,0x6f,0x6e,0x64,0, - 0x70,0x72,0x6f,0x67,0x72,0x65,0xcc,0x80,0x73,0, - 0x70,0x72,0x6f,0x69,0x65,0, - 0x70,0x72,0x6f,0x6a,0x65,0x74,0x65,0x72,0, - 0x70,0x72,0x6f,0x6c,0x6f,0x67,0x75,0x65,0, - 0x70,0x72,0x6f,0x6d,0x65,0x6e,0x65,0x72,0, - 0x70,0x72,0x6f,0x70,0x72,0x65,0, - 0x70,0x72,0x6f,0x73,0x70,0x65,0xcc,0x80,0x72,0x65,0, - 0x70,0x72,0x6f,0x74,0x65,0xcc,0x81,0x67,0x65,0x72,0, - 0x70,0x72,0x6f,0x75,0x65,0x73,0x73,0x65,0, - 0x70,0x72,0x6f,0x76,0x65,0x72,0x62,0x65,0, - 0x70,0x72,0x75,0x64,0x65,0x6e,0x63,0x65,0, - 0x70,0x72,0x75,0x6e,0x65,0x61,0x75,0, - 0x70,0x73,0x79,0x63,0x68,0x6f,0x73,0x65,0, - 0x70,0x75,0x62,0x6c,0x69,0x63,0, - 0x70,0x75,0x63,0x65,0x72,0x6f,0x6e,0, - 0x70,0x75,0x69,0x73,0x65,0x72,0, - 0x70,0x75,0x6c,0x70,0x65,0, - 0x70,0x75,0x6c,0x73,0x61,0x72,0, - 0x70,0x75,0x6e,0x61,0x69,0x73,0x65,0, - 0x70,0x75,0x6e,0x69,0x74,0x69,0x66,0, - 0x70,0x75,0x70,0x69,0x74,0x72,0x65,0, - 0x70,0x75,0x72,0x69,0x66,0x69,0x65,0x72,0, - 0x70,0x75,0x7a,0x7a,0x6c,0x65,0, - 0x70,0x79,0x72,0x61,0x6d,0x69,0x64,0x65,0, - 0x71,0x75,0x61,0x73,0x61,0x72,0, - 0x71,0x75,0x65,0x72,0x65,0x6c,0x6c,0x65,0, - 0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0, - 0x71,0x75,0x69,0x65,0xcc,0x81,0x74,0x75,0x64,0x65,0, - 0x71,0x75,0x69,0x74,0x74,0x65,0x72,0, - 0x71,0x75,0x6f,0x74,0x69,0x65,0x6e,0x74,0, - 0x72,0x61,0x63,0x69,0x6e,0x65,0, - 0x72,0x61,0x63,0x6f,0x6e,0x74,0x65,0x72,0, - 0x72,0x61,0x64,0x69,0x65,0x75,0x78,0, - 0x72,0x61,0x67,0x6f,0x6e,0x64,0x69,0x6e,0, - 0x72,0x61,0x69,0x64,0x65,0x75,0x72,0, - 0x72,0x61,0x69,0x73,0x69,0x6e,0, - 0x72,0x61,0x6c,0x65,0x6e,0x74,0x69,0x72,0, - 0x72,0x61,0x6c,0x6c,0x6f,0x6e,0x67,0x65,0, - 0x72,0x61,0x6d,0x61,0x73,0x73,0x65,0x72,0, - 0x72,0x61,0x70,0x69,0x64,0x65,0, - 0x72,0x61,0x73,0x61,0x67,0x65,0, - 0x72,0x61,0x74,0x69,0x73,0x73,0x65,0x72,0, - 0x72,0x61,0x76,0x61,0x67,0x65,0x72,0, - 0x72,0x61,0x76,0x69,0x6e,0, - 0x72,0x61,0x79,0x6f,0x6e,0x6e,0x65,0x72,0, - 0x72,0x65,0xcc,0x81,0x61,0x63,0x74,0x69,0x66,0, - 0x72,0x65,0xcc,0x81,0x61,0x67,0x69,0x72,0, - 0x72,0x65,0xcc,0x81,0x61,0x6c,0x69,0x73,0x65,0x72,0, - 0x72,0x65,0xcc,0x81,0x61,0x6e,0x69,0x6d,0x65,0x72,0, - 0x72,0x65,0x63,0x65,0x76,0x6f,0x69,0x72,0, - 0x72,0x65,0xcc,0x81,0x63,0x69,0x74,0x65,0x72,0, - 0x72,0x65,0xcc,0x81,0x63,0x6c,0x61,0x6d,0x65,0x72,0, - 0x72,0x65,0xcc,0x81,0x63,0x6f,0x6c,0x74,0x65,0x72,0, - 0x72,0x65,0x63,0x72,0x75,0x74,0x65,0x72,0, - 0x72,0x65,0x63,0x75,0x6c,0x65,0x72,0, - 0x72,0x65,0x63,0x79,0x63,0x6c,0x65,0x72,0, - 0x72,0x65,0xcc,0x81,0x64,0x69,0x67,0x65,0x72,0, - 0x72,0x65,0x64,0x6f,0x75,0x74,0x65,0x72,0, - 0x72,0x65,0x66,0x61,0x69,0x72,0x65,0, - 0x72,0x65,0xcc,0x81,0x66,0x6c,0x65,0x78,0x65,0, - 0x72,0x65,0xcc,0x81,0x66,0x6f,0x72,0x6d,0x65,0x72,0, - 0x72,0x65,0x66,0x72,0x61,0x69,0x6e,0, - 0x72,0x65,0x66,0x75,0x67,0x65,0, - 0x72,0x65,0xcc,0x81,0x67,0x61,0x6c,0x69,0x65,0x6e,0, - 0x72,0x65,0xcc,0x81,0x67,0x69,0x6f,0x6e,0, - 0x72,0x65,0xcc,0x81,0x67,0x6c,0x61,0x67,0x65,0, - 0x72,0x65,0xcc,0x81,0x67,0x75,0x6c,0x69,0x65,0x72,0, - 0x72,0x65,0xcc,0x81,0x69,0x74,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x72,0x65,0x6a,0x65,0x74,0x65,0x72,0, - 0x72,0x65,0x6a,0x6f,0x75,0x65,0x72,0, - 0x72,0x65,0x6c,0x61,0x74,0x69,0x66,0, - 0x72,0x65,0x6c,0x65,0x76,0x65,0x72,0, - 0x72,0x65,0x6c,0x69,0x65,0x66,0, - 0x72,0x65,0x6d,0x61,0x72,0x71,0x75,0x65,0, - 0x72,0x65,0x6d,0x65,0xcc,0x80,0x64,0x65,0, - 0x72,0x65,0x6d,0x69,0x73,0x65,0, - 0x72,0x65,0x6d,0x6f,0x6e,0x74,0x65,0x72,0, - 0x72,0x65,0x6d,0x70,0x6c,0x69,0x72,0, - 0x72,0x65,0x6d,0x75,0x65,0x72,0, - 0x72,0x65,0x6e,0x61,0x72,0x64,0, - 0x72,0x65,0x6e,0x66,0x6f,0x72,0x74,0, - 0x72,0x65,0x6e,0x69,0x66,0x6c,0x65,0x72,0, - 0x72,0x65,0x6e,0x6f,0x6e,0x63,0x65,0x72,0, - 0x72,0x65,0x6e,0x74,0x72,0x65,0x72,0, - 0x72,0x65,0x6e,0x76,0x6f,0x69,0, - 0x72,0x65,0x70,0x6c,0x69,0x65,0x72,0, - 0x72,0x65,0x70,0x6f,0x72,0x74,0x65,0x72,0, - 0x72,0x65,0x70,0x72,0x69,0x73,0x65,0, - 0x72,0x65,0x70,0x74,0x69,0x6c,0x65,0, - 0x72,0x65,0x71,0x75,0x69,0x6e,0, - 0x72,0x65,0xcc,0x81,0x73,0x65,0x72,0x76,0x65,0, - 0x72,0x65,0xcc,0x81,0x73,0x69,0x6e,0x65,0x75,0x78,0, - 0x72,0x65,0xcc,0x81,0x73,0x6f,0x75,0x64,0x72,0x65,0, - 0x72,0x65,0x73,0x70,0x65,0x63,0x74,0, - 0x72,0x65,0x73,0x74,0x65,0x72,0, - 0x72,0x65,0xcc,0x81,0x73,0x75,0x6c,0x74,0x61,0x74,0, - 0x72,0x65,0xcc,0x81,0x74,0x61,0x62,0x6c,0x69,0x72,0, - 0x72,0x65,0x74,0x65,0x6e,0x69,0x72,0, - 0x72,0x65,0xcc,0x81,0x74,0x69,0x63,0x75,0x6c,0x65,0, - 0x72,0x65,0x74,0x6f,0x6d,0x62,0x65,0x72,0, - 0x72,0x65,0x74,0x72,0x61,0x63,0x65,0x72,0, - 0x72,0x65,0xcc,0x81,0x75,0x6e,0x69,0x6f,0x6e,0, - 0x72,0x65,0xcc,0x81,0x75,0x73,0x73,0x69,0x72,0, - 0x72,0x65,0x76,0x61,0x6e,0x63,0x68,0x65,0, - 0x72,0x65,0x76,0x69,0x76,0x72,0x65,0, - 0x72,0x65,0xcc,0x81,0x76,0x6f,0x6c,0x74,0x65,0, - 0x72,0x65,0xcc,0x81,0x76,0x75,0x6c,0x73,0x69,0x66,0, - 0x72,0x69,0x63,0x68,0x65,0x73,0x73,0x65,0, - 0x72,0x69,0x64,0x65,0x61,0x75,0, - 0x72,0x69,0x65,0x75,0x72,0, - 0x72,0x69,0x67,0x69,0x64,0x65,0, - 0x72,0x69,0x67,0x6f,0x6c,0x65,0x72,0, - 0x72,0x69,0x6e,0x63,0x65,0x72,0, - 0x72,0x69,0x70,0x6f,0x73,0x74,0x65,0x72,0, - 0x72,0x69,0x73,0x69,0x62,0x6c,0x65,0, - 0x72,0x69,0x73,0x71,0x75,0x65,0, - 0x72,0x69,0x74,0x75,0x65,0x6c,0, - 0x72,0x69,0x76,0x61,0x6c,0, - 0x72,0x69,0x76,0x69,0x65,0xcc,0x80,0x72,0x65,0, - 0x72,0x6f,0x63,0x68,0x65,0x75,0x78,0, - 0x72,0x6f,0x6d,0x61,0x6e,0x63,0x65,0, - 0x72,0x6f,0x6d,0x70,0x72,0x65,0, - 0x72,0x6f,0x6e,0x63,0x65,0, - 0x72,0x6f,0x6e,0x64,0x69,0x6e,0, - 0x72,0x6f,0x73,0x65,0x61,0x75,0, - 0x72,0x6f,0x73,0x69,0x65,0x72,0, - 0x72,0x6f,0x74,0x61,0x74,0x69,0x66,0, - 0x72,0x6f,0x74,0x6f,0x72,0, - 0x72,0x6f,0x74,0x75,0x6c,0x65,0, - 0x72,0x6f,0x75,0x67,0x65,0, - 0x72,0x6f,0x75,0x69,0x6c,0x6c,0x65,0, - 0x72,0x6f,0x75,0x6c,0x65,0x61,0x75,0, - 0x72,0x6f,0x75,0x74,0x69,0x6e,0x65,0, - 0x72,0x6f,0x79,0x61,0x75,0x6d,0x65,0, - 0x72,0x75,0x62,0x61,0x6e,0, - 0x72,0x75,0x62,0x69,0x73,0, - 0x72,0x75,0x63,0x68,0x65,0, - 0x72,0x75,0x65,0x6c,0x6c,0x65,0, - 0x72,0x75,0x67,0x75,0x65,0x75,0x78,0, - 0x72,0x75,0x69,0x6e,0x65,0x72,0, - 0x72,0x75,0x69,0x73,0x73,0x65,0x61,0x75,0, - 0x72,0x75,0x73,0x65,0x72,0, - 0x72,0x75,0x73,0x74,0x69,0x71,0x75,0x65,0, - 0x72,0x79,0x74,0x68,0x6d,0x65,0, - 0x73,0x61,0x62,0x6c,0x65,0x72,0, - 0x73,0x61,0x62,0x6f,0x74,0x65,0x72,0, - 0x73,0x61,0x62,0x72,0x65,0, - 0x73,0x61,0x63,0x6f,0x63,0x68,0x65,0, - 0x73,0x61,0x66,0x61,0x72,0x69,0, - 0x73,0x61,0x67,0x65,0x73,0x73,0x65,0, - 0x73,0x61,0x69,0x73,0x69,0x72,0, - 0x73,0x61,0x6c,0x61,0x64,0x65,0, - 0x73,0x61,0x6c,0x69,0x76,0x65,0, - 0x73,0x61,0x6c,0x6f,0x6e,0, - 0x73,0x61,0x6c,0x75,0x65,0x72,0, - 0x73,0x61,0x6d,0x65,0x64,0x69,0, - 0x73,0x61,0x6e,0x63,0x74,0x69,0x6f,0x6e,0, - 0x73,0x61,0x6e,0x67,0x6c,0x69,0x65,0x72,0, - 0x73,0x61,0x72,0x63,0x61,0x73,0x6d,0x65,0, - 0x73,0x61,0x72,0x64,0x69,0x6e,0x65,0, - 0x73,0x61,0x74,0x75,0x72,0x65,0x72,0, - 0x73,0x61,0x75,0x67,0x72,0x65,0x6e,0x75,0, - 0x73,0x61,0x75,0x6d,0x6f,0x6e,0, - 0x73,0x61,0x75,0x74,0x65,0x72,0, - 0x73,0x61,0x75,0x76,0x61,0x67,0x65,0, - 0x73,0x61,0x76,0x61,0x6e,0x74,0, - 0x73,0x61,0x76,0x6f,0x6e,0x6e,0x65,0x72,0, - 0x73,0x63,0x61,0x6c,0x70,0x65,0x6c,0, - 0x73,0x63,0x61,0x6e,0x64,0x61,0x6c,0x65,0, - 0x73,0x63,0x65,0xcc,0x81,0x6c,0x65,0xcc,0x81,0x72,0x61,0x74,0, - 0x73,0x63,0x65,0xcc,0x81,0x6e,0x61,0x72,0x69,0x6f,0, - 0x73,0x63,0x65,0x70,0x74,0x72,0x65,0, - 0x73,0x63,0x68,0x65,0xcc,0x81,0x6d,0x61,0, - 0x73,0x63,0x69,0x65,0x6e,0x63,0x65,0, - 0x73,0x63,0x69,0x6e,0x64,0x65,0x72,0, - 0x73,0x63,0x6f,0x72,0x65,0, - 0x73,0x63,0x72,0x75,0x74,0x69,0x6e,0, - 0x73,0x63,0x75,0x6c,0x70,0x74,0x65,0x72,0, - 0x73,0x65,0xcc,0x81,0x61,0x6e,0x63,0x65,0, - 0x73,0x65,0xcc,0x81,0x63,0x61,0x62,0x6c,0x65,0, - 0x73,0x65,0xcc,0x81,0x63,0x68,0x65,0x72,0, - 0x73,0x65,0x63,0x6f,0x75,0x65,0x72,0, - 0x73,0x65,0xcc,0x81,0x63,0x72,0x65,0xcc,0x81,0x74,0x65,0x72,0, - 0x73,0x65,0xcc,0x81,0x64,0x61,0x74,0x69,0x66,0, - 0x73,0x65,0xcc,0x81,0x64,0x75,0x69,0x72,0x65,0, - 0x73,0x65,0x69,0x67,0x6e,0x65,0x75,0x72,0, - 0x73,0x65,0xcc,0x81,0x6a,0x6f,0x75,0x72,0, - 0x73,0x65,0xcc,0x81,0x6c,0x65,0x63,0x74,0x69,0x66,0, - 0x73,0x65,0x6d,0x61,0x69,0x6e,0x65,0, - 0x73,0x65,0x6d,0x62,0x6c,0x65,0x72,0, - 0x73,0x65,0x6d,0x65,0x6e,0x63,0x65,0, - 0x73,0x65,0xcc,0x81,0x6d,0x69,0x6e,0x61,0x6c,0, - 0x73,0x65,0xcc,0x81,0x6e,0x61,0x74,0x65,0x75,0x72,0, - 0x73,0x65,0x6e,0x73,0x69,0x62,0x6c,0x65,0, - 0x73,0x65,0x6e,0x74,0x65,0x6e,0x63,0x65,0, - 0x73,0x65,0xcc,0x81,0x70,0x61,0x72,0x65,0x72,0, - 0x73,0x65,0xcc,0x81,0x71,0x75,0x65,0x6e,0x63,0x65,0, - 0x73,0x65,0x72,0x65,0x69,0x6e,0, - 0x73,0x65,0x72,0x67,0x65,0x6e,0x74,0, - 0x73,0x65,0xcc,0x81,0x72,0x69,0x65,0x75,0x78,0, - 0x73,0x65,0x72,0x72,0x75,0x72,0x65,0, - 0x73,0x65,0xcc,0x81,0x72,0x75,0x6d,0, - 0x73,0x65,0x72,0x76,0x69,0x63,0x65,0, - 0x73,0x65,0xcc,0x81,0x73,0x61,0x6d,0x65,0, - 0x73,0x65,0xcc,0x81,0x76,0x69,0x72,0, - 0x73,0x65,0x76,0x72,0x61,0x67,0x65,0, - 0x73,0x65,0x78,0x74,0x75,0x70,0x6c,0x65,0, - 0x73,0x69,0x64,0x65,0xcc,0x81,0x72,0x61,0x6c,0, - 0x73,0x69,0x65,0xcc,0x80,0x63,0x6c,0x65,0, - 0x73,0x69,0x65,0xcc,0x81,0x67,0x65,0x72,0, - 0x73,0x69,0x66,0x66,0x6c,0x65,0x72,0, - 0x73,0x69,0x67,0x6c,0x65,0, - 0x73,0x69,0x67,0x6e,0x61,0x6c,0, - 0x73,0x69,0x6c,0x65,0x6e,0x63,0x65,0, - 0x73,0x69,0x6c,0x69,0x63,0x69,0x75,0x6d,0, - 0x73,0x69,0x6d,0x70,0x6c,0x65,0, - 0x73,0x69,0x6e,0x63,0x65,0xcc,0x80,0x72,0x65,0, - 0x73,0x69,0x6e,0x69,0x73,0x74,0x72,0x65,0, - 0x73,0x69,0x70,0x68,0x6f,0x6e,0, - 0x73,0x69,0x72,0x6f,0x70,0, - 0x73,0x69,0x73,0x6d,0x69,0x71,0x75,0x65,0, - 0x73,0x69,0x74,0x75,0x65,0x72,0, - 0x73,0x6b,0x69,0x65,0x72,0, - 0x73,0x6f,0x63,0x69,0x61,0x6c,0, - 0x73,0x6f,0x63,0x6c,0x65,0, - 0x73,0x6f,0x64,0x69,0x75,0x6d,0, - 0x73,0x6f,0x69,0x67,0x6e,0x65,0x75,0x78,0, - 0x73,0x6f,0x6c,0x64,0x61,0x74,0, - 0x73,0x6f,0x6c,0x65,0x69,0x6c,0, - 0x73,0x6f,0x6c,0x69,0x74,0x75,0x64,0x65,0, - 0x73,0x6f,0x6c,0x75,0x62,0x6c,0x65,0, - 0x73,0x6f,0x6d,0x62,0x72,0x65,0, - 0x73,0x6f,0x6d,0x6d,0x65,0x69,0x6c,0, - 0x73,0x6f,0x6d,0x6e,0x6f,0x6c,0x65,0x72,0, - 0x73,0x6f,0x6e,0x64,0x65,0, - 0x73,0x6f,0x6e,0x67,0x65,0x75,0x72,0, - 0x73,0x6f,0x6e,0x6e,0x65,0x74,0x74,0x65,0, - 0x73,0x6f,0x6e,0x6f,0x72,0x65,0, - 0x73,0x6f,0x72,0x63,0x69,0x65,0x72,0, - 0x73,0x6f,0x72,0x74,0x69,0x72,0, - 0x73,0x6f,0x73,0x69,0x65,0, - 0x73,0x6f,0x74,0x74,0x69,0x73,0x65,0, - 0x73,0x6f,0x75,0x63,0x69,0x65,0x75,0x78,0, - 0x73,0x6f,0x75,0x64,0x75,0x72,0x65,0, - 0x73,0x6f,0x75,0x66,0x66,0x6c,0x65,0, - 0x73,0x6f,0x75,0x6c,0x65,0x76,0x65,0x72,0, - 0x73,0x6f,0x75,0x70,0x61,0x70,0x65,0, - 0x73,0x6f,0x75,0x72,0x63,0x65,0, - 0x73,0x6f,0x75,0x74,0x69,0x72,0x65,0x72,0, - 0x73,0x6f,0x75,0x76,0x65,0x6e,0x69,0x72,0, - 0x73,0x70,0x61,0x63,0x69,0x65,0x75,0x78,0, - 0x73,0x70,0x61,0x74,0x69,0x61,0x6c,0, - 0x73,0x70,0x65,0xcc,0x81,0x63,0x69,0x61,0x6c,0, - 0x73,0x70,0x68,0x65,0xcc,0x80,0x72,0x65,0, - 0x73,0x70,0x69,0x72,0x61,0x6c,0, - 0x73,0x74,0x61,0x62,0x6c,0x65,0, - 0x73,0x74,0x61,0x74,0x69,0x6f,0x6e,0, - 0x73,0x74,0x65,0x72,0x6e,0x75,0x6d,0, - 0x73,0x74,0x69,0x6d,0x75,0x6c,0x75,0x73,0, - 0x73,0x74,0x69,0x70,0x75,0x6c,0x65,0x72,0, - 0x73,0x74,0x72,0x69,0x63,0x74,0, - 0x73,0x74,0x75,0x64,0x69,0x65,0x75,0x78,0, - 0x73,0x74,0x75,0x70,0x65,0x75,0x72,0, - 0x73,0x74,0x79,0x6c,0x69,0x73,0x74,0x65,0, - 0x73,0x75,0x62,0x6c,0x69,0x6d,0x65,0, - 0x73,0x75,0x62,0x73,0x74,0x72,0x61,0x74,0, - 0x73,0x75,0x62,0x74,0x69,0x6c,0, - 0x73,0x75,0x62,0x76,0x65,0x6e,0x69,0x72,0, - 0x73,0x75,0x63,0x63,0x65,0xcc,0x80,0x73,0, - 0x73,0x75,0x63,0x72,0x65,0, - 0x73,0x75,0x66,0x66,0x69,0x78,0x65,0, - 0x73,0x75,0x67,0x67,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x73,0x75,0x69,0x76,0x65,0x75,0x72,0, - 0x73,0x75,0x6c,0x66,0x61,0x74,0x65,0, - 0x73,0x75,0x70,0x65,0x72,0x62,0x65,0, - 0x73,0x75,0x70,0x70,0x6c,0x69,0x65,0x72,0, - 0x73,0x75,0x72,0x66,0x61,0x63,0x65,0, - 0x73,0x75,0x72,0x69,0x63,0x61,0x74,0x65,0, - 0x73,0x75,0x72,0x6d,0x65,0x6e,0x65,0x72,0, - 0x73,0x75,0x72,0x70,0x72,0x69,0x73,0x65,0, - 0x73,0x75,0x72,0x73,0x61,0x75,0x74,0, - 0x73,0x75,0x72,0x76,0x69,0x65,0, - 0x73,0x75,0x73,0x70,0x65,0x63,0x74,0, - 0x73,0x79,0x6c,0x6c,0x61,0x62,0x65,0, - 0x73,0x79,0x6d,0x62,0x6f,0x6c,0x65,0, - 0x73,0x79,0x6d,0x65,0xcc,0x81,0x74,0x72,0x69,0x65,0, - 0x73,0x79,0x6e,0x61,0x70,0x73,0x65,0, - 0x73,0x79,0x6e,0x74,0x61,0x78,0x65,0, - 0x73,0x79,0x73,0x74,0x65,0xcc,0x80,0x6d,0x65,0, - 0x74,0x61,0x62,0x61,0x63,0, - 0x74,0x61,0x62,0x6c,0x69,0x65,0x72,0, - 0x74,0x61,0x63,0x74,0x69,0x6c,0x65,0, - 0x74,0x61,0x69,0x6c,0x6c,0x65,0x72,0, - 0x74,0x61,0x6c,0x65,0x6e,0x74,0, - 0x74,0x61,0x6c,0x69,0x73,0x6d,0x61,0x6e,0, - 0x74,0x61,0x6c,0x6f,0x6e,0x6e,0x65,0x72,0, - 0x74,0x61,0x6d,0x62,0x6f,0x75,0x72,0, - 0x74,0x61,0x6d,0x69,0x73,0x65,0x72,0, - 0x74,0x61,0x6e,0x67,0x69,0x62,0x6c,0x65,0, - 0x74,0x61,0x70,0x69,0x73,0, - 0x74,0x61,0x71,0x75,0x69,0x6e,0x65,0x72,0, - 0x74,0x61,0x72,0x64,0x65,0x72,0, - 0x74,0x61,0x72,0x69,0x66,0, - 0x74,0x61,0x72,0x74,0x69,0x6e,0x65,0, - 0x74,0x61,0x73,0x73,0x65,0, - 0x74,0x61,0x74,0x61,0x6d,0x69,0, - 0x74,0x61,0x74,0x6f,0x75,0x61,0x67,0x65,0, - 0x74,0x61,0x75,0x70,0x65,0, - 0x74,0x61,0x75,0x72,0x65,0x61,0x75,0, - 0x74,0x61,0x78,0x65,0x72,0, - 0x74,0x65,0xcc,0x81,0x6d,0x6f,0x69,0x6e,0, - 0x74,0x65,0x6d,0x70,0x6f,0x72,0x65,0x6c,0, - 0x74,0x65,0x6e,0x61,0x69,0x6c,0x6c,0x65,0, - 0x74,0x65,0x6e,0x64,0x72,0x65,0, - 0x74,0x65,0x6e,0x65,0x75,0x72,0, - 0x74,0x65,0x6e,0x69,0x72,0, - 0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0, - 0x74,0x65,0x72,0x6d,0x69,0x6e,0x65,0x72,0, - 0x74,0x65,0x72,0x6e,0x65,0, - 0x74,0x65,0x72,0x72,0x69,0x62,0x6c,0x65,0, - 0x74,0x65,0xcc,0x81,0x74,0x69,0x6e,0x65,0, - 0x74,0x65,0x78,0x74,0x65,0, - 0x74,0x68,0x65,0xcc,0x80,0x6d,0x65,0, - 0x74,0x68,0x65,0xcc,0x81,0x6f,0x72,0x69,0x65,0, - 0x74,0x68,0x65,0xcc,0x81,0x72,0x61,0x70,0x69,0x65,0, - 0x74,0x68,0x6f,0x72,0x61,0x78,0, - 0x74,0x69,0x62,0x69,0x61,0, - 0x74,0x69,0x65,0xcc,0x80,0x64,0x65,0, - 0x74,0x69,0x6d,0x69,0x64,0x65,0, - 0x74,0x69,0x72,0x65,0x6c,0x69,0x72,0x65,0, - 0x74,0x69,0x72,0x6f,0x69,0x72,0, - 0x74,0x69,0x73,0x73,0x75,0, - 0x74,0x69,0x74,0x61,0x6e,0x65,0, - 0x74,0x69,0x74,0x72,0x65,0, - 0x74,0x69,0x74,0x75,0x62,0x65,0x72,0, - 0x74,0x6f,0x62,0x6f,0x67,0x67,0x61,0x6e,0, - 0x74,0x6f,0x6c,0x65,0xcc,0x81,0x72,0x61,0x6e,0x74,0, - 0x74,0x6f,0x6d,0x61,0x74,0x65,0, - 0x74,0x6f,0x6e,0x69,0x71,0x75,0x65,0, - 0x74,0x6f,0x6e,0x6e,0x65,0x61,0x75,0, - 0x74,0x6f,0x70,0x6f,0x6e,0x79,0x6d,0x65,0, - 0x74,0x6f,0x72,0x63,0x68,0x65,0, - 0x74,0x6f,0x72,0x64,0x72,0x65,0, - 0x74,0x6f,0x72,0x6e,0x61,0x64,0x65,0, - 0x74,0x6f,0x72,0x70,0x69,0x6c,0x6c,0x65,0, - 0x74,0x6f,0x72,0x72,0x65,0x6e,0x74,0, - 0x74,0x6f,0x72,0x73,0x65,0, - 0x74,0x6f,0x72,0x74,0x75,0x65,0, - 0x74,0x6f,0x74,0x65,0x6d,0, - 0x74,0x6f,0x75,0x63,0x68,0x65,0x72,0, - 0x74,0x6f,0x75,0x72,0x6e,0x61,0x67,0x65,0, - 0x74,0x6f,0x75,0x73,0x73,0x65,0x72,0, - 0x74,0x6f,0x78,0x69,0x6e,0x65,0, - 0x74,0x72,0x61,0x63,0x74,0x69,0x6f,0x6e,0, - 0x74,0x72,0x61,0x66,0x69,0x63,0, - 0x74,0x72,0x61,0x67,0x69,0x71,0x75,0x65,0, - 0x74,0x72,0x61,0x68,0x69,0x72,0, - 0x74,0x72,0x61,0x69,0x6e,0, - 0x74,0x72,0x61,0x6e,0x63,0x68,0x65,0x72,0, - 0x74,0x72,0x61,0x76,0x61,0x69,0x6c,0, - 0x74,0x72,0x65,0xcc,0x80,0x66,0x6c,0x65,0, - 0x74,0x72,0x65,0x6d,0x70,0x65,0x72,0, - 0x74,0x72,0x65,0xcc,0x81,0x73,0x6f,0x72,0, - 0x74,0x72,0x65,0x75,0x69,0x6c,0, - 0x74,0x72,0x69,0x61,0x67,0x65,0, - 0x74,0x72,0x69,0x62,0x75,0x6e,0x61,0x6c,0, - 0x74,0x72,0x69,0x63,0x6f,0x74,0x65,0x72,0, - 0x74,0x72,0x69,0x6c,0x6f,0x67,0x69,0x65,0, - 0x74,0x72,0x69,0x6f,0x6d,0x70,0x68,0x65,0, - 0x74,0x72,0x69,0x70,0x6c,0x65,0x72,0, - 0x74,0x72,0x69,0x74,0x75,0x72,0x65,0x72,0, - 0x74,0x72,0x69,0x76,0x69,0x61,0x6c,0, - 0x74,0x72,0x6f,0x6d,0x62,0x6f,0x6e,0x65,0, - 0x74,0x72,0x6f,0x6e,0x63,0, - 0x74,0x72,0x6f,0x70,0x69,0x63,0x61,0x6c,0, - 0x74,0x72,0x6f,0x75,0x70,0x65,0x61,0x75,0, - 0x74,0x75,0x69,0x6c,0x65,0, - 0x74,0x75,0x6c,0x69,0x70,0x65,0, - 0x74,0x75,0x6d,0x75,0x6c,0x74,0x65,0, - 0x74,0x75,0x6e,0x6e,0x65,0x6c,0, - 0x74,0x75,0x72,0x62,0x69,0x6e,0x65,0, - 0x74,0x75,0x74,0x65,0x75,0x72,0, - 0x74,0x75,0x74,0x6f,0x79,0x65,0x72,0, - 0x74,0x75,0x79,0x61,0x75,0, - 0x74,0x79,0x6d,0x70,0x61,0x6e,0, - 0x74,0x79,0x70,0x68,0x6f,0x6e,0, - 0x74,0x79,0x70,0x69,0x71,0x75,0x65,0, - 0x74,0x79,0x72,0x61,0x6e,0, - 0x75,0x62,0x75,0x65,0x73,0x71,0x75,0x65,0, - 0x75,0x6c,0x74,0x69,0x6d,0x65,0, - 0x75,0x6c,0x74,0x72,0x61,0x73,0x6f,0x6e,0, - 0x75,0x6e,0x61,0x6e,0x69,0x6d,0x65,0, - 0x75,0x6e,0x69,0x66,0x69,0x65,0x72,0, - 0x75,0x6e,0x69,0x6f,0x6e,0, - 0x75,0x6e,0x69,0x71,0x75,0x65,0, - 0x75,0x6e,0x69,0x74,0x61,0x69,0x72,0x65,0, - 0x75,0x6e,0x69,0x76,0x65,0x72,0x73,0, - 0x75,0x72,0x61,0x6e,0x69,0x75,0x6d,0, - 0x75,0x72,0x62,0x61,0x69,0x6e,0, - 0x75,0x72,0x74,0x69,0x63,0x61,0x6e,0x74,0, - 0x75,0x73,0x61,0x67,0x65,0, - 0x75,0x73,0x69,0x6e,0x65,0, - 0x75,0x73,0x75,0x65,0x6c,0, - 0x75,0x73,0x75,0x72,0x65,0, - 0x75,0x74,0x69,0x6c,0x65,0, - 0x75,0x74,0x6f,0x70,0x69,0x65,0, - 0x76,0x61,0x63,0x61,0x72,0x6d,0x65,0, - 0x76,0x61,0x63,0x63,0x69,0x6e,0, - 0x76,0x61,0x67,0x61,0x62,0x6f,0x6e,0x64,0, - 0x76,0x61,0x67,0x75,0x65,0, - 0x76,0x61,0x69,0x6c,0x6c,0x61,0x6e,0x74,0, - 0x76,0x61,0x69,0x6e,0x63,0x72,0x65,0, - 0x76,0x61,0x69,0x73,0x73,0x65,0x61,0x75,0, - 0x76,0x61,0x6c,0x61,0x62,0x6c,0x65,0, - 0x76,0x61,0x6c,0x69,0x73,0x65,0, - 0x76,0x61,0x6c,0x6c,0x6f,0x6e,0, - 0x76,0x61,0x6c,0x76,0x65,0, - 0x76,0x61,0x6d,0x70,0x69,0x72,0x65,0, - 0x76,0x61,0x6e,0x69,0x6c,0x6c,0x65,0, - 0x76,0x61,0x70,0x65,0x75,0x72,0, - 0x76,0x61,0x72,0x69,0x65,0x72,0, - 0x76,0x61,0x73,0x65,0x75,0x78,0, - 0x76,0x61,0x73,0x73,0x61,0x6c,0, - 0x76,0x61,0x73,0x74,0x65,0, - 0x76,0x65,0x63,0x74,0x65,0x75,0x72,0, - 0x76,0x65,0x64,0x65,0x74,0x74,0x65,0, - 0x76,0x65,0xcc,0x81,0x67,0x65,0xcc,0x81,0x74,0x61,0x6c,0, - 0x76,0x65,0xcc,0x81,0x68,0x69,0x63,0x75,0x6c,0x65,0, - 0x76,0x65,0x69,0x6e,0x61,0x72,0x64,0, - 0x76,0x65,0xcc,0x81,0x6c,0x6f,0x63,0x65,0, - 0x76,0x65,0x6e,0x64,0x72,0x65,0x64,0x69,0, - 0x76,0x65,0xcc,0x81,0x6e,0x65,0xcc,0x81,0x72,0x65,0x72,0, - 0x76,0x65,0x6e,0x67,0x65,0x72,0, - 0x76,0x65,0x6e,0x69,0x6d,0x65,0x75,0x78,0, - 0x76,0x65,0x6e,0x74,0x6f,0x75,0x73,0x65,0, - 0x76,0x65,0x72,0x64,0x75,0x72,0x65,0, - 0x76,0x65,0xcc,0x81,0x72,0x69,0x6e,0, - 0x76,0x65,0x72,0x6e,0x69,0x72,0, - 0x76,0x65,0x72,0x72,0x6f,0x75,0, - 0x76,0x65,0x72,0x73,0x65,0x72,0, - 0x76,0x65,0x72,0x74,0x75,0, - 0x76,0x65,0x73,0x74,0x6f,0x6e,0, - 0x76,0x65,0xcc,0x81,0x74,0x65,0xcc,0x81,0x72,0x61,0x6e,0, - 0x76,0x65,0xcc,0x81,0x74,0x75,0x73,0x74,0x65,0, - 0x76,0x65,0x78,0x61,0x6e,0x74,0, - 0x76,0x65,0x78,0x65,0x72,0, - 0x76,0x69,0x61,0x64,0x75,0x63,0, - 0x76,0x69,0x61,0x6e,0x64,0x65,0, - 0x76,0x69,0x63,0x74,0x6f,0x69,0x72,0x65,0, - 0x76,0x69,0x64,0x61,0x6e,0x67,0x65,0, - 0x76,0x69,0x64,0x65,0xcc,0x81,0x6f,0, - 0x76,0x69,0x67,0x6e,0x65,0x74,0x74,0x65,0, - 0x76,0x69,0x67,0x75,0x65,0x75,0x72,0, - 0x76,0x69,0x6c,0x61,0x69,0x6e,0, - 0x76,0x69,0x6c,0x6c,0x61,0x67,0x65,0, - 0x76,0x69,0x6e,0x61,0x69,0x67,0x72,0x65,0, - 0x76,0x69,0x6f,0x6c,0x6f,0x6e,0, - 0x76,0x69,0x70,0x65,0xcc,0x80,0x72,0x65,0, - 0x76,0x69,0x72,0x65,0x6d,0x65,0x6e,0x74,0, - 0x76,0x69,0x72,0x74,0x75,0x6f,0x73,0x65,0, - 0x76,0x69,0x72,0x75,0x73,0, - 0x76,0x69,0x73,0x61,0x67,0x65,0, - 0x76,0x69,0x73,0x65,0x75,0x72,0, - 0x76,0x69,0x73,0x69,0x6f,0x6e,0, - 0x76,0x69,0x73,0x71,0x75,0x65,0x75,0x78,0, - 0x76,0x69,0x73,0x75,0x65,0x6c,0, - 0x76,0x69,0x74,0x61,0x6c,0, - 0x76,0x69,0x74,0x65,0x73,0x73,0x65,0, - 0x76,0x69,0x74,0x69,0x63,0x6f,0x6c,0x65,0, - 0x76,0x69,0x74,0x72,0x69,0x6e,0x65,0, - 0x76,0x69,0x76,0x61,0x63,0x65,0, - 0x76,0x69,0x76,0x69,0x70,0x61,0x72,0x65,0, - 0x76,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0, - 0x76,0x6f,0x67,0x75,0x65,0x72,0, - 0x76,0x6f,0x69,0x6c,0x65,0, - 0x76,0x6f,0x69,0x73,0x69,0x6e,0, - 0x76,0x6f,0x69,0x74,0x75,0x72,0x65,0, - 0x76,0x6f,0x6c,0x61,0x69,0x6c,0x6c,0x65,0, - 0x76,0x6f,0x6c,0x63,0x61,0x6e,0, - 0x76,0x6f,0x6c,0x74,0x69,0x67,0x65,0x72,0, - 0x76,0x6f,0x6c,0x75,0x6d,0x65,0, - 0x76,0x6f,0x72,0x61,0x63,0x65,0, - 0x76,0x6f,0x72,0x74,0x65,0x78,0, - 0x76,0x6f,0x74,0x65,0x72,0, - 0x76,0x6f,0x75,0x6c,0x6f,0x69,0x72,0, - 0x76,0x6f,0x79,0x61,0x67,0x65,0, - 0x76,0x6f,0x79,0x65,0x6c,0x6c,0x65,0, - 0x77,0x61,0x67,0x6f,0x6e,0, - 0x78,0x65,0xcc,0x81,0x6e,0x6f,0x6e,0, - 0x79,0x61,0x63,0x68,0x74,0, - 0x7a,0x65,0xcc,0x80,0x62,0x72,0x65,0, - 0x7a,0x65,0xcc,0x81,0x6e,0x69,0x74,0x68,0, - 0x7a,0x65,0x73,0x74,0x65,0, - 0x7a,0x6f,0x6f,0x6c,0x6f,0x67,0x69,0x65,0, -}; -#define fr ((const char*)fr_) -static const char *fr_i[] = { - fr+0, fr+9, fr+17, fr+26, fr+34, fr+41, - fr+49, fr+57, fr+64, fr+72, fr+81, fr+89, - fr+97, fr+104, fr+112, fr+119, fr+127, fr+134, - fr+142, fr+153, fr+160, fr+168, fr+177, fr+186, - fr+195, fr+204, fr+213, fr+221, fr+228, fr+234, - fr+242, fr+251, fr+257, fr+265, fr+276, fr+285, - fr+292, fr+298, fr+305, fr+312, fr+322, fr+332, - fr+341, fr+349, fr+358, fr+366, fr+374, fr+381, - fr+389, fr+397, fr+404, fr+411, fr+419, fr+427, - fr+437, fr+445, fr+454, fr+462, fr+470, fr+479, - fr+486, fr+494, fr+500, fr+507, fr+515, fr+526, - fr+533, fr+539, fr+548, fr+555, fr+563, fr+571, - fr+579, fr+587, fr+595, fr+604, fr+611, fr+621, - fr+627, fr+637, fr+645, fr+655, fr+663, fr+671, - fr+679, fr+688, fr+695, fr+703, fr+713, fr+721, - fr+728, fr+734, fr+745, fr+754, fr+761, fr+768, - fr+776, fr+782, fr+791, fr+800, fr+808, fr+816, - fr+824, fr+833, fr+842, fr+851, fr+858, fr+869, - fr+875, fr+884, fr+893, fr+900, fr+908, fr+916, - fr+923, fr+930, fr+939, fr+947, fr+955, fr+963, - fr+972, fr+980, fr+988, fr+999, fr+1007, fr+1016, - fr+1025, fr+1033, fr+1042, fr+1050, fr+1059, fr+1067, - fr+1075, fr+1083, fr+1090, fr+1098, fr+1105, fr+1114, - fr+1123, fr+1132, fr+1140, fr+1147, fr+1156, fr+1165, - fr+1173, fr+1181, fr+1189, fr+1200, fr+1208, fr+1215, - fr+1224, fr+1232, fr+1239, fr+1248, fr+1257, fr+1266, - fr+1274, fr+1282, fr+1288, fr+1295, fr+1303, fr+1309, - fr+1316, fr+1323, fr+1331, fr+1340, fr+1348, fr+1357, - fr+1365, fr+1373, fr+1380, fr+1388, fr+1396, fr+1403, - fr+1411, fr+1420, fr+1427, fr+1435, fr+1443, fr+1450, - fr+1457, fr+1465, fr+1474, fr+1480, fr+1486, fr+1493, - fr+1500, fr+1507, fr+1513, fr+1519, fr+1526, fr+1532, - fr+1540, fr+1547, fr+1556, fr+1565, fr+1574, fr+1581, - fr+1589, fr+1598, fr+1605, fr+1614, fr+1622, fr+1631, - fr+1642, fr+1651, fr+1659, fr+1665, fr+1671, fr+1678, - fr+1686, fr+1693, fr+1701, fr+1710, fr+1717, fr+1726, - fr+1735, fr+1744, fr+1752, fr+1761, fr+1768, fr+1781, - fr+1789, fr+1796, fr+1804, fr+1812, fr+1819, fr+1827, - fr+1836, fr+1843, fr+1851, fr+1859, fr+1866, fr+1872, - fr+1878, fr+1887, fr+1895, fr+1903, fr+1912, fr+1920, - fr+1928, fr+1936, fr+1942, fr+1951, fr+1958, fr+1966, - fr+1974, fr+1981, fr+1990, fr+1999, fr+2007, fr+2013, - fr+2021, fr+2029, fr+2036, fr+2043, fr+2049, fr+2056, - fr+2063, fr+2070, fr+2077, fr+2085, fr+2094, fr+2100, - fr+2108, fr+2114, fr+2120, fr+2127, fr+2134, fr+2141, - fr+2148, fr+2156, fr+2163, fr+2172, fr+2181, fr+2188, - fr+2196, fr+2204, fr+2210, fr+2217, fr+2226, fr+2235, - fr+2244, fr+2252, fr+2261, fr+2269, fr+2276, fr+2285, - fr+2292, fr+2300, fr+2308, fr+2316, fr+2322, fr+2330, - fr+2337, fr+2345, fr+2352, fr+2360, fr+2369, fr+2376, - fr+2382, fr+2390, fr+2398, fr+2405, fr+2413, fr+2421, - fr+2429, fr+2436, fr+2445, fr+2452, fr+2458, fr+2468, - fr+2476, fr+2484, fr+2493, fr+2501, fr+2509, fr+2516, - fr+2525, fr+2534, fr+2543, fr+2552, fr+2559, fr+2568, - fr+2574, fr+2582, fr+2588, fr+2596, fr+2604, fr+2612, - fr+2620, fr+2628, fr+2636, fr+2643, fr+2651, fr+2660, - fr+2668, fr+2677, fr+2685, fr+2693, fr+2701, fr+2709, - fr+2716, fr+2724, fr+2731, fr+2738, fr+2746, fr+2753, - fr+2761, fr+2770, fr+2778, fr+2785, fr+2795, fr+2804, - fr+2814, fr+2822, fr+2831, fr+2840, fr+2848, fr+2855, - fr+2868, fr+2875, fr+2882, fr+2890, fr+2897, fr+2905, - fr+2912, fr+2920, fr+2928, fr+2935, fr+2944, fr+2952, - fr+2961, fr+2968, fr+2977, fr+2986, fr+2994, fr+3003, - fr+3014, fr+3023, fr+3030, fr+3036, fr+3044, fr+3052, - fr+3062, fr+3068, fr+3077, fr+3086, fr+3094, fr+3100, - fr+3109, fr+3116, fr+3122, fr+3129, fr+3137, fr+3146, - fr+3155, fr+3163, fr+3172, fr+3178, fr+3185, fr+3193, - fr+3201, fr+3208, fr+3214, fr+3222, fr+3230, fr+3238, - fr+3245, fr+3253, fr+3260, fr+3268, fr+3275, fr+3283, - fr+3290, fr+3298, fr+3307, fr+3314, fr+3320, fr+3328, - fr+3337, fr+3343, fr+3352, fr+3359, fr+3366, fr+3377, - fr+3385, fr+3393, fr+3402, fr+3410, fr+3418, fr+3427, - fr+3435, fr+3442, fr+3452, fr+3461, fr+3469, fr+3477, - fr+3486, fr+3494, fr+3503, fr+3512, fr+3521, fr+3529, - fr+3537, fr+3544, fr+3550, fr+3557, fr+3565, fr+3573, - fr+3582, fr+3589, fr+3597, fr+3607, fr+3616, fr+3624, - fr+3630, fr+3636, fr+3644, fr+3652, fr+3660, fr+3668, - fr+3675, fr+3681, fr+3689, fr+3697, fr+3704, fr+3715, - fr+3726, fr+3736, fr+3744, fr+3753, fr+3761, fr+3767, - fr+3775, fr+3785, fr+3792, fr+3800, fr+3808, fr+3816, - fr+3822, fr+3830, fr+3838, fr+3847, fr+3858, fr+3866, - fr+3873, fr+3882, fr+3891, fr+3899, fr+3906, fr+3914, - fr+3922, fr+3930, fr+3936, fr+3945, fr+3953, fr+3961, - fr+3968, fr+3975, fr+3983, fr+3991, fr+4002, fr+4012, - fr+4023, fr+4034, fr+4045, fr+4055, fr+4066, fr+4077, - fr+4087, fr+4098, fr+4108, fr+4118, fr+4129, fr+4138, - fr+4149, fr+4158, fr+4169, fr+4179, fr+4190, fr+4200, - fr+4211, fr+4222, fr+4233, fr+4244, fr+4253, fr+4263, - fr+4272, fr+4281, fr+4291, fr+4302, fr+4312, fr+4321, - fr+4331, fr+4340, fr+4351, fr+4362, fr+4373, fr+4383, - fr+4394, fr+4404, fr+4415, fr+4424, fr+4433, fr+4444, - fr+4457, fr+4466, fr+4475, fr+4486, fr+4497, fr+4508, - fr+4519, fr+4528, fr+4536, fr+4544, fr+4551, fr+4558, - fr+4567, fr+4575, fr+4582, fr+4593, fr+4603, fr+4611, - fr+4617, fr+4624, fr+4633, fr+4642, fr+4650, fr+4659, - fr+4667, fr+4676, fr+4685, fr+4694, fr+4703, fr+4712, - fr+4720, fr+4727, fr+4735, fr+4741, fr+4747, fr+4755, - fr+4764, fr+4772, fr+4781, fr+4788, fr+4795, fr+4804, - fr+4812, fr+4819, fr+4826, fr+4833, fr+4841, fr+4850, - fr+4859, fr+4866, fr+4874, fr+4881, fr+4887, fr+4894, - fr+4901, fr+4909, fr+4918, fr+4927, fr+4935, fr+4943, - fr+4951, fr+4958, fr+4967, fr+4977, fr+4987, fr+4997, - fr+5007, fr+5018, fr+5028, fr+5037, fr+5046, fr+5054, - fr+5065, fr+5074, fr+5084, fr+5094, fr+5106, fr+5117, - fr+5125, fr+5133, fr+5144, fr+5154, fr+5164, fr+5172, - fr+5181, fr+5189, fr+5196, fr+5205, fr+5214, fr+5225, - fr+5234, fr+5244, fr+5255, fr+5265, fr+5276, fr+5288, - fr+5301, fr+5311, fr+5322, fr+5333, fr+5341, fr+5352, - fr+5361, fr+5370, fr+5379, fr+5387, fr+5398, fr+5409, - fr+5417, fr+5427, fr+5438, fr+5447, fr+5456, fr+5465, - fr+5473, fr+5484, fr+5493, fr+5503, fr+5511, fr+5519, - fr+5528, fr+5537, fr+5545, fr+5553, fr+5563, fr+5571, - fr+5580, fr+5588, fr+5596, fr+5602, fr+5611, fr+5620, - fr+5629, fr+5635, fr+5643, fr+5650, fr+5659, fr+5668, - fr+5677, fr+5686, fr+5695, fr+5704, fr+5711, fr+5720, - fr+5729, fr+5742, fr+5750, fr+5759, fr+5767, fr+5774, - fr+5783, fr+5794, fr+5804, fr+5814, fr+5823, fr+5834, - fr+5847, fr+5855, fr+5866, fr+5874, fr+5884, fr+5895, - fr+5904, fr+5914, fr+5925, fr+5936, fr+5946, fr+5955, - fr+5964, fr+5974, fr+5981, fr+5992, fr+6001, fr+6009, - fr+6018, fr+6029, fr+6036, fr+6043, fr+6052, fr+6060, - fr+6068, fr+6075, fr+6083, fr+6090, fr+6098, fr+6106, - fr+6118, fr+6127, fr+6137, fr+6148, fr+6159, fr+6170, - fr+6180, fr+6190, fr+6200, fr+6207, fr+6216, fr+6226, - fr+6235, fr+6246, fr+6257, fr+6267, fr+6276, fr+6284, - fr+6293, fr+6303, fr+6313, fr+6324, fr+6335, fr+6344, - fr+6355, fr+6365, fr+6371, fr+6382, fr+6390, fr+6399, - fr+6408, fr+6417, fr+6424, fr+6435, fr+6443, fr+6451, - fr+6459, fr+6468, fr+6477, fr+6484, fr+6492, fr+6501, - fr+6512, fr+6521, fr+6529, fr+6538, fr+6545, fr+6554, - fr+6563, fr+6571, fr+6577, fr+6586, fr+6594, fr+6601, - fr+6609, fr+6617, fr+6625, fr+6632, fr+6640, fr+6648, - fr+6656, fr+6663, fr+6672, fr+6681, fr+6687, fr+6695, - fr+6702, fr+6709, fr+6716, fr+6723, fr+6733, fr+6744, - fr+6756, fr+6764, fr+6770, fr+6778, fr+6786, fr+6795, - fr+6802, fr+6811, fr+6819, fr+6828, fr+6836, fr+6843, - fr+6853, fr+6860, fr+6868, fr+6875, fr+6884, fr+6891, - fr+6900, fr+6909, fr+6919, fr+6927, fr+6934, fr+6940, - fr+6948, fr+6957, fr+6963, fr+6969, fr+6975, fr+6983, - fr+6989, fr+6997, fr+7004, fr+7012, fr+7021, fr+7029, - fr+7038, fr+7044, fr+7052, fr+7059, fr+7065, fr+7074, - fr+7081, fr+7089, fr+7095, fr+7104, fr+7113, fr+7122, - fr+7129, fr+7138, fr+7147, fr+7155, fr+7163, fr+7170, - fr+7180, fr+7189, fr+7197, fr+7204, fr+7212, fr+7219, - fr+7228, fr+7236, fr+7244, fr+7254, fr+7262, fr+7269, - fr+7278, fr+7291, fr+7299, fr+7307, fr+7316, fr+7324, - fr+7332, fr+7338, fr+7346, fr+7354, fr+7362, fr+7368, - fr+7376, fr+7382, fr+7389, fr+7397, fr+7404, fr+7411, - fr+7417, fr+7424, fr+7432, fr+7440, fr+7449, fr+7458, - fr+7466, fr+7473, fr+7482, fr+7490, fr+7496, fr+7504, - fr+7515, fr+7524, fr+7533, fr+7545, fr+7553, fr+7559, - fr+7566, fr+7577, fr+7590, fr+7601, fr+7607, fr+7615, - fr+7622, fr+7629, fr+7636, fr+7643, fr+7649, fr+7655, - fr+7662, fr+7670, fr+7676, fr+7683, fr+7692, fr+7700, - fr+7706, fr+7714, fr+7720, fr+7728, fr+7736, fr+7744, - fr+7751, fr+7760, fr+7769, fr+7776, fr+7784, fr+7793, - fr+7800, fr+7806, fr+7814, fr+7822, fr+7829, fr+7836, - fr+7845, fr+7853, fr+7861, fr+7869, fr+7877, fr+7884, - fr+7891, fr+7898, fr+7906, fr+7916, fr+7926, fr+7935, - fr+7941, fr+7950, fr+7958, fr+7967, fr+7976, fr+7985, - fr+7994, fr+8002, fr+8008, fr+8015, fr+8022, fr+8031, - fr+8039, fr+8048, fr+8055, fr+8062, fr+8071, fr+8082, - fr+8088, fr+8099, fr+8107, fr+8115, fr+8125, fr+8133, - fr+8142, fr+8148, fr+8157, fr+8166, fr+8172, fr+8179, - fr+8187, fr+8198, fr+8206, fr+8214, fr+8222, fr+8228, - fr+8236, fr+8244, fr+8252, fr+8261, fr+8269, fr+8276, - fr+8283, fr+8291, fr+8298, fr+8305, fr+8312, fr+8319, - fr+8326, fr+8335, fr+8345, fr+8351, fr+8359, fr+8366, - fr+8374, fr+8381, fr+8390, fr+8399, fr+8405, fr+8413, - fr+8420, fr+8428, fr+8437, fr+8446, fr+8453, fr+8464, - fr+8473, fr+8481, fr+8490, fr+8498, fr+8507, fr+8516, - fr+8525, fr+8534, fr+8543, fr+8551, fr+8558, fr+8567, - fr+8576, fr+8584, fr+8592, fr+8599, fr+8608, fr+8617, - fr+8626, fr+8636, fr+8644, fr+8652, fr+8661, fr+8668, - fr+8677, fr+8686, fr+8694, fr+8703, fr+8711, fr+8719, - fr+8728, fr+8737, fr+8746, fr+8755, fr+8762, fr+8770, - fr+8777, fr+8786, fr+8795, fr+8803, fr+8812, fr+8821, - fr+8829, fr+8838, fr+8847, fr+8856, fr+8865, fr+8873, - fr+8880, fr+8887, fr+8895, fr+8902, fr+8910, fr+8916, - fr+8924, fr+8931, fr+8938, fr+8944, fr+8952, fr+8960, - fr+8966, fr+8972, fr+8981, fr+8989, fr+8997, fr+9005, - fr+9012, fr+9021, fr+9029, fr+9036, fr+9042, fr+9049, - fr+9057, fr+9066, fr+9073, fr+9079, fr+9087, fr+9095, - fr+9102, fr+9113, fr+9119, fr+9126, fr+9134, fr+9140, - fr+9147, fr+9156, fr+9166, fr+9174, fr+9181, fr+9187, - fr+9195, fr+9203, fr+9211, fr+9219, fr+9225, fr+9233, - fr+9241, fr+9250, fr+9256, fr+9264, fr+9270, fr+9278, - fr+9285, fr+9292, fr+9300, fr+9308, fr+9316, fr+9325, - fr+9333, fr+9340, fr+9347, fr+9355, fr+9364, fr+9371, - fr+9381, fr+9387, fr+9395, fr+9403, fr+9411, fr+9420, - fr+9429, fr+9437, fr+9443, fr+9449, fr+9456, fr+9465, - fr+9473, fr+9484, fr+9491, fr+9500, fr+9508, fr+9518, - fr+9525, fr+9533, fr+9540, fr+9549, fr+9557, fr+9565, - fr+9574, fr+9581, fr+9589, fr+9597, fr+9603, fr+9609, - fr+9616, fr+9622, fr+9628, fr+9634, fr+9641, fr+9650, - fr+9656, fr+9664, fr+9672, fr+9682, fr+9690, fr+9696, - fr+9702, fr+9709, fr+9717, fr+9725, fr+9733, fr+9741, - fr+9749, fr+9756, fr+9764, fr+9773, fr+9780, fr+9787, - fr+9795, fr+9803, fr+9814, fr+9822, fr+9829, fr+9838, - fr+9847, fr+9856, fr+9865, fr+9874, fr+9882, fr+9889, - fr+9898, fr+9905, fr+9914, fr+9920, fr+9929, fr+9938, - fr+9945, fr+9954, fr+9963, fr+9970, fr+9981, fr+9991, - fr+10000, fr+10008, fr+10017, fr+10023, fr+10031, fr+10041, - fr+10051, fr+10062, fr+10072, fr+10082, fr+10091, fr+10100, - fr+10110, fr+10120, fr+10127, fr+10137, fr+10145, fr+10151, - fr+10158, fr+10167, fr+10174, fr+10183, fr+10192, fr+10198, - fr+10207, fr+10214, fr+10222, fr+10234, fr+10244, fr+10253, - fr+10260, fr+10268, fr+10276, fr+10283, fr+10290, fr+10297, - fr+10304, fr+10312, fr+10320, fr+10326, fr+10336, fr+10344, - fr+10352, fr+10359, fr+10367, fr+10376, fr+10384, fr+10390, - fr+10397, fr+10405, fr+10414, fr+10422, fr+10431, fr+10439, - fr+10448, fr+10456, fr+10465, fr+10474, fr+10482, fr+10490, - fr+10498, fr+10506, fr+10513, fr+10519, fr+10526, fr+10533, - fr+10540, fr+10548, fr+10555, fr+10563, fr+10572, fr+10581, - fr+10590, fr+10599, fr+10607, fr+10614, fr+10623, fr+10632, - fr+10641, fr+10647, fr+10654, fr+10662, fr+10671, fr+10681, - fr+10690, fr+10697, fr+10703, fr+10712, fr+10719, fr+10728, - fr+10735, fr+10742, fr+10751, fr+10760, fr+10767, fr+10778, - fr+10785, fr+10795, fr+10806, fr+10817, fr+10828, fr+10834, - fr+10842, fr+10851, fr+10859, fr+10867, fr+10873, fr+10879, - fr+10886, fr+10894, fr+10901, fr+10907, fr+10913, fr+10922, - fr+10931, fr+10940, fr+10947, fr+10956, fr+10963, fr+10972, - fr+10980, fr+10989, fr+10997, fr+11005, fr+11013, fr+11022, - fr+11031, fr+11038, fr+11044, fr+11052, fr+11058, fr+11067, - fr+11076, fr+11084, fr+11090, fr+11099, fr+11107, fr+11116, - fr+11124, fr+11131, fr+11140, fr+11149, fr+11157, fr+11165, - fr+11174, fr+11182, fr+11190, fr+11198, fr+11207, fr+11216, - fr+11225, fr+11231, fr+11239, fr+11248, fr+11257, fr+11264, - fr+11270, fr+11277, fr+11286, fr+11295, fr+11303, fr+11311, - fr+11319, fr+11328, fr+11336, fr+11346, fr+11355, fr+11361, - fr+11368, fr+11377, fr+11385, fr+11394, fr+11403, fr+11409, - fr+11417, fr+11425, fr+11432, fr+11439, fr+11448, fr+11456, - fr+11463, fr+11471, fr+11479, fr+11488, fr+11494, fr+11500, - fr+11509, fr+11516, fr+11525, fr+11532, fr+11540, fr+11547, - fr+11553, fr+11562, fr+11570, fr+11578, fr+11584, fr+11594, - fr+11600, fr+11609, fr+11616, fr+11627, fr+11636, fr+11643, - fr+11651, fr+11657, fr+11666, fr+11675, fr+11683, fr+11692, - fr+11701, fr+11708, fr+11715, fr+11723, fr+11731, fr+11740, - fr+11749, fr+11757, fr+11766, fr+11773, fr+11780, fr+11788, - fr+11797, fr+11806, fr+11813, fr+11822, fr+11830, fr+11841, - fr+11850, fr+11859, fr+11866, fr+11875, fr+11884, fr+11890, - fr+11898, fr+11905, fr+11913, fr+11920, fr+11930, fr+11936, - fr+11944, fr+11952, fr+11960, fr+11973, fr+11983, fr+11990, - fr+12000, fr+12009, fr+12018, fr+12026, fr+12035, fr+12045, - fr+12054, fr+12063, fr+12070, fr+12076, fr+12082, fr+12091, - fr+12097, fr+12106, fr+12113, fr+12121, fr+12128, fr+12135, - fr+12142, fr+12149, fr+12158, fr+12164, fr+12173, fr+12181, - fr+12188, fr+12196, fr+12203, fr+12211, fr+12219, fr+12226, - fr+12234, fr+12242, fr+12249, fr+12257, fr+12263, fr+12269, - fr+12277, fr+12285, fr+12293, fr+12300, fr+12307, fr+12316, - fr+12324, fr+12332, fr+12339, fr+12346, fr+12352, fr+12360, - fr+12366, fr+12374, fr+12383, fr+12392, fr+12400, fr+12407, - fr+12415, fr+12423, fr+12430, fr+12438, fr+12447, fr+12454, - fr+12463, fr+12471, fr+12479, fr+12488, fr+12499, fr+12505, - fr+12514, fr+12523, fr+12534, fr+12542, fr+12550, fr+12557, - fr+12564, fr+12570, fr+12578, fr+12585, fr+12593, fr+12601, - fr+12609, fr+12617, fr+12626, fr+12637, fr+12647, fr+12657, - fr+12667, fr+12676, fr+12687, fr+12698, fr+12708, fr+12717, - fr+12724, fr+12731, fr+12738, fr+12749, fr+12760, fr+12768, - fr+12776, fr+12786, fr+12792, fr+12801, fr+12810, fr+12819, - fr+12826, fr+12837, fr+12848, fr+12857, fr+12866, fr+12875, - fr+12883, fr+12892, fr+12899, fr+12907, fr+12914, fr+12920, - fr+12927, fr+12935, fr+12943, fr+12951, fr+12960, fr+12967, - fr+12976, fr+12983, fr+12992, fr+13001, fr+13012, fr+13020, - fr+13029, fr+13036, fr+13045, fr+13053, fr+13062, fr+13070, - fr+13077, fr+13086, fr+13095, fr+13104, fr+13111, fr+13118, - fr+13127, fr+13135, fr+13141, fr+13150, fr+13160, fr+13169, - fr+13180, fr+13191, fr+13200, fr+13210, fr+13221, fr+13232, - fr+13241, fr+13249, fr+13258, fr+13268, fr+13277, fr+13285, - fr+13295, fr+13306, fr+13314, fr+13321, fr+13332, fr+13341, - fr+13351, fr+13362, fr+13375, fr+13383, fr+13391, fr+13399, - fr+13407, fr+13414, fr+13423, fr+13432, fr+13439, fr+13448, - fr+13456, fr+13463, fr+13470, fr+13478, fr+13487, fr+13496, - fr+13504, fr+13511, fr+13519, fr+13528, fr+13536, fr+13544, - fr+13551, fr+13561, fr+13572, fr+13583, fr+13591, fr+13598, - fr+13609, fr+13620, fr+13628, fr+13639, fr+13648, fr+13657, - fr+13667, fr+13677, fr+13686, fr+13694, fr+13704, fr+13715, - fr+13724, fr+13731, fr+13737, fr+13744, fr+13752, fr+13759, - fr+13768, fr+13776, fr+13783, fr+13790, fr+13796, fr+13806, - fr+13814, fr+13822, fr+13829, fr+13835, fr+13842, fr+13849, - fr+13856, fr+13864, fr+13870, fr+13877, fr+13883, fr+13891, - fr+13899, fr+13907, fr+13915, fr+13921, fr+13927, fr+13933, - fr+13940, fr+13948, fr+13955, fr+13964, fr+13970, fr+13979, - fr+13986, fr+13993, fr+14001, fr+14007, fr+14015, fr+14022, - fr+14030, fr+14037, fr+14044, fr+14051, fr+14057, fr+14064, - fr+14071, fr+14080, fr+14089, fr+14098, fr+14106, fr+14114, - fr+14123, fr+14130, fr+14137, fr+14145, fr+14152, fr+14161, - fr+14169, fr+14178, fr+14191, fr+14202, fr+14210, fr+14219, - fr+14227, fr+14235, fr+14241, fr+14249, fr+14258, fr+14267, - fr+14277, fr+14286, fr+14294, fr+14307, fr+14317, fr+14327, - fr+14336, fr+14345, fr+14356, fr+14364, fr+14372, fr+14380, - fr+14390, fr+14401, fr+14410, fr+14419, fr+14429, fr+14440, - fr+14447, fr+14455, fr+14465, fr+14473, fr+14481, fr+14489, - fr+14498, fr+14506, fr+14514, fr+14523, fr+14533, fr+14542, - fr+14551, fr+14559, fr+14565, fr+14572, fr+14580, fr+14589, - fr+14596, fr+14606, fr+14615, fr+14622, fr+14628, fr+14637, - fr+14644, fr+14650, fr+14657, fr+14663, fr+14670, fr+14679, - fr+14686, fr+14693, fr+14702, fr+14710, fr+14717, fr+14725, - fr+14734, fr+14740, fr+14748, fr+14757, fr+14764, fr+14772, - fr+14779, fr+14785, fr+14793, fr+14802, fr+14810, fr+14818, - fr+14827, fr+14835, fr+14842, fr+14851, fr+14860, fr+14869, - fr+14877, fr+14887, fr+14896, fr+14903, fr+14910, fr+14918, - fr+14926, fr+14935, fr+14944, fr+14951, fr+14960, fr+14968, - fr+14977, fr+14985, fr+14994, fr+15001, fr+15010, fr+15019, - fr+15025, fr+15033, fr+15044, fr+15052, fr+15060, fr+15068, - fr+15077, fr+15085, fr+15094, fr+15103, fr+15112, fr+15120, - fr+15127, fr+15135, fr+15143, fr+15151, fr+15162, fr+15170, - fr+15178, fr+15188, fr+15194, fr+15202, fr+15210, fr+15218, - fr+15225, fr+15234, fr+15243, fr+15251, fr+15259, fr+15268, - fr+15274, fr+15283, fr+15290, fr+15296, fr+15304, fr+15310, - fr+15317, fr+15326, fr+15332, fr+15340, fr+15346, fr+15355, - fr+15364, fr+15373, fr+15380, fr+15387, fr+15393, fr+15401, - fr+15410, fr+15416, fr+15425, fr+15434, fr+15440, fr+15448, - fr+15458, fr+15469, fr+15476, fr+15482, fr+15490, fr+15497, - fr+15506, fr+15513, fr+15519, fr+15526, fr+15532, fr+15540, - fr+15549, fr+15560, fr+15567, fr+15575, fr+15583, fr+15592, - fr+15599, fr+15606, fr+15614, fr+15623, fr+15631, fr+15637, - fr+15644, fr+15650, fr+15658, fr+15667, fr+15675, fr+15682, - fr+15691, fr+15698, fr+15707, fr+15714, fr+15720, fr+15729, - fr+15737, fr+15746, fr+15754, fr+15763, fr+15770, fr+15777, - fr+15786, fr+15795, fr+15804, fr+15813, fr+15821, fr+15830, - fr+15838, fr+15847, fr+15853, fr+15862, fr+15871, fr+15877, - fr+15884, fr+15892, fr+15899, fr+15907, fr+15914, fr+15922, - fr+15928, fr+15935, fr+15942, fr+15950, fr+15956, fr+15965, - fr+15972, fr+15981, fr+15989, fr+15997, fr+16003, fr+16010, - fr+16019, fr+16027, fr+16035, fr+16042, fr+16051, fr+16057, - fr+16063, fr+16069, fr+16075, fr+16081, fr+16088, fr+16096, - fr+16103, fr+16112, fr+16118, fr+16127, fr+16135, fr+16144, - fr+16152, fr+16159, fr+16166, fr+16172, fr+16180, fr+16188, - fr+16195, fr+16202, fr+16209, fr+16216, fr+16222, fr+16230, - fr+16238, fr+16250, fr+16261, fr+16269, fr+16278, fr+16287, - fr+16299, fr+16306, fr+16315, fr+16324, fr+16332, fr+16340, - fr+16347, fr+16354, fr+16361, fr+16367, fr+16374, fr+16386, - fr+16396, fr+16403, fr+16409, fr+16416, fr+16423, fr+16432, - fr+16440, fr+16448, fr+16457, fr+16465, fr+16472, fr+16480, - fr+16489, fr+16496, fr+16505, fr+16514, fr+16523, fr+16529, - fr+16536, fr+16543, fr+16550, fr+16559, fr+16566, fr+16572, - fr+16580, fr+16589, fr+16597, fr+16604, fr+16613, fr+16622, - fr+16629, fr+16635, fr+16642, fr+16650, fr+16659, fr+16666, - fr+16675, fr+16682, fr+16689, fr+16696, fr+16702, fr+16710, - fr+16717, fr+16725, fr+16731, fr+16739, fr+16745, fr+16753, - fr+16762, fr+16768, fr+16777, - }; -#undef fr - -static const struct words fr_words = { - 2048, - 11, - false, - (const char *)fr_, - 0, /* Constant string */ - fr_i -}; diff --git a/external/libwally-core/src/data/wordlists/french.txt b/external/libwally-core/src/data/wordlists/french.txt deleted file mode 100644 index 1d749904f..000000000 --- a/external/libwally-core/src/data/wordlists/french.txt +++ /dev/null @@ -1,2048 +0,0 @@ -abaisser -abandon -abdiquer -abeille -abolir -aborder -aboutir -aboyer -abrasif -abreuver -abriter -abroger -abrupt -absence -absolu -absurde -abusif -abyssal -académie -acajou -acarien -accabler -accepter -acclamer -accolade -accroche -accuser -acerbe -achat -acheter -aciduler -acier -acompte -acquérir -acronyme -acteur -actif -actuel -adepte -adéquat -adhésif -adjectif -adjuger -admettre -admirer -adopter -adorer -adoucir -adresse -adroit -adulte -adverbe -aérer -aéronef -affaire -affecter -affiche -affreux -affubler -agacer -agencer -agile -agiter -agrafer -agréable -agrume -aider -aiguille -ailier -aimable -aisance -ajouter -ajuster -alarmer -alchimie -alerte -algèbre -algue -aliéner -aliment -alléger -alliage -allouer -allumer -alourdir -alpaga -altesse -alvéole -amateur -ambigu -ambre -aménager -amertume -amidon -amiral -amorcer -amour -amovible -amphibie -ampleur -amusant -analyse -anaphore -anarchie -anatomie -ancien -anéantir -angle -angoisse -anguleux -animal -annexer -annonce -annuel -anodin -anomalie -anonyme -anormal -antenne -antidote -anxieux -apaiser -apéritif -aplanir -apologie -appareil -appeler -apporter -appuyer -aquarium -aqueduc -arbitre -arbuste -ardeur -ardoise -argent -arlequin -armature -armement -armoire -armure -arpenter -arracher -arriver -arroser -arsenic -artériel -article -aspect -asphalte -aspirer -assaut -asservir -assiette -associer -assurer -asticot -astre -astuce -atelier -atome -atrium -atroce -attaque -attentif -attirer -attraper -aubaine -auberge -audace -audible -augurer -aurore -automne -autruche -avaler -avancer -avarice -avenir -averse -aveugle -aviateur -avide -avion -aviser -avoine -avouer -avril -axial -axiome -badge -bafouer -bagage -baguette -baignade -balancer -balcon -baleine -balisage -bambin -bancaire -bandage -banlieue -bannière -banquier -barbier -baril -baron -barque -barrage -bassin -bastion -bataille -bateau -batterie -baudrier -bavarder -belette -bélier -belote -bénéfice -berceau -berger -berline -bermuda -besace -besogne -bétail -beurre -biberon -bicycle -bidule -bijou -bilan -bilingue -billard -binaire -biologie -biopsie -biotype -biscuit -bison -bistouri -bitume -bizarre -blafard -blague -blanchir -blessant -blinder -blond -bloquer -blouson -bobard -bobine -boire -boiser -bolide -bonbon -bondir -bonheur -bonifier -bonus -bordure -borne -botte -boucle -boueux -bougie -boulon -bouquin -bourse -boussole -boutique -boxeur -branche -brasier -brave -brebis -brèche -breuvage -bricoler -brigade -brillant -brioche -brique -brochure -broder -bronzer -brousse -broyeur -brume -brusque -brutal -bruyant -buffle -buisson -bulletin -bureau -burin -bustier -butiner -butoir -buvable -buvette -cabanon -cabine -cachette -cadeau -cadre -caféine -caillou -caisson -calculer -calepin -calibre -calmer -calomnie -calvaire -camarade -caméra -camion -campagne -canal -caneton -canon -cantine -canular -capable -caporal -caprice -capsule -capter -capuche -carabine -carbone -caresser -caribou -carnage -carotte -carreau -carton -cascade -casier -casque -cassure -causer -caution -cavalier -caverne -caviar -cédille -ceinture -céleste -cellule -cendrier -censurer -central -cercle -cérébral -cerise -cerner -cerveau -cesser -chagrin -chaise -chaleur -chambre -chance -chapitre -charbon -chasseur -chaton -chausson -chavirer -chemise -chenille -chéquier -chercher -cheval -chien -chiffre -chignon -chimère -chiot -chlorure -chocolat -choisir -chose -chouette -chrome -chute -cigare -cigogne -cimenter -cinéma -cintrer -circuler -cirer -cirque -citerne -citoyen -citron -civil -clairon -clameur -claquer -classe -clavier -client -cligner -climat -clivage -cloche -clonage -cloporte -cobalt -cobra -cocasse -cocotier -coder -codifier -coffre -cogner -cohésion -coiffer -coincer -colère -colibri -colline -colmater -colonel -combat -comédie -commande -compact -concert -conduire -confier -congeler -connoter -consonne -contact -convexe -copain -copie -corail -corbeau -cordage -corniche -corpus -correct -cortège -cosmique -costume -coton -coude -coupure -courage -couteau -couvrir -coyote -crabe -crainte -cravate -crayon -créature -créditer -crémeux -creuser -crevette -cribler -crier -cristal -critère -croire -croquer -crotale -crucial -cruel -crypter -cubique -cueillir -cuillère -cuisine -cuivre -culminer -cultiver -cumuler -cupide -curatif -curseur -cyanure -cycle -cylindre -cynique -daigner -damier -danger -danseur -dauphin -débattre -débiter -déborder -débrider -débutant -décaler -décembre -déchirer -décider -déclarer -décorer -décrire -décupler -dédale -déductif -déesse -défensif -défiler -défrayer -dégager -dégivrer -déglutir -dégrafer -déjeuner -délice -déloger -demander -demeurer -démolir -dénicher -dénouer -dentelle -dénuder -départ -dépenser -déphaser -déplacer -déposer -déranger -dérober -désastre -descente -désert -désigner -désobéir -dessiner -destrier -détacher -détester -détourer -détresse -devancer -devenir -deviner -devoir -diable -dialogue -diamant -dicter -différer -digérer -digital -digne -diluer -dimanche -diminuer -dioxyde -directif -diriger -discuter -disposer -dissiper -distance -divertir -diviser -docile -docteur -dogme -doigt -domaine -domicile -dompter -donateur -donjon -donner -dopamine -dortoir -dorure -dosage -doseur -dossier -dotation -douanier -double -douceur -douter -doyen -dragon -draper -dresser -dribbler -droiture -duperie -duplexe -durable -durcir -dynastie -éblouir -écarter -écharpe -échelle -éclairer -éclipse -éclore -écluse -école -économie -écorce -écouter -écraser -écrémer -écrivain -écrou -écume -écureuil -édifier -éduquer -effacer -effectif -effigie -effort -effrayer -effusion -égaliser -égarer -éjecter -élaborer -élargir -électron -élégant -éléphant -élève -éligible -élitisme -éloge -élucider -éluder -emballer -embellir -embryon -émeraude -émission -emmener -émotion -émouvoir -empereur -employer -emporter -emprise -émulsion -encadrer -enchère -enclave -encoche -endiguer -endosser -endroit -enduire -énergie -enfance -enfermer -enfouir -engager -engin -englober -énigme -enjamber -enjeu -enlever -ennemi -ennuyeux -enrichir -enrobage -enseigne -entasser -entendre -entier -entourer -entraver -énumérer -envahir -enviable -envoyer -enzyme -éolien -épaissir -épargne -épatant -épaule -épicerie -épidémie -épier -épilogue -épine -épisode -épitaphe -époque -épreuve -éprouver -épuisant -équerre -équipe -ériger -érosion -erreur -éruption -escalier -espadon -espèce -espiègle -espoir -esprit -esquiver -essayer -essence -essieu -essorer -estime -estomac -estrade -étagère -étaler -étanche -étatique -éteindre -étendoir -éternel -éthanol -éthique -ethnie -étirer -étoffer -étoile -étonnant -étourdir -étrange -étroit -étude -euphorie -évaluer -évasion -éventail -évidence -éviter -évolutif -évoquer -exact -exagérer -exaucer -exceller -excitant -exclusif -excuse -exécuter -exemple -exercer -exhaler -exhorter -exigence -exiler -exister -exotique -expédier -explorer -exposer -exprimer -exquis -extensif -extraire -exulter -fable -fabuleux -facette -facile -facture -faiblir -falaise -fameux -famille -farceur -farfelu -farine -farouche -fasciner -fatal -fatigue -faucon -fautif -faveur -favori -fébrile -féconder -fédérer -félin -femme -fémur -fendoir -féodal -fermer -féroce -ferveur -festival -feuille -feutre -février -fiasco -ficeler -fictif -fidèle -figure -filature -filetage -filière -filleul -filmer -filou -filtrer -financer -finir -fiole -firme -fissure -fixer -flairer -flamme -flasque -flatteur -fléau -flèche -fleur -flexion -flocon -flore -fluctuer -fluide -fluvial -folie -fonderie -fongible -fontaine -forcer -forgeron -formuler -fortune -fossile -foudre -fougère -fouiller -foulure -fourmi -fragile -fraise -franchir -frapper -frayeur -frégate -freiner -frelon -frémir -frénésie -frère -friable -friction -frisson -frivole -froid -fromage -frontal -frotter -fruit -fugitif -fuite -fureur -furieux -furtif -fusion -futur -gagner -galaxie -galerie -gambader -garantir -gardien -garnir -garrigue -gazelle -gazon -géant -gélatine -gélule -gendarme -général -génie -genou -gentil -géologie -géomètre -géranium -germe -gestuel -geyser -gibier -gicler -girafe -givre -glace -glaive -glisser -globe -gloire -glorieux -golfeur -gomme -gonfler -gorge -gorille -goudron -gouffre -goulot -goupille -gourmand -goutte -graduel -graffiti -graine -grand -grappin -gratuit -gravir -grenat -griffure -griller -grimper -grogner -gronder -grotte -groupe -gruger -grutier -gruyère -guépard -guerrier -guide -guimauve -guitare -gustatif -gymnaste -gyrostat -habitude -hachoir -halte -hameau -hangar -hanneton -haricot -harmonie -harpon -hasard -hélium -hématome -herbe -hérisson -hermine -héron -hésiter -heureux -hiberner -hibou -hilarant -histoire -hiver -homard -hommage -homogène -honneur -honorer -honteux -horde -horizon -horloge -hormone -horrible -houleux -housse -hublot -huileux -humain -humble -humide -humour -hurler -hydromel -hygiène -hymne -hypnose -idylle -ignorer -iguane -illicite -illusion -image -imbiber -imiter -immense -immobile -immuable -impact -impérial -implorer -imposer -imprimer -imputer -incarner -incendie -incident -incliner -incolore -indexer -indice -inductif -inédit -ineptie -inexact -infini -infliger -informer -infusion -ingérer -inhaler -inhiber -injecter -injure -innocent -inoculer -inonder -inscrire -insecte -insigne -insolite -inspirer -instinct -insulter -intact -intense -intime -intrigue -intuitif -inutile -invasion -inventer -inviter -invoquer -ironique -irradier -irréel -irriter -isoler -ivoire -ivresse -jaguar -jaillir -jambe -janvier -jardin -jauger -jaune -javelot -jetable -jeton -jeudi -jeunesse -joindre -joncher -jongler -joueur -jouissif -journal -jovial -joyau -joyeux -jubiler -jugement -junior -jupon -juriste -justice -juteux -juvénile -kayak -kimono -kiosque -label -labial -labourer -lacérer -lactose -lagune -laine -laisser -laitier -lambeau -lamelle -lampe -lanceur -langage -lanterne -lapin -largeur -larme -laurier -lavabo -lavoir -lecture -légal -léger -légume -lessive -lettre -levier -lexique -lézard -liasse -libérer -libre -licence -licorne -liège -lièvre -ligature -ligoter -ligue -limer -limite -limonade -limpide -linéaire -lingot -lionceau -liquide -lisière -lister -lithium -litige -littoral -livreur -logique -lointain -loisir -lombric -loterie -louer -lourd -loutre -louve -loyal -lubie -lucide -lucratif -lueur -lugubre -luisant -lumière -lunaire -lundi -luron -lutter -luxueux -machine -magasin -magenta -magique -maigre -maillon -maintien -mairie -maison -majorer -malaxer -maléfice -malheur -malice -mallette -mammouth -mandater -maniable -manquant -manteau -manuel -marathon -marbre -marchand -mardi -maritime -marqueur -marron -marteler -mascotte -massif -matériel -matière -matraque -maudire -maussade -mauve -maximal -méchant -méconnu -médaille -médecin -méditer -méduse -meilleur -mélange -mélodie -membre -mémoire -menacer -mener -menhir -mensonge -mentor -mercredi -mérite -merle -messager -mesure -métal -météore -méthode -métier -meuble -miauler -microbe -miette -mignon -migrer -milieu -million -mimique -mince -minéral -minimal -minorer -minute -miracle -miroiter -missile -mixte -mobile -moderne -moelleux -mondial -moniteur -monnaie -monotone -monstre -montagne -monument -moqueur -morceau -morsure -mortier -moteur -motif -mouche -moufle -moulin -mousson -mouton -mouvant -multiple -munition -muraille -murène -murmure -muscle -muséum -musicien -mutation -muter -mutuel -myriade -myrtille -mystère -mythique -nageur -nappe -narquois -narrer -natation -nation -nature -naufrage -nautique -navire -nébuleux -nectar -néfaste -négation -négliger -négocier -neige -nerveux -nettoyer -neurone -neutron -neveu -niche -nickel -nitrate -niveau -noble -nocif -nocturne -noirceur -noisette -nomade -nombreux -nommer -normatif -notable -notifier -notoire -nourrir -nouveau -novateur -novembre -novice -nuage -nuancer -nuire -nuisible -numéro -nuptial -nuque -nutritif -obéir -objectif -obliger -obscur -observer -obstacle -obtenir -obturer -occasion -occuper -océan -octobre -octroyer -octupler -oculaire -odeur -odorant -offenser -officier -offrir -ogive -oiseau -oisillon -olfactif -olivier -ombrage -omettre -onctueux -onduler -onéreux -onirique -opale -opaque -opérer -opinion -opportun -opprimer -opter -optique -orageux -orange -orbite -ordonner -oreille -organe -orgueil -orifice -ornement -orque -ortie -osciller -osmose -ossature -otarie -ouragan -ourson -outil -outrager -ouvrage -ovation -oxyde -oxygène -ozone -paisible -palace -palmarès -palourde -palper -panache -panda -pangolin -paniquer -panneau -panorama -pantalon -papaye -papier -papoter -papyrus -paradoxe -parcelle -paresse -parfumer -parler -parole -parrain -parsemer -partager -parure -parvenir -passion -pastèque -paternel -patience -patron -pavillon -pavoiser -payer -paysage -peigne -peintre -pelage -pélican -pelle -pelouse -peluche -pendule -pénétrer -pénible -pensif -pénurie -pépite -péplum -perdrix -perforer -période -permuter -perplexe -persil -perte -peser -pétale -petit -pétrir -peuple -pharaon -phobie -phoque -photon -phrase -physique -piano -pictural -pièce -pierre -pieuvre -pilote -pinceau -pipette -piquer -pirogue -piscine -piston -pivoter -pixel -pizza -placard -plafond -plaisir -planer -plaque -plastron -plateau -pleurer -plexus -pliage -plomb -plonger -pluie -plumage -pochette -poésie -poète -pointe -poirier -poisson -poivre -polaire -policier -pollen -polygone -pommade -pompier -ponctuel -pondérer -poney -portique -position -posséder -posture -potager -poteau -potion -pouce -poulain -poumon -pourpre -poussin -pouvoir -prairie -pratique -précieux -prédire -préfixe -prélude -prénom -présence -prétexte -prévoir -primitif -prince -prison -priver -problème -procéder -prodige -profond -progrès -proie -projeter -prologue -promener -propre -prospère -protéger -prouesse -proverbe -prudence -pruneau -psychose -public -puceron -puiser -pulpe -pulsar -punaise -punitif -pupitre -purifier -puzzle -pyramide -quasar -querelle -question -quiétude -quitter -quotient -racine -raconter -radieux -ragondin -raideur -raisin -ralentir -rallonge -ramasser -rapide -rasage -ratisser -ravager -ravin -rayonner -réactif -réagir -réaliser -réanimer -recevoir -réciter -réclamer -récolter -recruter -reculer -recycler -rédiger -redouter -refaire -réflexe -réformer -refrain -refuge -régalien -région -réglage -régulier -réitérer -rejeter -rejouer -relatif -relever -relief -remarque -remède -remise -remonter -remplir -remuer -renard -renfort -renifler -renoncer -rentrer -renvoi -replier -reporter -reprise -reptile -requin -réserve -résineux -résoudre -respect -rester -résultat -rétablir -retenir -réticule -retomber -retracer -réunion -réussir -revanche -revivre -révolte -révulsif -richesse -rideau -rieur -rigide -rigoler -rincer -riposter -risible -risque -rituel -rival -rivière -rocheux -romance -rompre -ronce -rondin -roseau -rosier -rotatif -rotor -rotule -rouge -rouille -rouleau -routine -royaume -ruban -rubis -ruche -ruelle -rugueux -ruiner -ruisseau -ruser -rustique -rythme -sabler -saboter -sabre -sacoche -safari -sagesse -saisir -salade -salive -salon -saluer -samedi -sanction -sanglier -sarcasme -sardine -saturer -saugrenu -saumon -sauter -sauvage -savant -savonner -scalpel -scandale -scélérat -scénario -sceptre -schéma -science -scinder -score -scrutin -sculpter -séance -sécable -sécher -secouer -sécréter -sédatif -séduire -seigneur -séjour -sélectif -semaine -sembler -semence -séminal -sénateur -sensible -sentence -séparer -séquence -serein -sergent -sérieux -serrure -sérum -service -sésame -sévir -sevrage -sextuple -sidéral -siècle -siéger -siffler -sigle -signal -silence -silicium -simple -sincère -sinistre -siphon -sirop -sismique -situer -skier -social -socle -sodium -soigneux -soldat -soleil -solitude -soluble -sombre -sommeil -somnoler -sonde -songeur -sonnette -sonore -sorcier -sortir -sosie -sottise -soucieux -soudure -souffle -soulever -soupape -source -soutirer -souvenir -spacieux -spatial -spécial -sphère -spiral -stable -station -sternum -stimulus -stipuler -strict -studieux -stupeur -styliste -sublime -substrat -subtil -subvenir -succès -sucre -suffixe -suggérer -suiveur -sulfate -superbe -supplier -surface -suricate -surmener -surprise -sursaut -survie -suspect -syllabe -symbole -symétrie -synapse -syntaxe -système -tabac -tablier -tactile -tailler -talent -talisman -talonner -tambour -tamiser -tangible -tapis -taquiner -tarder -tarif -tartine -tasse -tatami -tatouage -taupe -taureau -taxer -témoin -temporel -tenaille -tendre -teneur -tenir -tension -terminer -terne -terrible -tétine -texte -thème -théorie -thérapie -thorax -tibia -tiède -timide -tirelire -tiroir -tissu -titane -titre -tituber -toboggan -tolérant -tomate -tonique -tonneau -toponyme -torche -tordre -tornade -torpille -torrent -torse -tortue -totem -toucher -tournage -tousser -toxine -traction -trafic -tragique -trahir -train -trancher -travail -trèfle -tremper -trésor -treuil -triage -tribunal -tricoter -trilogie -triomphe -tripler -triturer -trivial -trombone -tronc -tropical -troupeau -tuile -tulipe -tumulte -tunnel -turbine -tuteur -tutoyer -tuyau -tympan -typhon -typique -tyran -ubuesque -ultime -ultrason -unanime -unifier -union -unique -unitaire -univers -uranium -urbain -urticant -usage -usine -usuel -usure -utile -utopie -vacarme -vaccin -vagabond -vague -vaillant -vaincre -vaisseau -valable -valise -vallon -valve -vampire -vanille -vapeur -varier -vaseux -vassal -vaste -vecteur -vedette -végétal -véhicule -veinard -véloce -vendredi -vénérer -venger -venimeux -ventouse -verdure -vérin -vernir -verrou -verser -vertu -veston -vétéran -vétuste -vexant -vexer -viaduc -viande -victoire -vidange -vidéo -vignette -vigueur -vilain -village -vinaigre -violon -vipère -virement -virtuose -virus -visage -viseur -vision -visqueux -visuel -vital -vitesse -viticole -vitrine -vivace -vivipare -vocation -voguer -voile -voisin -voiture -volaille -volcan -voltiger -volume -vorace -vortex -voter -vouloir -voyage -voyelle -wagon -xénon -yacht -zèbre -zénith -zeste -zoologie diff --git a/external/libwally-core/src/data/wordlists/italian.c b/external/libwally-core/src/data/wordlists/italian.c deleted file mode 100644 index ff6216066..000000000 --- a/external/libwally-core/src/data/wordlists/italian.c +++ /dev/null @@ -1,2408 +0,0 @@ -/* Generated file - do not edit! */ -#include - -static const unsigned char it_[] = { - 0x61,0x62,0x61,0x63,0x6f,0, - 0x61,0x62,0x62,0x61,0x67,0x6c,0x69,0x6f,0, - 0x61,0x62,0x62,0x69,0x6e,0x61,0x74,0x6f,0, - 0x61,0x62,0x65,0x74,0x65,0, - 0x61,0x62,0x69,0x73,0x73,0x6f,0, - 0x61,0x62,0x6f,0x6c,0x69,0x72,0x65,0, - 0x61,0x62,0x72,0x61,0x73,0x69,0x76,0x6f,0, - 0x61,0x62,0x72,0x6f,0x67,0x61,0x74,0x6f,0, - 0x61,0x63,0x63,0x61,0x64,0x65,0x72,0x65,0, - 0x61,0x63,0x63,0x65,0x6e,0x6e,0x6f,0, - 0x61,0x63,0x63,0x75,0x73,0x61,0x74,0x6f,0, - 0x61,0x63,0x65,0x74,0x6f,0x6e,0x65,0, - 0x61,0x63,0x68,0x69,0x6c,0x6c,0x65,0, - 0x61,0x63,0x69,0x64,0x6f,0, - 0x61,0x63,0x71,0x75,0x61,0, - 0x61,0x63,0x72,0x65,0, - 0x61,0x63,0x72,0x69,0x6c,0x69,0x63,0x6f,0, - 0x61,0x63,0x72,0x6f,0x62,0x61,0x74,0x61,0, - 0x61,0x63,0x75,0x74,0x6f,0, - 0x61,0x64,0x61,0x67,0x69,0x6f,0, - 0x61,0x64,0x64,0x65,0x62,0x69,0x74,0x6f,0, - 0x61,0x64,0x64,0x6f,0x6d,0x65,0, - 0x61,0x64,0x65,0x67,0x75,0x61,0x74,0x6f,0, - 0x61,0x64,0x65,0x72,0x69,0x72,0x65,0, - 0x61,0x64,0x69,0x70,0x65,0, - 0x61,0x64,0x6f,0x74,0x74,0x61,0x72,0x65,0, - 0x61,0x64,0x75,0x6c,0x61,0x72,0x65,0, - 0x61,0x66,0x66,0x61,0x62,0x69,0x6c,0x65,0, - 0x61,0x66,0x66,0x65,0x74,0x74,0x6f,0, - 0x61,0x66,0x66,0x69,0x73,0x73,0x6f,0, - 0x61,0x66,0x66,0x72,0x61,0x6e,0x74,0x6f,0, - 0x61,0x66,0x6f,0x72,0x69,0x73,0x6d,0x61,0, - 0x61,0x66,0x6f,0x73,0x6f,0, - 0x61,0x66,0x72,0x69,0x63,0x61,0x6e,0x6f,0, - 0x61,0x67,0x61,0x76,0x65,0, - 0x61,0x67,0x65,0x6e,0x74,0x65,0, - 0x61,0x67,0x65,0x76,0x6f,0x6c,0x65,0, - 0x61,0x67,0x67,0x61,0x6e,0x63,0x69,0x6f,0, - 0x61,0x67,0x69,0x72,0x65,0, - 0x61,0x67,0x69,0x74,0x61,0x72,0x65,0, - 0x61,0x67,0x6f,0x6e,0x69,0x73,0x6d,0x6f,0, - 0x61,0x67,0x72,0x69,0x63,0x6f,0x6c,0x6f,0, - 0x61,0x67,0x72,0x75,0x6d,0x65,0x74,0x6f,0, - 0x61,0x67,0x75,0x7a,0x7a,0x6f,0, - 0x61,0x6c,0x61,0x62,0x61,0x72,0x64,0x61,0, - 0x61,0x6c,0x61,0x74,0x6f,0, - 0x61,0x6c,0x62,0x61,0x74,0x72,0x6f,0, - 0x61,0x6c,0x62,0x65,0x72,0x61,0x74,0x6f,0, - 0x61,0x6c,0x62,0x6f,0, - 0x61,0x6c,0x62,0x75,0x6d,0x65,0, - 0x61,0x6c,0x63,0x65,0, - 0x61,0x6c,0x63,0x6f,0x6c,0x69,0x63,0x6f,0, - 0x61,0x6c,0x65,0x74,0x74,0x6f,0x6e,0x65,0, - 0x61,0x6c,0x66,0x61,0, - 0x61,0x6c,0x67,0x65,0x62,0x72,0x61,0, - 0x61,0x6c,0x69,0x61,0x6e,0x74,0x65,0, - 0x61,0x6c,0x69,0x62,0x69,0, - 0x61,0x6c,0x69,0x6d,0x65,0x6e,0x74,0x6f,0, - 0x61,0x6c,0x6c,0x61,0x67,0x61,0x74,0x6f,0, - 0x61,0x6c,0x6c,0x65,0x67,0x72,0x6f,0, - 0x61,0x6c,0x6c,0x69,0x65,0x76,0x6f,0, - 0x61,0x6c,0x6c,0x6f,0x64,0x6f,0x6c,0x61,0, - 0x61,0x6c,0x6c,0x75,0x73,0x69,0x76,0x6f,0, - 0x61,0x6c,0x6d,0x65,0x6e,0x6f,0, - 0x61,0x6c,0x6f,0x67,0x65,0x6e,0x6f,0, - 0x61,0x6c,0x70,0x61,0x63,0x61,0, - 0x61,0x6c,0x70,0x65,0x73,0x74,0x72,0x65,0, - 0x61,0x6c,0x74,0x61,0x6c,0x65,0x6e,0x61,0, - 0x61,0x6c,0x74,0x65,0x72,0x6e,0x6f,0, - 0x61,0x6c,0x74,0x69,0x63,0x63,0x69,0x6f,0, - 0x61,0x6c,0x74,0x72,0x6f,0x76,0x65,0, - 0x61,0x6c,0x75,0x6e,0x6e,0x6f,0, - 0x61,0x6c,0x76,0x65,0x6f,0x6c,0x6f,0, - 0x61,0x6c,0x7a,0x61,0x72,0x65,0, - 0x61,0x6d,0x61,0x6c,0x67,0x61,0x6d,0x61,0, - 0x61,0x6d,0x61,0x6e,0x69,0x74,0x61,0, - 0x61,0x6d,0x61,0x72,0x65,0x6e,0x61,0, - 0x61,0x6d,0x62,0x69,0x74,0x6f,0, - 0x61,0x6d,0x62,0x72,0x61,0x74,0x6f,0, - 0x61,0x6d,0x65,0x62,0x61,0, - 0x61,0x6d,0x65,0x72,0x69,0x63,0x61,0, - 0x61,0x6d,0x65,0x74,0x69,0x73,0x74,0x61,0, - 0x61,0x6d,0x69,0x63,0x6f,0, - 0x61,0x6d,0x6d,0x61,0x73,0x73,0x6f,0, - 0x61,0x6d,0x6d,0x65,0x6e,0x64,0x61,0, - 0x61,0x6d,0x6d,0x69,0x72,0x61,0x72,0x65,0, - 0x61,0x6d,0x6d,0x6f,0x6e,0x69,0x74,0x6f,0, - 0x61,0x6d,0x6f,0x72,0x65,0, - 0x61,0x6d,0x70,0x69,0x6f,0, - 0x61,0x6d,0x70,0x6c,0x69,0x61,0x72,0x65,0, - 0x61,0x6d,0x75,0x6c,0x65,0x74,0x6f,0, - 0x61,0x6e,0x61,0x63,0x61,0x72,0x64,0x6f,0, - 0x61,0x6e,0x61,0x67,0x72,0x61,0x66,0x65,0, - 0x61,0x6e,0x61,0x6c,0x69,0x73,0x74,0x61,0, - 0x61,0x6e,0x61,0x72,0x63,0x68,0x69,0x61,0, - 0x61,0x6e,0x61,0x74,0x72,0x61,0, - 0x61,0x6e,0x63,0x61,0, - 0x61,0x6e,0x63,0x65,0x6c,0x6c,0x61,0, - 0x61,0x6e,0x63,0x6f,0x72,0x61,0, - 0x61,0x6e,0x64,0x61,0x72,0x65,0, - 0x61,0x6e,0x64,0x72,0x65,0x61,0, - 0x61,0x6e,0x65,0x6c,0x6c,0x6f,0, - 0x61,0x6e,0x67,0x65,0x6c,0x6f,0, - 0x61,0x6e,0x67,0x6f,0x6c,0x61,0x72,0x65,0, - 0x61,0x6e,0x67,0x75,0x73,0x74,0x6f,0, - 0x61,0x6e,0x69,0x6d,0x61,0, - 0x61,0x6e,0x6e,0x65,0x67,0x61,0x72,0x65,0, - 0x61,0x6e,0x6e,0x69,0x64,0x61,0x74,0x6f,0, - 0x61,0x6e,0x6e,0x6f,0, - 0x61,0x6e,0x6e,0x75,0x6e,0x63,0x69,0x6f,0, - 0x61,0x6e,0x6f,0x6e,0x69,0x6d,0x6f,0, - 0x61,0x6e,0x74,0x69,0x63,0x69,0x70,0x6f,0, - 0x61,0x6e,0x7a,0x69,0, - 0x61,0x70,0x61,0x74,0x69,0x63,0x6f,0, - 0x61,0x70,0x65,0x72,0x74,0x75,0x72,0x61,0, - 0x61,0x70,0x6f,0x64,0x65,0, - 0x61,0x70,0x70,0x61,0x72,0x69,0x72,0x65,0, - 0x61,0x70,0x70,0x65,0x74,0x69,0x74,0x6f,0, - 0x61,0x70,0x70,0x6f,0x67,0x67,0x69,0x6f,0, - 0x61,0x70,0x70,0x72,0x6f,0x64,0x6f,0, - 0x61,0x70,0x70,0x75,0x6e,0x74,0x6f,0, - 0x61,0x70,0x72,0x69,0x6c,0x65,0, - 0x61,0x72,0x61,0x62,0x69,0x63,0x61,0, - 0x61,0x72,0x61,0x63,0x68,0x69,0x64,0x65,0, - 0x61,0x72,0x61,0x67,0x6f,0x73,0x74,0x61,0, - 0x61,0x72,0x61,0x6c,0x64,0x69,0x63,0x61,0, - 0x61,0x72,0x61,0x6e,0x63,0x69,0x6f,0, - 0x61,0x72,0x61,0x74,0x75,0x72,0x61,0, - 0x61,0x72,0x61,0x7a,0x7a,0x6f,0, - 0x61,0x72,0x62,0x69,0x74,0x72,0x6f,0, - 0x61,0x72,0x63,0x68,0x69,0x76,0x69,0x6f,0, - 0x61,0x72,0x64,0x69,0x74,0x6f,0, - 0x61,0x72,0x65,0x6e,0x69,0x6c,0x65,0, - 0x61,0x72,0x67,0x65,0x6e,0x74,0x6f,0, - 0x61,0x72,0x67,0x69,0x6e,0x65,0, - 0x61,0x72,0x67,0x75,0x74,0x6f,0, - 0x61,0x72,0x69,0x61,0, - 0x61,0x72,0x6d,0x6f,0x6e,0x69,0x61,0, - 0x61,0x72,0x6e,0x65,0x73,0x65,0, - 0x61,0x72,0x72,0x65,0x64,0x61,0x74,0x6f,0, - 0x61,0x72,0x72,0x69,0x6e,0x67,0x61,0, - 0x61,0x72,0x72,0x6f,0x73,0x74,0x6f,0, - 0x61,0x72,0x73,0x65,0x6e,0x69,0x63,0x6f,0, - 0x61,0x72,0x73,0x6f,0, - 0x61,0x72,0x74,0x65,0x66,0x69,0x63,0x65,0, - 0x61,0x72,0x7a,0x69,0x6c,0x6c,0x6f,0, - 0x61,0x73,0x63,0x69,0x75,0x74,0x74,0x6f,0, - 0x61,0x73,0x63,0x6f,0x6c,0x74,0x6f,0, - 0x61,0x73,0x65,0x70,0x73,0x69,0, - 0x61,0x73,0x65,0x74,0x74,0x69,0x63,0x6f,0, - 0x61,0x73,0x66,0x61,0x6c,0x74,0x6f,0, - 0x61,0x73,0x69,0x6e,0x6f,0, - 0x61,0x73,0x6f,0x6c,0x61,0, - 0x61,0x73,0x70,0x69,0x72,0x61,0x74,0x6f,0, - 0x61,0x73,0x70,0x72,0x6f,0, - 0x61,0x73,0x73,0x61,0x67,0x67,0x69,0x6f,0, - 0x61,0x73,0x73,0x65,0, - 0x61,0x73,0x73,0x6f,0x6c,0x75,0x74,0x6f,0, - 0x61,0x73,0x73,0x75,0x72,0x64,0x6f,0, - 0x61,0x73,0x74,0x61,0, - 0x61,0x73,0x74,0x65,0x6e,0x75,0x74,0x6f,0, - 0x61,0x73,0x74,0x69,0x63,0x65,0, - 0x61,0x73,0x74,0x72,0x61,0x74,0x74,0x6f,0, - 0x61,0x74,0x61,0x76,0x69,0x63,0x6f,0, - 0x61,0x74,0x65,0x69,0x73,0x6d,0x6f,0, - 0x61,0x74,0x6f,0x6d,0x69,0x63,0x6f,0, - 0x61,0x74,0x6f,0x6e,0x6f,0, - 0x61,0x74,0x74,0x65,0x73,0x61,0, - 0x61,0x74,0x74,0x69,0x76,0x61,0x72,0x65,0, - 0x61,0x74,0x74,0x6f,0x72,0x6e,0x6f,0, - 0x61,0x74,0x74,0x72,0x69,0x74,0x6f,0, - 0x61,0x74,0x74,0x75,0x61,0x6c,0x65,0, - 0x61,0x75,0x73,0x69,0x6c,0x69,0x6f,0, - 0x61,0x75,0x73,0x74,0x72,0x69,0x61,0, - 0x61,0x75,0x74,0x69,0x73,0x74,0x61,0, - 0x61,0x75,0x74,0x6f,0x6e,0x6f,0x6d,0x6f,0, - 0x61,0x75,0x74,0x75,0x6e,0x6e,0x6f,0, - 0x61,0x76,0x61,0x6e,0x7a,0x61,0x74,0x6f,0, - 0x61,0x76,0x65,0x72,0x65,0, - 0x61,0x76,0x76,0x65,0x6e,0x69,0x72,0x65,0, - 0x61,0x76,0x76,0x69,0x73,0x6f,0, - 0x61,0x76,0x76,0x6f,0x6c,0x67,0x65,0x72,0x65,0, - 0x61,0x7a,0x69,0x6f,0x6e,0x65,0, - 0x61,0x7a,0x6f,0x74,0x6f,0, - 0x61,0x7a,0x7a,0x69,0x6d,0x6f,0, - 0x61,0x7a,0x7a,0x75,0x72,0x72,0x6f,0, - 0x62,0x61,0x62,0x65,0x6c,0x65,0, - 0x62,0x61,0x63,0x63,0x61,0x6e,0x6f,0, - 0x62,0x61,0x63,0x69,0x6e,0x6f,0, - 0x62,0x61,0x63,0x6f,0, - 0x62,0x61,0x64,0x65,0x73,0x73,0x61,0, - 0x62,0x61,0x64,0x69,0x6c,0x61,0x74,0x61,0, - 0x62,0x61,0x67,0x6e,0x61,0x74,0x6f,0, - 0x62,0x61,0x69,0x74,0x61,0, - 0x62,0x61,0x6c,0x63,0x6f,0x6e,0x65,0, - 0x62,0x61,0x6c,0x64,0x6f,0, - 0x62,0x61,0x6c,0x65,0x6e,0x61,0, - 0x62,0x61,0x6c,0x6c,0x61,0x74,0x61,0, - 0x62,0x61,0x6c,0x7a,0x61,0x6e,0x6f,0, - 0x62,0x61,0x6d,0x62,0x69,0x6e,0x6f,0, - 0x62,0x61,0x6e,0x64,0x69,0x72,0x65,0, - 0x62,0x61,0x72,0x61,0x6f,0x6e,0x64,0x61,0, - 0x62,0x61,0x72,0x62,0x61,0x72,0x6f,0, - 0x62,0x61,0x72,0x63,0x61,0, - 0x62,0x61,0x72,0x69,0x74,0x6f,0x6e,0x6f,0, - 0x62,0x61,0x72,0x6c,0x75,0x6d,0x65,0, - 0x62,0x61,0x72,0x6f,0x63,0x63,0x6f,0, - 0x62,0x61,0x73,0x69,0x6c,0x69,0x63,0x6f,0, - 0x62,0x61,0x73,0x73,0x6f,0, - 0x62,0x61,0x74,0x6f,0x73,0x74,0x61,0, - 0x62,0x61,0x74,0x74,0x75,0x74,0x6f,0, - 0x62,0x61,0x75,0x6c,0x65,0, - 0x62,0x61,0x76,0x61,0, - 0x62,0x61,0x76,0x6f,0x73,0x61,0, - 0x62,0x65,0x63,0x63,0x6f,0, - 0x62,0x65,0x66,0x66,0x61,0, - 0x62,0x65,0x6c,0x67,0x69,0x6f,0, - 0x62,0x65,0x6c,0x76,0x61,0, - 0x62,0x65,0x6e,0x64,0x61,0, - 0x62,0x65,0x6e,0x65,0x76,0x6f,0x6c,0x65,0, - 0x62,0x65,0x6e,0x69,0x67,0x6e,0x6f,0, - 0x62,0x65,0x6e,0x7a,0x69,0x6e,0x61,0, - 0x62,0x65,0x72,0x65,0, - 0x62,0x65,0x72,0x6c,0x69,0x6e,0x61,0, - 0x62,0x65,0x74,0x61,0, - 0x62,0x69,0x62,0x69,0x74,0x61,0, - 0x62,0x69,0x63,0x69,0, - 0x62,0x69,0x64,0x6f,0x6e,0x65,0, - 0x62,0x69,0x66,0x69,0x64,0x6f,0, - 0x62,0x69,0x67,0x61,0, - 0x62,0x69,0x6c,0x61,0x6e,0x63,0x69,0x61,0, - 0x62,0x69,0x6d,0x62,0x6f,0, - 0x62,0x69,0x6e,0x6f,0x63,0x6f,0x6c,0x6f,0, - 0x62,0x69,0x6f,0x6c,0x6f,0x67,0x6f,0, - 0x62,0x69,0x70,0x65,0x64,0x65,0, - 0x62,0x69,0x70,0x6f,0x6c,0x61,0x72,0x65,0, - 0x62,0x69,0x72,0x62,0x61,0x6e,0x74,0x65,0, - 0x62,0x69,0x72,0x72,0x61,0, - 0x62,0x69,0x73,0x63,0x6f,0x74,0x74,0x6f,0, - 0x62,0x69,0x73,0x65,0x73,0x74,0x6f,0, - 0x62,0x69,0x73,0x6e,0x6f,0x6e,0x6e,0x6f,0, - 0x62,0x69,0x73,0x6f,0x6e,0x74,0x65,0, - 0x62,0x69,0x73,0x74,0x75,0x72,0x69,0, - 0x62,0x69,0x7a,0x7a,0x61,0x72,0x72,0x6f,0, - 0x62,0x6c,0x61,0x6e,0x64,0x6f,0, - 0x62,0x6c,0x61,0x74,0x74,0x61,0, - 0x62,0x6f,0x6c,0x6c,0x69,0x74,0x6f,0, - 0x62,0x6f,0x6e,0x69,0x66,0x69,0x63,0x6f,0, - 0x62,0x6f,0x72,0x64,0x6f,0, - 0x62,0x6f,0x73,0x63,0x6f,0, - 0x62,0x6f,0x74,0x61,0x6e,0x69,0x63,0x6f,0, - 0x62,0x6f,0x74,0x74,0x69,0x6e,0x6f,0, - 0x62,0x6f,0x7a,0x7a,0x6f,0x6c,0x6f,0, - 0x62,0x72,0x61,0x63,0x63,0x69,0x6f,0, - 0x62,0x72,0x61,0x64,0x69,0x70,0x6f,0, - 0x62,0x72,0x61,0x6d,0x61,0, - 0x62,0x72,0x61,0x6e,0x63,0x61,0, - 0x62,0x72,0x61,0x76,0x75,0x72,0x61,0, - 0x62,0x72,0x65,0x74,0x65,0x6c,0x6c,0x61,0, - 0x62,0x72,0x65,0x76,0x65,0x74,0x74,0x6f,0, - 0x62,0x72,0x65,0x7a,0x7a,0x61,0, - 0x62,0x72,0x69,0x67,0x6c,0x69,0x61,0, - 0x62,0x72,0x69,0x6c,0x6c,0x61,0x6e,0x74,0x65,0, - 0x62,0x72,0x69,0x6e,0x64,0x61,0x72,0x65,0, - 0x62,0x72,0x6f,0x63,0x63,0x6f,0x6c,0x6f,0, - 0x62,0x72,0x6f,0x64,0x6f,0, - 0x62,0x72,0x6f,0x6e,0x7a,0x69,0x6e,0x61,0, - 0x62,0x72,0x75,0x6c,0x6c,0x6f,0, - 0x62,0x72,0x75,0x6e,0x6f,0, - 0x62,0x75,0x62,0x62,0x6f,0x6e,0x65,0, - 0x62,0x75,0x63,0x61,0, - 0x62,0x75,0x64,0x69,0x6e,0x6f,0, - 0x62,0x75,0x66,0x66,0x6f,0x6e,0x65,0, - 0x62,0x75,0x69,0x6f,0, - 0x62,0x75,0x6c,0x62,0x6f,0, - 0x62,0x75,0x6f,0x6e,0x6f,0, - 0x62,0x75,0x72,0x6c,0x6f,0x6e,0x65,0, - 0x62,0x75,0x72,0x72,0x61,0x73,0x63,0x61,0, - 0x62,0x75,0x73,0x73,0x6f,0x6c,0x61,0, - 0x62,0x75,0x73,0x74,0x61,0, - 0x63,0x61,0x64,0x65,0x74,0x74,0x6f,0, - 0x63,0x61,0x64,0x75,0x63,0x6f,0, - 0x63,0x61,0x6c,0x61,0x6d,0x61,0x72,0x6f,0, - 0x63,0x61,0x6c,0x63,0x6f,0x6c,0x6f,0, - 0x63,0x61,0x6c,0x65,0x73,0x73,0x65,0, - 0x63,0x61,0x6c,0x69,0x62,0x72,0x6f,0, - 0x63,0x61,0x6c,0x6d,0x6f,0, - 0x63,0x61,0x6c,0x6f,0x72,0x69,0x61,0, - 0x63,0x61,0x6d,0x62,0x75,0x73,0x61,0, - 0x63,0x61,0x6d,0x65,0x72,0x61,0x74,0x61,0, - 0x63,0x61,0x6d,0x69,0x63,0x69,0x61,0, - 0x63,0x61,0x6d,0x6d,0x69,0x6e,0x6f,0, - 0x63,0x61,0x6d,0x6f,0x6c,0x61,0, - 0x63,0x61,0x6d,0x70,0x61,0x6c,0x65,0, - 0x63,0x61,0x6e,0x61,0x70,0x61,0, - 0x63,0x61,0x6e,0x64,0x65,0x6c,0x61,0, - 0x63,0x61,0x6e,0x65,0, - 0x63,0x61,0x6e,0x69,0x6e,0x6f,0, - 0x63,0x61,0x6e,0x6f,0x74,0x74,0x6f,0, - 0x63,0x61,0x6e,0x74,0x69,0x6e,0x61,0, - 0x63,0x61,0x70,0x61,0x63,0x65,0, - 0x63,0x61,0x70,0x65,0x6c,0x6c,0x6f,0, - 0x63,0x61,0x70,0x69,0x74,0x6f,0x6c,0x6f,0, - 0x63,0x61,0x70,0x6f,0x67,0x69,0x72,0x6f,0, - 0x63,0x61,0x70,0x70,0x65,0x72,0x6f,0, - 0x63,0x61,0x70,0x72,0x61,0, - 0x63,0x61,0x70,0x73,0x75,0x6c,0x61,0, - 0x63,0x61,0x72,0x61,0x70,0x61,0x63,0x65,0, - 0x63,0x61,0x72,0x63,0x61,0x73,0x73,0x61,0, - 0x63,0x61,0x72,0x64,0x6f,0, - 0x63,0x61,0x72,0x69,0x73,0x6d,0x61,0, - 0x63,0x61,0x72,0x6f,0x76,0x61,0x6e,0x61,0, - 0x63,0x61,0x72,0x72,0x65,0x74,0x74,0x6f,0, - 0x63,0x61,0x72,0x74,0x6f,0x6c,0x69,0x6e,0x61,0, - 0x63,0x61,0x73,0x61,0x63,0x63,0x69,0x6f,0, - 0x63,0x61,0x73,0x63,0x61,0x74,0x61,0, - 0x63,0x61,0x73,0x65,0x72,0x6d,0x61,0, - 0x63,0x61,0x73,0x6f,0, - 0x63,0x61,0x73,0x73,0x6f,0x6e,0x65,0, - 0x63,0x61,0x73,0x74,0x65,0x6c,0x6c,0x6f,0, - 0x63,0x61,0x73,0x75,0x61,0x6c,0x65,0, - 0x63,0x61,0x74,0x61,0x73,0x74,0x61,0, - 0x63,0x61,0x74,0x65,0x6e,0x61,0, - 0x63,0x61,0x74,0x72,0x61,0x6d,0x65,0, - 0x63,0x61,0x75,0x74,0x6f,0, - 0x63,0x61,0x76,0x69,0x6c,0x6c,0x6f,0, - 0x63,0x65,0x64,0x69,0x62,0x69,0x6c,0x65,0, - 0x63,0x65,0x64,0x72,0x61,0x74,0x61,0, - 0x63,0x65,0x66,0x61,0x6c,0x6f,0, - 0x63,0x65,0x6c,0x65,0x62,0x72,0x65,0, - 0x63,0x65,0x6c,0x6c,0x75,0x6c,0x61,0x72,0x65,0, - 0x63,0x65,0x6e,0x61,0, - 0x63,0x65,0x6e,0x6f,0x6e,0x65,0, - 0x63,0x65,0x6e,0x74,0x65,0x73,0x69,0x6d,0x6f,0, - 0x63,0x65,0x72,0x61,0x6d,0x69,0x63,0x61,0, - 0x63,0x65,0x72,0x63,0x61,0x72,0x65,0, - 0x63,0x65,0x72,0x74,0x6f,0, - 0x63,0x65,0x72,0x75,0x6d,0x65,0, - 0x63,0x65,0x72,0x76,0x65,0x6c,0x6c,0x6f,0, - 0x63,0x65,0x73,0x6f,0x69,0x61,0, - 0x63,0x65,0x73,0x70,0x6f,0, - 0x63,0x65,0x74,0x6f,0, - 0x63,0x68,0x65,0x6c,0x61,0, - 0x63,0x68,0x69,0x61,0x72,0x6f,0, - 0x63,0x68,0x69,0x63,0x63,0x61,0, - 0x63,0x68,0x69,0x65,0x64,0x65,0x72,0x65,0, - 0x63,0x68,0x69,0x6d,0x65,0x72,0x61,0, - 0x63,0x68,0x69,0x6e,0x61,0, - 0x63,0x68,0x69,0x72,0x75,0x72,0x67,0x6f,0, - 0x63,0x68,0x69,0x74,0x61,0x72,0x72,0x61,0, - 0x63,0x69,0x61,0x6f,0, - 0x63,0x69,0x63,0x6c,0x69,0x73,0x6d,0x6f,0, - 0x63,0x69,0x66,0x72,0x61,0x72,0x65,0, - 0x63,0x69,0x67,0x6e,0x6f,0, - 0x63,0x69,0x6c,0x69,0x6e,0x64,0x72,0x6f,0, - 0x63,0x69,0x6f,0x74,0x74,0x6f,0x6c,0x6f,0, - 0x63,0x69,0x72,0x63,0x61,0, - 0x63,0x69,0x72,0x72,0x6f,0x73,0x69,0, - 0x63,0x69,0x74,0x72,0x69,0x63,0x6f,0, - 0x63,0x69,0x74,0x74,0x61,0x64,0x69,0x6e,0x6f,0, - 0x63,0x69,0x75,0x66,0x66,0x6f,0, - 0x63,0x69,0x76,0x65,0x74,0x74,0x61,0, - 0x63,0x69,0x76,0x69,0x6c,0x65,0, - 0x63,0x6c,0x61,0x73,0x73,0x69,0x63,0x6f,0, - 0x63,0x6c,0x69,0x6e,0x69,0x63,0x61,0, - 0x63,0x6c,0x6f,0x72,0x6f,0, - 0x63,0x6f,0x63,0x63,0x6f,0, - 0x63,0x6f,0x64,0x61,0x72,0x64,0x6f,0, - 0x63,0x6f,0x64,0x69,0x63,0x65,0, - 0x63,0x6f,0x65,0x72,0x65,0x6e,0x74,0x65,0, - 0x63,0x6f,0x67,0x6e,0x6f,0x6d,0x65,0, - 0x63,0x6f,0x6c,0x6c,0x61,0x72,0x65,0, - 0x63,0x6f,0x6c,0x6d,0x61,0x74,0x6f,0, - 0x63,0x6f,0x6c,0x6f,0x72,0x65,0, - 0x63,0x6f,0x6c,0x70,0x6f,0x73,0x6f,0, - 0x63,0x6f,0x6c,0x74,0x69,0x76,0x61,0x74,0x6f,0, - 0x63,0x6f,0x6c,0x7a,0x61,0, - 0x63,0x6f,0x6d,0x61,0, - 0x63,0x6f,0x6d,0x65,0x74,0x61,0, - 0x63,0x6f,0x6d,0x6d,0x61,0x6e,0x64,0x6f,0, - 0x63,0x6f,0x6d,0x6f,0x64,0x6f,0, - 0x63,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0, - 0x63,0x6f,0x6d,0x75,0x6e,0x65,0, - 0x63,0x6f,0x6e,0x63,0x69,0x73,0x6f,0, - 0x63,0x6f,0x6e,0x64,0x75,0x72,0x72,0x65,0, - 0x63,0x6f,0x6e,0x66,0x65,0x72,0x6d,0x61,0, - 0x63,0x6f,0x6e,0x67,0x65,0x6c,0x61,0x72,0x65,0, - 0x63,0x6f,0x6e,0x69,0x75,0x67,0x65,0, - 0x63,0x6f,0x6e,0x6e,0x65,0x73,0x73,0x6f,0, - 0x63,0x6f,0x6e,0x6f,0x73,0x63,0x65,0x72,0x65,0, - 0x63,0x6f,0x6e,0x73,0x75,0x6d,0x6f,0, - 0x63,0x6f,0x6e,0x74,0x69,0x6e,0x75,0x6f,0, - 0x63,0x6f,0x6e,0x76,0x65,0x67,0x6e,0x6f,0, - 0x63,0x6f,0x70,0x65,0x72,0x74,0x6f,0, - 0x63,0x6f,0x70,0x69,0x6f,0x6e,0x65,0, - 0x63,0x6f,0x70,0x70,0x69,0x61,0, - 0x63,0x6f,0x70,0x72,0x69,0x63,0x61,0x70,0x6f,0, - 0x63,0x6f,0x72,0x61,0x7a,0x7a,0x61,0, - 0x63,0x6f,0x72,0x64,0x61,0x74,0x61,0, - 0x63,0x6f,0x72,0x69,0x63,0x61,0x74,0x6f,0, - 0x63,0x6f,0x72,0x6e,0x69,0x63,0x65,0, - 0x63,0x6f,0x72,0x6f,0x6c,0x6c,0x61,0, - 0x63,0x6f,0x72,0x70,0x6f,0, - 0x63,0x6f,0x72,0x72,0x65,0x64,0x6f,0, - 0x63,0x6f,0x72,0x73,0x69,0x61,0, - 0x63,0x6f,0x72,0x74,0x65,0x73,0x65,0, - 0x63,0x6f,0x73,0x6d,0x69,0x63,0x6f,0, - 0x63,0x6f,0x73,0x74,0x61,0x6e,0x74,0x65,0, - 0x63,0x6f,0x74,0x74,0x75,0x72,0x61,0, - 0x63,0x6f,0x76,0x61,0x74,0x6f,0, - 0x63,0x72,0x61,0x74,0x65,0x72,0x65,0, - 0x63,0x72,0x61,0x76,0x61,0x74,0x74,0x61,0, - 0x63,0x72,0x65,0x61,0x74,0x6f,0, - 0x63,0x72,0x65,0x64,0x65,0x72,0x65,0, - 0x63,0x72,0x65,0x6d,0x6f,0x73,0x6f,0, - 0x63,0x72,0x65,0x73,0x63,0x69,0x74,0x61,0, - 0x63,0x72,0x65,0x74,0x61,0, - 0x63,0x72,0x69,0x63,0x65,0x74,0x6f,0, - 0x63,0x72,0x69,0x6e,0x61,0x6c,0x65,0, - 0x63,0x72,0x69,0x73,0x69,0, - 0x63,0x72,0x69,0x74,0x69,0x63,0x6f,0, - 0x63,0x72,0x6f,0x63,0x65,0, - 0x63,0x72,0x6f,0x6e,0x61,0x63,0x61,0, - 0x63,0x72,0x6f,0x73,0x74,0x61,0x74,0x61,0, - 0x63,0x72,0x75,0x63,0x69,0x61,0x6c,0x65,0, - 0x63,0x72,0x75,0x73,0x63,0x61,0, - 0x63,0x75,0x63,0x69,0x72,0x65,0, - 0x63,0x75,0x63,0x75,0x6c,0x6f,0, - 0x63,0x75,0x67,0x69,0x6e,0x6f,0, - 0x63,0x75,0x6c,0x6c,0x61,0x74,0x6f,0, - 0x63,0x75,0x70,0x6f,0x6c,0x61,0, - 0x63,0x75,0x72,0x61,0x74,0x6f,0x72,0x65,0, - 0x63,0x75,0x72,0x73,0x6f,0x72,0x65,0, - 0x63,0x75,0x72,0x76,0x6f,0, - 0x63,0x75,0x73,0x63,0x69,0x6e,0x6f,0, - 0x63,0x75,0x73,0x74,0x6f,0x64,0x65,0, - 0x64,0x61,0x64,0x6f,0, - 0x64,0x61,0x69,0x6e,0x6f,0, - 0x64,0x61,0x6c,0x6d,0x61,0x74,0x61,0, - 0x64,0x61,0x6d,0x65,0x72,0x69,0x6e,0x6f,0, - 0x64,0x61,0x6e,0x69,0x65,0x6c,0x61,0, - 0x64,0x61,0x6e,0x6e,0x6f,0x73,0x6f,0, - 0x64,0x61,0x6e,0x7a,0x61,0x72,0x65,0, - 0x64,0x61,0x74,0x61,0x74,0x6f,0, - 0x64,0x61,0x76,0x61,0x6e,0x74,0x69,0, - 0x64,0x61,0x76,0x76,0x65,0x72,0x6f,0, - 0x64,0x65,0x62,0x75,0x74,0x74,0x6f,0, - 0x64,0x65,0x63,0x65,0x6e,0x6e,0x69,0x6f,0, - 0x64,0x65,0x63,0x69,0x73,0x6f,0, - 0x64,0x65,0x63,0x6c,0x69,0x6e,0x6f,0, - 0x64,0x65,0x63,0x6f,0x6c,0x6c,0x6f,0, - 0x64,0x65,0x63,0x72,0x65,0x74,0x6f,0, - 0x64,0x65,0x64,0x69,0x63,0x61,0x74,0x6f,0, - 0x64,0x65,0x66,0x69,0x6e,0x69,0x74,0x6f,0, - 0x64,0x65,0x66,0x6f,0x72,0x6d,0x65,0, - 0x64,0x65,0x67,0x6e,0x6f,0, - 0x64,0x65,0x6c,0x65,0x67,0x61,0x72,0x65,0, - 0x64,0x65,0x6c,0x66,0x69,0x6e,0x6f,0, - 0x64,0x65,0x6c,0x69,0x72,0x69,0x6f,0, - 0x64,0x65,0x6c,0x74,0x61,0, - 0x64,0x65,0x6d,0x65,0x6e,0x7a,0x61,0, - 0x64,0x65,0x6e,0x6f,0x74,0x61,0x74,0x6f,0, - 0x64,0x65,0x6e,0x74,0x72,0x6f,0, - 0x64,0x65,0x70,0x6f,0x73,0x69,0x74,0x6f,0, - 0x64,0x65,0x72,0x61,0x70,0x61,0x74,0x61,0, - 0x64,0x65,0x72,0x69,0x76,0x61,0x72,0x65,0, - 0x64,0x65,0x72,0x6f,0x67,0x61,0, - 0x64,0x65,0x73,0x63,0x72,0x69,0x74,0x74,0x6f,0, - 0x64,0x65,0x73,0x65,0x72,0x74,0x6f,0, - 0x64,0x65,0x73,0x69,0x64,0x65,0x72,0x69,0x6f,0, - 0x64,0x65,0x73,0x75,0x6d,0x65,0x72,0x65,0, - 0x64,0x65,0x74,0x65,0x72,0x73,0x69,0x76,0x6f,0, - 0x64,0x65,0x76,0x6f,0x74,0x6f,0, - 0x64,0x69,0x61,0x6d,0x65,0x74,0x72,0x6f,0, - 0x64,0x69,0x63,0x65,0x6d,0x62,0x72,0x65,0, - 0x64,0x69,0x65,0x64,0x72,0x6f,0, - 0x64,0x69,0x66,0x65,0x73,0x6f,0, - 0x64,0x69,0x66,0x66,0x75,0x73,0x6f,0, - 0x64,0x69,0x67,0x65,0x72,0x69,0x72,0x65,0, - 0x64,0x69,0x67,0x69,0x74,0x61,0x6c,0x65,0, - 0x64,0x69,0x6c,0x75,0x76,0x69,0x6f,0, - 0x64,0x69,0x6e,0x61,0x6d,0x69,0x63,0x6f,0, - 0x64,0x69,0x6e,0x6e,0x61,0x6e,0x7a,0x69,0, - 0x64,0x69,0x70,0x69,0x6e,0x74,0x6f,0, - 0x64,0x69,0x70,0x6c,0x6f,0x6d,0x61,0, - 0x64,0x69,0x70,0x6f,0x6c,0x6f,0, - 0x64,0x69,0x72,0x61,0x64,0x61,0x72,0x65,0, - 0x64,0x69,0x72,0x65,0, - 0x64,0x69,0x72,0x6f,0x74,0x74,0x6f,0, - 0x64,0x69,0x72,0x75,0x70,0x6f,0, - 0x64,0x69,0x73,0x61,0x67,0x69,0x6f,0, - 0x64,0x69,0x73,0x63,0x72,0x65,0x74,0x6f,0, - 0x64,0x69,0x73,0x66,0x61,0x72,0x65,0, - 0x64,0x69,0x73,0x67,0x65,0x6c,0x6f,0, - 0x64,0x69,0x73,0x70,0x6f,0x73,0x74,0x6f,0, - 0x64,0x69,0x73,0x74,0x61,0x6e,0x7a,0x61,0, - 0x64,0x69,0x73,0x75,0x6d,0x61,0x6e,0x6f,0, - 0x64,0x69,0x74,0x6f,0, - 0x64,0x69,0x76,0x61,0x6e,0x6f,0, - 0x64,0x69,0x76,0x65,0x6c,0x74,0x6f,0, - 0x64,0x69,0x76,0x69,0x64,0x65,0x72,0x65,0, - 0x64,0x69,0x76,0x6f,0x72,0x61,0x74,0x6f,0, - 0x64,0x6f,0x62,0x6c,0x6f,0x6e,0x65,0, - 0x64,0x6f,0x63,0x65,0x6e,0x74,0x65,0, - 0x64,0x6f,0x67,0x61,0x6e,0x61,0x6c,0x65,0, - 0x64,0x6f,0x67,0x6d,0x61,0, - 0x64,0x6f,0x6c,0x63,0x65,0, - 0x64,0x6f,0x6d,0x61,0x74,0x6f,0, - 0x64,0x6f,0x6d,0x65,0x6e,0x69,0x63,0x61,0, - 0x64,0x6f,0x6d,0x69,0x6e,0x61,0x72,0x65,0, - 0x64,0x6f,0x6e,0x64,0x6f,0x6c,0x6f,0, - 0x64,0x6f,0x6e,0x6f,0, - 0x64,0x6f,0x72,0x6d,0x69,0x72,0x65,0, - 0x64,0x6f,0x74,0x65,0, - 0x64,0x6f,0x74,0x74,0x6f,0x72,0x65,0, - 0x64,0x6f,0x76,0x75,0x74,0x6f,0, - 0x64,0x6f,0x7a,0x7a,0x69,0x6e,0x61,0, - 0x64,0x72,0x61,0x67,0x6f,0, - 0x64,0x72,0x75,0x69,0x64,0x6f,0, - 0x64,0x75,0x62,0x62,0x69,0x6f,0, - 0x64,0x75,0x62,0x69,0x74,0x61,0x72,0x65,0, - 0x64,0x75,0x63,0x61,0x6c,0x65,0, - 0x64,0x75,0x6e,0x61,0, - 0x64,0x75,0x6f,0x6d,0x6f,0, - 0x64,0x75,0x70,0x6c,0x69,0x63,0x65,0, - 0x64,0x75,0x72,0x61,0x74,0x75,0x72,0x6f,0, - 0x65,0x62,0x61,0x6e,0x6f,0, - 0x65,0x63,0x63,0x65,0x73,0x73,0x6f,0, - 0x65,0x63,0x63,0x6f,0, - 0x65,0x63,0x6c,0x69,0x73,0x73,0x69,0, - 0x65,0x63,0x6f,0x6e,0x6f,0x6d,0x69,0x61,0, - 0x65,0x64,0x65,0x72,0x61,0, - 0x65,0x64,0x69,0x63,0x6f,0x6c,0x61,0, - 0x65,0x64,0x69,0x6c,0x65,0, - 0x65,0x64,0x69,0x74,0x6f,0x72,0x69,0x61,0, - 0x65,0x64,0x75,0x63,0x61,0x72,0x65,0, - 0x65,0x67,0x65,0x6d,0x6f,0x6e,0x69,0x61,0, - 0x65,0x67,0x6c,0x69,0, - 0x65,0x67,0x6f,0x69,0x73,0x6d,0x6f,0, - 0x65,0x67,0x72,0x65,0x67,0x69,0x6f,0, - 0x65,0x6c,0x61,0x62,0x6f,0x72,0x61,0x74,0x6f,0, - 0x65,0x6c,0x61,0x72,0x67,0x69,0x72,0x65,0, - 0x65,0x6c,0x65,0x67,0x61,0x6e,0x74,0x65,0, - 0x65,0x6c,0x65,0x6e,0x63,0x61,0x74,0x6f,0, - 0x65,0x6c,0x65,0x74,0x74,0x6f,0, - 0x65,0x6c,0x65,0x76,0x61,0x72,0x65,0, - 0x65,0x6c,0x66,0x69,0x63,0x6f,0, - 0x65,0x6c,0x69,0x63,0x61,0, - 0x65,0x6c,0x6d,0x6f,0, - 0x65,0x6c,0x73,0x61,0, - 0x65,0x6c,0x75,0x73,0x6f,0, - 0x65,0x6d,0x61,0x6e,0x61,0x74,0x6f,0, - 0x65,0x6d,0x62,0x6c,0x65,0x6d,0x61,0, - 0x65,0x6d,0x65,0x73,0x73,0x6f,0, - 0x65,0x6d,0x69,0x72,0x6f,0, - 0x65,0x6d,0x6f,0x74,0x69,0x76,0x6f,0, - 0x65,0x6d,0x6f,0x7a,0x69,0x6f,0x6e,0x65,0, - 0x65,0x6d,0x70,0x69,0x72,0x69,0x63,0x6f,0, - 0x65,0x6d,0x75,0x6c,0x6f,0, - 0x65,0x6e,0x64,0x65,0x6d,0x69,0x63,0x6f,0, - 0x65,0x6e,0x64,0x75,0x72,0x6f,0, - 0x65,0x6e,0x65,0x72,0x67,0x69,0x61,0, - 0x65,0x6e,0x66,0x61,0x73,0x69,0, - 0x65,0x6e,0x6f,0x74,0x65,0x63,0x61,0, - 0x65,0x6e,0x74,0x72,0x61,0x72,0x65,0, - 0x65,0x6e,0x7a,0x69,0x6d,0x61,0, - 0x65,0x70,0x61,0x74,0x69,0x74,0x65,0, - 0x65,0x70,0x69,0x6c,0x6f,0x67,0x6f,0, - 0x65,0x70,0x69,0x73,0x6f,0x64,0x69,0x6f,0, - 0x65,0x70,0x6f,0x63,0x61,0x6c,0x65,0, - 0x65,0x70,0x70,0x75,0x72,0x65,0, - 0x65,0x71,0x75,0x61,0x74,0x6f,0x72,0x65,0, - 0x65,0x72,0x61,0x72,0x69,0x6f,0, - 0x65,0x72,0x62,0x61,0, - 0x65,0x72,0x62,0x6f,0x73,0x6f,0, - 0x65,0x72,0x65,0x64,0x65,0, - 0x65,0x72,0x65,0x6d,0x69,0x74,0x61,0, - 0x65,0x72,0x69,0x67,0x65,0x72,0x65,0, - 0x65,0x72,0x6d,0x65,0x74,0x69,0x63,0x6f,0, - 0x65,0x72,0x6f,0x65,0, - 0x65,0x72,0x6f,0x73,0x69,0x76,0x6f,0, - 0x65,0x72,0x72,0x61,0x6e,0x74,0x65,0, - 0x65,0x73,0x61,0x67,0x6f,0x6e,0x6f,0, - 0x65,0x73,0x61,0x6d,0x65,0, - 0x65,0x73,0x61,0x6e,0x69,0x6d,0x65,0, - 0x65,0x73,0x61,0x75,0x64,0x69,0x72,0x65,0, - 0x65,0x73,0x63,0x61,0, - 0x65,0x73,0x65,0x6d,0x70,0x69,0x6f,0, - 0x65,0x73,0x65,0x72,0x63,0x69,0x74,0x6f,0, - 0x65,0x73,0x69,0x62,0x69,0x74,0x6f,0, - 0x65,0x73,0x69,0x67,0x65,0x6e,0x74,0x65,0, - 0x65,0x73,0x69,0x73,0x74,0x65,0x72,0x65,0, - 0x65,0x73,0x69,0x74,0x6f,0, - 0x65,0x73,0x6f,0x66,0x61,0x67,0x6f,0, - 0x65,0x73,0x6f,0x72,0x74,0x61,0x74,0x6f,0, - 0x65,0x73,0x6f,0x73,0x6f,0, - 0x65,0x73,0x70,0x61,0x6e,0x73,0x6f,0, - 0x65,0x73,0x70,0x72,0x65,0x73,0x73,0x6f,0, - 0x65,0x73,0x73,0x65,0x6e,0x7a,0x61,0, - 0x65,0x73,0x73,0x6f,0, - 0x65,0x73,0x74,0x65,0x73,0x6f,0, - 0x65,0x73,0x74,0x69,0x6d,0x61,0x72,0x65,0, - 0x65,0x73,0x74,0x6f,0x6e,0x69,0x61,0, - 0x65,0x73,0x74,0x72,0x6f,0x73,0x6f,0, - 0x65,0x73,0x75,0x6c,0x74,0x61,0x72,0x65,0, - 0x65,0x74,0x69,0x6c,0x69,0x63,0x6f,0, - 0x65,0x74,0x6e,0x69,0x63,0x6f,0, - 0x65,0x74,0x72,0x75,0x73,0x63,0x6f,0, - 0x65,0x74,0x74,0x6f,0, - 0x65,0x75,0x63,0x6c,0x69,0x64,0x65,0x6f,0, - 0x65,0x75,0x72,0x6f,0x70,0x61,0, - 0x65,0x76,0x61,0x73,0x6f,0, - 0x65,0x76,0x69,0x64,0x65,0x6e,0x7a,0x61,0, - 0x65,0x76,0x69,0x74,0x61,0x74,0x6f,0, - 0x65,0x76,0x6f,0x6c,0x75,0x74,0x6f,0, - 0x65,0x76,0x76,0x69,0x76,0x61,0, - 0x66,0x61,0x62,0x62,0x72,0x69,0x63,0x61,0, - 0x66,0x61,0x63,0x63,0x65,0x6e,0x64,0x61,0, - 0x66,0x61,0x63,0x68,0x69,0x72,0x6f,0, - 0x66,0x61,0x6c,0x63,0x6f,0, - 0x66,0x61,0x6d,0x69,0x67,0x6c,0x69,0x61,0, - 0x66,0x61,0x6e,0x61,0x6c,0x65,0, - 0x66,0x61,0x6e,0x66,0x61,0x72,0x61,0, - 0x66,0x61,0x6e,0x67,0x6f,0, - 0x66,0x61,0x6e,0x74,0x61,0x73,0x6d,0x61,0, - 0x66,0x61,0x72,0x65,0, - 0x66,0x61,0x72,0x66,0x61,0x6c,0x6c,0x61,0, - 0x66,0x61,0x72,0x69,0x6e,0x6f,0x73,0x6f,0, - 0x66,0x61,0x72,0x6d,0x61,0x63,0x6f,0, - 0x66,0x61,0x73,0x63,0x69,0x61,0, - 0x66,0x61,0x73,0x74,0x6f,0x73,0x6f,0, - 0x66,0x61,0x73,0x75,0x6c,0x6c,0x6f,0, - 0x66,0x61,0x74,0x69,0x63,0x61,0x72,0x65,0, - 0x66,0x61,0x74,0x6f,0, - 0x66,0x61,0x76,0x6f,0x6c,0x6f,0x73,0x6f,0, - 0x66,0x65,0x62,0x62,0x72,0x65,0, - 0x66,0x65,0x63,0x6f,0x6c,0x61,0, - 0x66,0x65,0x64,0x65,0, - 0x66,0x65,0x67,0x61,0x74,0x6f,0, - 0x66,0x65,0x6c,0x70,0x61,0, - 0x66,0x65,0x6c,0x74,0x72,0x6f,0, - 0x66,0x65,0x6d,0x6d,0x69,0x6e,0x61,0, - 0x66,0x65,0x6e,0x64,0x65,0x72,0x65,0, - 0x66,0x65,0x6e,0x6f,0x6d,0x65,0x6e,0x6f,0, - 0x66,0x65,0x72,0x6d,0x65,0x6e,0x74,0x6f,0, - 0x66,0x65,0x72,0x72,0x6f,0, - 0x66,0x65,0x72,0x74,0x69,0x6c,0x65,0, - 0x66,0x65,0x73,0x73,0x75,0x72,0x61,0, - 0x66,0x65,0x73,0x74,0x69,0x76,0x6f,0, - 0x66,0x65,0x74,0x74,0x61,0, - 0x66,0x65,0x75,0x64,0x6f,0, - 0x66,0x69,0x61,0x62,0x61,0, - 0x66,0x69,0x64,0x75,0x63,0x69,0x61,0, - 0x66,0x69,0x66,0x61,0, - 0x66,0x69,0x67,0x75,0x72,0x61,0x74,0x6f,0, - 0x66,0x69,0x6c,0x6f,0, - 0x66,0x69,0x6e,0x61,0x6e,0x7a,0x61,0, - 0x66,0x69,0x6e,0x65,0x73,0x74,0x72,0x61,0, - 0x66,0x69,0x6e,0x69,0x72,0x65,0, - 0x66,0x69,0x6f,0x72,0x65,0, - 0x66,0x69,0x73,0x63,0x61,0x6c,0x65,0, - 0x66,0x69,0x73,0x69,0x63,0x6f,0, - 0x66,0x69,0x75,0x6d,0x65,0, - 0x66,0x6c,0x61,0x63,0x6f,0x6e,0x65,0, - 0x66,0x6c,0x61,0x6d,0x65,0x6e,0x63,0x6f,0, - 0x66,0x6c,0x65,0x62,0x6f,0, - 0x66,0x6c,0x65,0x6d,0x6d,0x61,0, - 0x66,0x6c,0x6f,0x72,0x69,0x64,0x6f,0, - 0x66,0x6c,0x75,0x65,0x6e,0x74,0x65,0, - 0x66,0x6c,0x75,0x6f,0x72,0x6f,0, - 0x66,0x6f,0x62,0x69,0x63,0x6f,0, - 0x66,0x6f,0x63,0x61,0x63,0x63,0x69,0x61,0, - 0x66,0x6f,0x63,0x6f,0x73,0x6f,0, - 0x66,0x6f,0x64,0x65,0x72,0x61,0x74,0x6f,0, - 0x66,0x6f,0x67,0x6c,0x69,0x6f,0, - 0x66,0x6f,0x6c,0x61,0x74,0x61,0, - 0x66,0x6f,0x6c,0x63,0x6c,0x6f,0x72,0x65,0, - 0x66,0x6f,0x6c,0x67,0x6f,0x72,0x65,0, - 0x66,0x6f,0x6e,0x64,0x65,0x6e,0x74,0x65,0, - 0x66,0x6f,0x6e,0x65,0x74,0x69,0x63,0x6f,0, - 0x66,0x6f,0x6e,0x69,0x61,0, - 0x66,0x6f,0x6e,0x74,0x61,0x6e,0x61,0, - 0x66,0x6f,0x72,0x62,0x69,0x74,0x6f,0, - 0x66,0x6f,0x72,0x63,0x68,0x65,0x74,0x74,0x61,0, - 0x66,0x6f,0x72,0x65,0x73,0x74,0x61,0, - 0x66,0x6f,0x72,0x6d,0x69,0x63,0x61,0, - 0x66,0x6f,0x72,0x6e,0x61,0x69,0x6f,0, - 0x66,0x6f,0x72,0x6f,0, - 0x66,0x6f,0x72,0x74,0x65,0x7a,0x7a,0x61,0, - 0x66,0x6f,0x72,0x7a,0x61,0x72,0x65,0, - 0x66,0x6f,0x73,0x66,0x61,0x74,0x6f,0, - 0x66,0x6f,0x73,0x73,0x6f,0, - 0x66,0x72,0x61,0x63,0x61,0x73,0x73,0x6f,0, - 0x66,0x72,0x61,0x6e,0x61,0, - 0x66,0x72,0x61,0x73,0x73,0x69,0x6e,0x6f,0, - 0x66,0x72,0x61,0x74,0x65,0x6c,0x6c,0x6f,0, - 0x66,0x72,0x65,0x63,0x63,0x65,0x74,0x74,0x61,0, - 0x66,0x72,0x65,0x6e,0x61,0x74,0x61,0, - 0x66,0x72,0x65,0x73,0x63,0x6f,0, - 0x66,0x72,0x69,0x67,0x6f,0, - 0x66,0x72,0x6f,0x6c,0x6c,0x69,0x6e,0x6f,0, - 0x66,0x72,0x6f,0x6e,0x64,0x65,0, - 0x66,0x72,0x75,0x67,0x61,0x6c,0x65,0, - 0x66,0x72,0x75,0x74,0x74,0x61,0, - 0x66,0x75,0x63,0x69,0x6c,0x61,0x74,0x61,0, - 0x66,0x75,0x63,0x73,0x69,0x61,0, - 0x66,0x75,0x67,0x67,0x65,0x6e,0x74,0x65,0, - 0x66,0x75,0x6c,0x6d,0x69,0x6e,0x65,0, - 0x66,0x75,0x6c,0x76,0x6f,0, - 0x66,0x75,0x6d,0x61,0x6e,0x74,0x65,0, - 0x66,0x75,0x6d,0x65,0x74,0x74,0x6f,0, - 0x66,0x75,0x6d,0x6f,0x73,0x6f,0, - 0x66,0x75,0x6e,0x65,0, - 0x66,0x75,0x6e,0x7a,0x69,0x6f,0x6e,0x65,0, - 0x66,0x75,0x6f,0x63,0x6f,0, - 0x66,0x75,0x72,0x62,0x6f,0, - 0x66,0x75,0x72,0x67,0x6f,0x6e,0x65,0, - 0x66,0x75,0x72,0x6f,0x72,0x65,0, - 0x66,0x75,0x73,0x6f,0, - 0x66,0x75,0x74,0x69,0x6c,0x65,0, - 0x67,0x61,0x62,0x62,0x69,0x61,0x6e,0x6f,0, - 0x67,0x61,0x66,0x66,0x65,0, - 0x67,0x61,0x6c,0x61,0x74,0x65,0x6f,0, - 0x67,0x61,0x6c,0x6c,0x69,0x6e,0x61,0, - 0x67,0x61,0x6c,0x6f,0x70,0x70,0x6f,0, - 0x67,0x61,0x6d,0x62,0x65,0x72,0x6f,0, - 0x67,0x61,0x6d,0x6d,0x61,0, - 0x67,0x61,0x72,0x61,0x6e,0x7a,0x69,0x61,0, - 0x67,0x61,0x72,0x62,0x6f,0, - 0x67,0x61,0x72,0x6f,0x66,0x61,0x6e,0x6f,0, - 0x67,0x61,0x72,0x7a,0x6f,0x6e,0x65,0, - 0x67,0x61,0x73,0x64,0x6f,0x74,0x74,0x6f,0, - 0x67,0x61,0x73,0x6f,0x6c,0x69,0x6f,0, - 0x67,0x61,0x73,0x74,0x72,0x69,0x63,0x6f,0, - 0x67,0x61,0x74,0x74,0x6f,0, - 0x67,0x61,0x75,0x64,0x69,0x6f,0, - 0x67,0x61,0x7a,0x65,0x62,0x6f,0, - 0x67,0x61,0x7a,0x7a,0x65,0x6c,0x6c,0x61,0, - 0x67,0x65,0x63,0x6f,0, - 0x67,0x65,0x6c,0x61,0x74,0x69,0x6e,0x61,0, - 0x67,0x65,0x6c,0x73,0x6f,0, - 0x67,0x65,0x6d,0x65,0x6c,0x6c,0x6f,0, - 0x67,0x65,0x6d,0x6d,0x61,0x74,0x6f,0, - 0x67,0x65,0x6e,0x65,0, - 0x67,0x65,0x6e,0x69,0x74,0x6f,0x72,0x65,0, - 0x67,0x65,0x6e,0x6e,0x61,0x69,0x6f,0, - 0x67,0x65,0x6e,0x6f,0x74,0x69,0x70,0x6f,0, - 0x67,0x65,0x72,0x67,0x6f,0, - 0x67,0x68,0x65,0x70,0x61,0x72,0x64,0x6f,0, - 0x67,0x68,0x69,0x61,0x63,0x63,0x69,0x6f,0, - 0x67,0x68,0x69,0x73,0x61,0, - 0x67,0x69,0x61,0x6c,0x6c,0x6f,0, - 0x67,0x69,0x6c,0x64,0x61,0, - 0x67,0x69,0x6e,0x65,0x70,0x72,0x6f,0, - 0x67,0x69,0x6f,0x63,0x61,0x72,0x65,0, - 0x67,0x69,0x6f,0x69,0x65,0x6c,0x6c,0x6f,0, - 0x67,0x69,0x6f,0x72,0x6e,0x6f,0, - 0x67,0x69,0x6f,0x76,0x65,0, - 0x67,0x69,0x72,0x61,0x74,0x6f,0, - 0x67,0x69,0x72,0x6f,0x6e,0x65,0, - 0x67,0x69,0x74,0x74,0x61,0x74,0x61,0, - 0x67,0x69,0x75,0x64,0x69,0x7a,0x69,0x6f,0, - 0x67,0x69,0x75,0x72,0x61,0x74,0x6f,0, - 0x67,0x69,0x75,0x73,0x74,0x6f,0, - 0x67,0x6c,0x6f,0x62,0x75,0x6c,0x6f,0, - 0x67,0x6c,0x75,0x74,0x69,0x6e,0x65,0, - 0x67,0x6e,0x6f,0x6d,0x6f,0, - 0x67,0x6f,0x62,0x62,0x61,0, - 0x67,0x6f,0x6c,0x66,0, - 0x67,0x6f,0x6d,0x69,0x74,0x6f,0, - 0x67,0x6f,0x6d,0x6d,0x6f,0x6e,0x65,0, - 0x67,0x6f,0x6e,0x66,0x69,0x6f,0, - 0x67,0x6f,0x6e,0x6e,0x61,0, - 0x67,0x6f,0x76,0x65,0x72,0x6e,0x6f,0, - 0x67,0x72,0x61,0x63,0x69,0x6c,0x65,0, - 0x67,0x72,0x61,0x64,0x6f,0, - 0x67,0x72,0x61,0x66,0x69,0x63,0x6f,0, - 0x67,0x72,0x61,0x6d,0x6d,0x6f,0, - 0x67,0x72,0x61,0x6e,0x64,0x65,0, - 0x67,0x72,0x61,0x74,0x74,0x61,0x72,0x65,0, - 0x67,0x72,0x61,0x76,0x6f,0x73,0x6f,0, - 0x67,0x72,0x61,0x7a,0x69,0x61,0, - 0x67,0x72,0x65,0x63,0x61,0, - 0x67,0x72,0x65,0x67,0x67,0x65,0, - 0x67,0x72,0x69,0x66,0x6f,0x6e,0x65,0, - 0x67,0x72,0x69,0x67,0x69,0x6f,0, - 0x67,0x72,0x69,0x6e,0x7a,0x61,0, - 0x67,0x72,0x6f,0x74,0x74,0x61,0, - 0x67,0x72,0x75,0x70,0x70,0x6f,0, - 0x67,0x75,0x61,0x64,0x61,0x67,0x6e,0x6f,0, - 0x67,0x75,0x61,0x69,0x6f,0, - 0x67,0x75,0x61,0x6e,0x74,0x6f,0, - 0x67,0x75,0x61,0x72,0x64,0x61,0x72,0x65,0, - 0x67,0x75,0x66,0x6f,0, - 0x67,0x75,0x69,0x64,0x61,0x72,0x65,0, - 0x69,0x62,0x65,0x72,0x6e,0x61,0x74,0x6f,0, - 0x69,0x63,0x6f,0x6e,0x61,0, - 0x69,0x64,0x65,0x6e,0x74,0x69,0x63,0x6f,0, - 0x69,0x64,0x69,0x6c,0x6c,0x69,0x6f,0, - 0x69,0x64,0x6f,0x6c,0x6f,0, - 0x69,0x64,0x72,0x61,0, - 0x69,0x64,0x72,0x69,0x63,0x6f,0, - 0x69,0x64,0x72,0x6f,0x67,0x65,0x6e,0x6f,0, - 0x69,0x67,0x69,0x65,0x6e,0x65,0, - 0x69,0x67,0x6e,0x61,0x72,0x6f,0, - 0x69,0x67,0x6e,0x6f,0x72,0x61,0x74,0x6f,0, - 0x69,0x6c,0x61,0x72,0x65,0, - 0x69,0x6c,0x6c,0x65,0x73,0x6f,0, - 0x69,0x6c,0x6c,0x6f,0x67,0x69,0x63,0x6f,0, - 0x69,0x6c,0x6c,0x75,0x64,0x65,0x72,0x65,0, - 0x69,0x6d,0x62,0x61,0x6c,0x6c,0x6f,0, - 0x69,0x6d,0x62,0x65,0x76,0x75,0x74,0x6f,0, - 0x69,0x6d,0x62,0x6f,0x63,0x63,0x6f,0, - 0x69,0x6d,0x62,0x75,0x74,0x6f,0, - 0x69,0x6d,0x6d,0x61,0x6e,0x65,0, - 0x69,0x6d,0x6d,0x65,0x72,0x73,0x6f,0, - 0x69,0x6d,0x6d,0x6f,0x6c,0x61,0x74,0x6f,0, - 0x69,0x6d,0x70,0x61,0x63,0x63,0x6f,0, - 0x69,0x6d,0x70,0x65,0x74,0x6f,0, - 0x69,0x6d,0x70,0x69,0x65,0x67,0x6f,0, - 0x69,0x6d,0x70,0x6f,0x72,0x74,0x6f,0, - 0x69,0x6d,0x70,0x72,0x6f,0x6e,0x74,0x61,0, - 0x69,0x6e,0x61,0x6c,0x61,0x72,0x65,0, - 0x69,0x6e,0x61,0x72,0x63,0x61,0x72,0x65,0, - 0x69,0x6e,0x61,0x74,0x74,0x69,0x76,0x6f,0, - 0x69,0x6e,0x63,0x61,0x6e,0x74,0x6f,0, - 0x69,0x6e,0x63,0x65,0x6e,0x64,0x69,0x6f,0, - 0x69,0x6e,0x63,0x68,0x69,0x6e,0x6f,0, - 0x69,0x6e,0x63,0x69,0x73,0x69,0x76,0x6f,0, - 0x69,0x6e,0x63,0x6c,0x75,0x73,0x6f,0, - 0x69,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0, - 0x69,0x6e,0x63,0x72,0x6f,0x63,0x69,0x6f,0, - 0x69,0x6e,0x63,0x75,0x62,0x6f,0, - 0x69,0x6e,0x64,0x61,0x67,0x69,0x6e,0x65,0, - 0x69,0x6e,0x64,0x69,0x61,0, - 0x69,0x6e,0x64,0x6f,0x6c,0x65,0, - 0x69,0x6e,0x65,0x64,0x69,0x74,0x6f,0, - 0x69,0x6e,0x66,0x61,0x74,0x74,0x69,0, - 0x69,0x6e,0x66,0x69,0x6c,0x61,0x72,0x65,0, - 0x69,0x6e,0x66,0x6c,0x69,0x74,0x74,0x6f,0, - 0x69,0x6e,0x67,0x61,0x67,0x67,0x69,0x6f,0, - 0x69,0x6e,0x67,0x65,0x67,0x6e,0x6f,0, - 0x69,0x6e,0x67,0x6c,0x65,0x73,0x65,0, - 0x69,0x6e,0x67,0x6f,0x72,0x64,0x6f,0, - 0x69,0x6e,0x67,0x72,0x6f,0x73,0x73,0x6f,0, - 0x69,0x6e,0x6e,0x65,0x73,0x63,0x6f,0, - 0x69,0x6e,0x6f,0x64,0x6f,0x72,0x65,0, - 0x69,0x6e,0x6f,0x6c,0x74,0x72,0x61,0x72,0x65,0, - 0x69,0x6e,0x6f,0x6e,0x64,0x61,0x74,0x6f,0, - 0x69,0x6e,0x73,0x61,0x6e,0x6f,0, - 0x69,0x6e,0x73,0x65,0x74,0x74,0x6f,0, - 0x69,0x6e,0x73,0x69,0x65,0x6d,0x65,0, - 0x69,0x6e,0x73,0x6f,0x6e,0x6e,0x69,0x61,0, - 0x69,0x6e,0x73,0x75,0x6c,0x69,0x6e,0x61,0, - 0x69,0x6e,0x74,0x61,0x73,0x61,0x74,0x6f,0, - 0x69,0x6e,0x74,0x65,0x72,0x6f,0, - 0x69,0x6e,0x74,0x6f,0x6e,0x61,0x63,0x6f,0, - 0x69,0x6e,0x74,0x75,0x69,0x74,0x6f,0, - 0x69,0x6e,0x75,0x6d,0x69,0x64,0x69,0x72,0x65,0, - 0x69,0x6e,0x76,0x61,0x6c,0x69,0x64,0x6f,0, - 0x69,0x6e,0x76,0x65,0x63,0x65,0, - 0x69,0x6e,0x76,0x69,0x74,0x6f,0, - 0x69,0x70,0x65,0x72,0x62,0x6f,0x6c,0x65,0, - 0x69,0x70,0x6e,0x6f,0x74,0x69,0x63,0x6f,0, - 0x69,0x70,0x6f,0x74,0x65,0x73,0x69,0, - 0x69,0x70,0x70,0x69,0x63,0x61,0, - 0x69,0x72,0x69,0x64,0x65,0, - 0x69,0x72,0x6c,0x61,0x6e,0x64,0x61,0, - 0x69,0x72,0x6f,0x6e,0x69,0x63,0x6f,0, - 0x69,0x72,0x72,0x69,0x67,0x61,0x74,0x6f,0, - 0x69,0x72,0x72,0x6f,0x72,0x61,0x72,0x65,0, - 0x69,0x73,0x6f,0x6c,0x61,0x74,0x6f,0, - 0x69,0x73,0x6f,0x74,0x6f,0x70,0x6f,0, - 0x69,0x73,0x74,0x65,0x72,0x69,0x63,0x6f,0, - 0x69,0x73,0x74,0x69,0x74,0x75,0x74,0x6f,0, - 0x69,0x73,0x74,0x72,0x69,0x63,0x65,0, - 0x69,0x74,0x61,0x6c,0x69,0x61,0, - 0x69,0x74,0x65,0x72,0x61,0x72,0x65,0, - 0x6c,0x61,0x62,0x62,0x72,0x6f,0, - 0x6c,0x61,0x62,0x69,0x72,0x69,0x6e,0x74,0x6f,0, - 0x6c,0x61,0x63,0x63,0x61,0, - 0x6c,0x61,0x63,0x65,0x72,0x61,0x74,0x6f,0, - 0x6c,0x61,0x63,0x72,0x69,0x6d,0x61,0, - 0x6c,0x61,0x63,0x75,0x6e,0x61,0, - 0x6c,0x61,0x64,0x64,0x6f,0x76,0x65,0, - 0x6c,0x61,0x67,0x6f,0, - 0x6c,0x61,0x6d,0x70,0x6f,0, - 0x6c,0x61,0x6e,0x63,0x65,0x74,0x74,0x61,0, - 0x6c,0x61,0x6e,0x74,0x65,0x72,0x6e,0x61,0, - 0x6c,0x61,0x72,0x64,0x6f,0x73,0x6f,0, - 0x6c,0x61,0x72,0x67,0x61,0, - 0x6c,0x61,0x72,0x69,0x6e,0x67,0x65,0, - 0x6c,0x61,0x73,0x74,0x72,0x61,0, - 0x6c,0x61,0x74,0x65,0x6e,0x7a,0x61,0, - 0x6c,0x61,0x74,0x69,0x6e,0x6f,0, - 0x6c,0x61,0x74,0x74,0x75,0x67,0x61,0, - 0x6c,0x61,0x76,0x61,0x67,0x6e,0x61,0, - 0x6c,0x61,0x76,0x6f,0x72,0x6f,0, - 0x6c,0x65,0x67,0x61,0x6c,0x65,0, - 0x6c,0x65,0x67,0x67,0x65,0x72,0x6f,0, - 0x6c,0x65,0x6d,0x62,0x6f,0, - 0x6c,0x65,0x6e,0x74,0x65,0x7a,0x7a,0x61,0, - 0x6c,0x65,0x6e,0x7a,0x61,0, - 0x6c,0x65,0x6f,0x6e,0x65,0, - 0x6c,0x65,0x70,0x72,0x65,0, - 0x6c,0x65,0x73,0x69,0x76,0x6f,0, - 0x6c,0x65,0x73,0x73,0x61,0x74,0x6f,0, - 0x6c,0x65,0x73,0x74,0x6f,0, - 0x6c,0x65,0x74,0x74,0x65,0x72,0x61,0x6c,0x65,0, - 0x6c,0x65,0x76,0x61,0, - 0x6c,0x65,0x76,0x69,0x67,0x61,0x74,0x6f,0, - 0x6c,0x69,0x62,0x65,0x72,0x6f,0, - 0x6c,0x69,0x64,0x6f,0, - 0x6c,0x69,0x65,0x76,0x69,0x74,0x6f,0, - 0x6c,0x69,0x6c,0x6c,0x61,0, - 0x6c,0x69,0x6d,0x61,0x74,0x75,0x72,0x61,0, - 0x6c,0x69,0x6d,0x69,0x74,0x61,0x72,0x65,0, - 0x6c,0x69,0x6d,0x70,0x69,0x64,0x6f,0, - 0x6c,0x69,0x6e,0x65,0x61,0x72,0x65,0, - 0x6c,0x69,0x6e,0x67,0x75,0x61,0, - 0x6c,0x69,0x71,0x75,0x69,0x64,0x6f,0, - 0x6c,0x69,0x72,0x61,0, - 0x6c,0x69,0x72,0x69,0x63,0x61,0, - 0x6c,0x69,0x73,0x63,0x61,0, - 0x6c,0x69,0x74,0x65,0, - 0x6c,0x69,0x74,0x69,0x67,0x69,0x6f,0, - 0x6c,0x69,0x76,0x72,0x65,0x61,0, - 0x6c,0x6f,0x63,0x61,0x6e,0x64,0x61,0, - 0x6c,0x6f,0x64,0x65,0, - 0x6c,0x6f,0x67,0x69,0x63,0x61,0, - 0x6c,0x6f,0x6d,0x62,0x61,0x72,0x65,0, - 0x6c,0x6f,0x6e,0x64,0x72,0x61,0, - 0x6c,0x6f,0x6e,0x67,0x65,0x76,0x6f,0, - 0x6c,0x6f,0x71,0x75,0x61,0x63,0x65,0, - 0x6c,0x6f,0x72,0x65,0x6e,0x7a,0x6f,0, - 0x6c,0x6f,0x74,0x6f,0, - 0x6c,0x6f,0x74,0x74,0x65,0x72,0x69,0x61,0, - 0x6c,0x75,0x63,0x65,0, - 0x6c,0x75,0x63,0x69,0x64,0x61,0x74,0x6f,0, - 0x6c,0x75,0x6d,0x61,0x63,0x61,0, - 0x6c,0x75,0x6d,0x69,0x6e,0x6f,0x73,0x6f,0, - 0x6c,0x75,0x6e,0x67,0x6f,0, - 0x6c,0x75,0x70,0x6f,0, - 0x6c,0x75,0x70,0x70,0x6f,0x6c,0x6f,0, - 0x6c,0x75,0x73,0x69,0x6e,0x67,0x61,0, - 0x6c,0x75,0x73,0x73,0x6f,0, - 0x6c,0x75,0x74,0x74,0x6f,0, - 0x6d,0x61,0x63,0x61,0x62,0x72,0x6f,0, - 0x6d,0x61,0x63,0x63,0x68,0x69,0x6e,0x61,0, - 0x6d,0x61,0x63,0x65,0x72,0x6f,0, - 0x6d,0x61,0x63,0x69,0x6e,0x61,0x74,0x6f,0, - 0x6d,0x61,0x64,0x61,0x6d,0x61,0, - 0x6d,0x61,0x67,0x69,0x63,0x6f,0, - 0x6d,0x61,0x67,0x6c,0x69,0x61,0, - 0x6d,0x61,0x67,0x6e,0x65,0x74,0x65,0, - 0x6d,0x61,0x67,0x72,0x6f,0, - 0x6d,0x61,0x69,0x6f,0x6c,0x69,0x63,0x61,0, - 0x6d,0x61,0x6c,0x61,0x66,0x65,0x64,0x65,0, - 0x6d,0x61,0x6c,0x67,0x72,0x61,0x64,0x6f,0, - 0x6d,0x61,0x6c,0x69,0x6e,0x74,0x65,0x73,0x6f,0, - 0x6d,0x61,0x6c,0x73,0x61,0x6e,0x6f,0, - 0x6d,0x61,0x6c,0x74,0x6f,0, - 0x6d,0x61,0x6c,0x75,0x6d,0x6f,0x72,0x65,0, - 0x6d,0x61,0x6e,0x61,0, - 0x6d,0x61,0x6e,0x63,0x69,0x61,0, - 0x6d,0x61,0x6e,0x64,0x6f,0x72,0x6c,0x61,0, - 0x6d,0x61,0x6e,0x67,0x69,0x61,0x72,0x65,0, - 0x6d,0x61,0x6e,0x69,0x66,0x65,0x73,0x74,0x6f,0, - 0x6d,0x61,0x6e,0x6e,0x61,0x72,0x6f,0, - 0x6d,0x61,0x6e,0x6f,0x76,0x72,0x61,0, - 0x6d,0x61,0x6e,0x73,0x61,0x72,0x64,0x61,0, - 0x6d,0x61,0x6e,0x74,0x69,0x64,0x65,0, - 0x6d,0x61,0x6e,0x75,0x62,0x72,0x69,0x6f,0, - 0x6d,0x61,0x70,0x70,0x61,0, - 0x6d,0x61,0x72,0x61,0x74,0x6f,0x6e,0x61,0, - 0x6d,0x61,0x72,0x63,0x69,0x72,0x65,0, - 0x6d,0x61,0x72,0x65,0x74,0x74,0x61,0, - 0x6d,0x61,0x72,0x6d,0x6f,0, - 0x6d,0x61,0x72,0x73,0x75,0x70,0x69,0x6f,0, - 0x6d,0x61,0x73,0x63,0x68,0x65,0x72,0x61,0, - 0x6d,0x61,0x73,0x73,0x61,0x69,0x61,0, - 0x6d,0x61,0x73,0x74,0x69,0x6e,0x6f,0, - 0x6d,0x61,0x74,0x65,0x72,0x61,0x73,0x73,0x6f,0, - 0x6d,0x61,0x74,0x72,0x69,0x63,0x6f,0x6c,0x61,0, - 0x6d,0x61,0x74,0x74,0x6f,0x6e,0x65,0, - 0x6d,0x61,0x74,0x75,0x72,0x6f,0, - 0x6d,0x61,0x7a,0x75,0x72,0x63,0x61,0, - 0x6d,0x65,0x61,0x6e,0x64,0x72,0x6f,0, - 0x6d,0x65,0x63,0x63,0x61,0x6e,0x69,0x63,0x6f,0, - 0x6d,0x65,0x63,0x65,0x6e,0x61,0x74,0x65,0, - 0x6d,0x65,0x64,0x65,0x73,0x69,0x6d,0x6f,0, - 0x6d,0x65,0x64,0x69,0x74,0x61,0x72,0x65,0, - 0x6d,0x65,0x67,0x61,0, - 0x6d,0x65,0x6c,0x61,0x73,0x73,0x61,0, - 0x6d,0x65,0x6c,0x69,0x73,0, - 0x6d,0x65,0x6c,0x6f,0x64,0x69,0x61,0, - 0x6d,0x65,0x6e,0x69,0x6e,0x67,0x65,0, - 0x6d,0x65,0x6e,0x6f,0, - 0x6d,0x65,0x6e,0x73,0x6f,0x6c,0x61,0, - 0x6d,0x65,0x72,0x63,0x75,0x72,0x69,0x6f,0, - 0x6d,0x65,0x72,0x65,0x6e,0x64,0x61,0, - 0x6d,0x65,0x72,0x6c,0x6f,0, - 0x6d,0x65,0x73,0x63,0x68,0x69,0x6e,0x6f,0, - 0x6d,0x65,0x73,0x65,0, - 0x6d,0x65,0x73,0x73,0x65,0x72,0x65,0, - 0x6d,0x65,0x73,0x74,0x6f,0x6c,0x6f,0, - 0x6d,0x65,0x74,0x61,0x6c,0x6c,0x6f,0, - 0x6d,0x65,0x74,0x6f,0x64,0x6f,0, - 0x6d,0x65,0x74,0x74,0x65,0x72,0x65,0, - 0x6d,0x69,0x61,0x67,0x6f,0x6c,0x61,0x72,0x65,0, - 0x6d,0x69,0x63,0x61,0, - 0x6d,0x69,0x63,0x65,0x6c,0x69,0x6f,0, - 0x6d,0x69,0x63,0x68,0x65,0x6c,0x65,0, - 0x6d,0x69,0x63,0x72,0x6f,0x62,0x6f,0, - 0x6d,0x69,0x64,0x6f,0x6c,0x6c,0x6f,0, - 0x6d,0x69,0x65,0x6c,0x65,0, - 0x6d,0x69,0x67,0x6c,0x69,0x6f,0x72,0x65,0, - 0x6d,0x69,0x6c,0x61,0x6e,0x6f,0, - 0x6d,0x69,0x6c,0x69,0x74,0x65,0, - 0x6d,0x69,0x6d,0x6f,0x73,0x61,0, - 0x6d,0x69,0x6e,0x65,0x72,0x61,0x6c,0x65,0, - 0x6d,0x69,0x6e,0x69,0, - 0x6d,0x69,0x6e,0x6f,0x72,0x65,0, - 0x6d,0x69,0x72,0x69,0x6e,0x6f,0, - 0x6d,0x69,0x72,0x74,0x69,0x6c,0x6c,0x6f,0, - 0x6d,0x69,0x73,0x63,0x65,0x6c,0x61,0, - 0x6d,0x69,0x73,0x73,0x69,0x76,0x61,0, - 0x6d,0x69,0x73,0x74,0x6f,0, - 0x6d,0x69,0x73,0x75,0x72,0x61,0x72,0x65,0, - 0x6d,0x69,0x74,0x65,0x7a,0x7a,0x61,0, - 0x6d,0x69,0x74,0x69,0x67,0x61,0x72,0x65,0, - 0x6d,0x69,0x74,0x72,0x61,0, - 0x6d,0x69,0x74,0x74,0x65,0x6e,0x74,0x65,0, - 0x6d,0x6e,0x65,0x6d,0x6f,0x6e,0x69,0x63,0x6f,0, - 0x6d,0x6f,0x64,0x65,0x6c,0x6c,0x6f,0, - 0x6d,0x6f,0x64,0x69,0x66,0x69,0x63,0x61,0, - 0x6d,0x6f,0x64,0x75,0x6c,0x6f,0, - 0x6d,0x6f,0x67,0x61,0x6e,0x6f,0, - 0x6d,0x6f,0x67,0x69,0x6f,0, - 0x6d,0x6f,0x6c,0x65,0, - 0x6d,0x6f,0x6c,0x6f,0x73,0x73,0x6f,0, - 0x6d,0x6f,0x6e,0x61,0x73,0x74,0x65,0x72,0x6f,0, - 0x6d,0x6f,0x6e,0x63,0x6f,0, - 0x6d,0x6f,0x6e,0x64,0x69,0x6e,0x61,0, - 0x6d,0x6f,0x6e,0x65,0x74,0x61,0x72,0x69,0x6f,0, - 0x6d,0x6f,0x6e,0x69,0x6c,0x65,0, - 0x6d,0x6f,0x6e,0x6f,0x74,0x6f,0x6e,0x6f,0, - 0x6d,0x6f,0x6e,0x73,0x6f,0x6e,0x65,0, - 0x6d,0x6f,0x6e,0x74,0x61,0x74,0x6f,0, - 0x6d,0x6f,0x6e,0x76,0x69,0x73,0x6f,0, - 0x6d,0x6f,0x72,0x61,0, - 0x6d,0x6f,0x72,0x64,0x65,0x72,0x65,0, - 0x6d,0x6f,0x72,0x73,0x69,0x63,0x61,0x74,0x6f,0, - 0x6d,0x6f,0x73,0x74,0x72,0x6f,0, - 0x6d,0x6f,0x74,0x69,0x76,0x61,0x74,0x6f,0, - 0x6d,0x6f,0x74,0x6f,0x73,0x65,0x67,0x61,0, - 0x6d,0x6f,0x74,0x74,0x6f,0, - 0x6d,0x6f,0x76,0x65,0x6e,0x7a,0x61,0, - 0x6d,0x6f,0x76,0x69,0x6d,0x65,0x6e,0x74,0x6f,0, - 0x6d,0x6f,0x7a,0x7a,0x6f,0, - 0x6d,0x75,0x63,0x63,0x61,0, - 0x6d,0x75,0x63,0x6f,0x73,0x61,0, - 0x6d,0x75,0x66,0x66,0x61,0, - 0x6d,0x75,0x67,0x68,0x65,0x74,0x74,0x6f,0, - 0x6d,0x75,0x67,0x6e,0x61,0x69,0x6f,0, - 0x6d,0x75,0x6c,0x61,0x74,0x74,0x6f,0, - 0x6d,0x75,0x6c,0x69,0x6e,0x65,0x6c,0x6c,0x6f,0, - 0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x6f,0, - 0x6d,0x75,0x6d,0x6d,0x69,0x61,0, - 0x6d,0x75,0x6e,0x74,0x6f,0, - 0x6d,0x75,0x6f,0x76,0x65,0x72,0x65,0, - 0x6d,0x75,0x72,0x61,0x6c,0x65,0, - 0x6d,0x75,0x73,0x61,0, - 0x6d,0x75,0x73,0x63,0x6f,0x6c,0x6f,0, - 0x6d,0x75,0x73,0x69,0x63,0x61,0, - 0x6d,0x75,0x74,0x65,0x76,0x6f,0x6c,0x65,0, - 0x6d,0x75,0x74,0x6f,0, - 0x6e,0x61,0x62,0x61,0x62,0x62,0x6f,0, - 0x6e,0x61,0x66,0x74,0x61,0, - 0x6e,0x61,0x6e,0x6f,0x6d,0x65,0x74,0x72,0x6f,0, - 0x6e,0x61,0x72,0x63,0x69,0x73,0x6f,0, - 0x6e,0x61,0x72,0x69,0x63,0x65,0, - 0x6e,0x61,0x72,0x72,0x61,0x74,0x6f,0, - 0x6e,0x61,0x73,0x63,0x65,0x72,0x65,0, - 0x6e,0x61,0x73,0x74,0x72,0x61,0x72,0x65,0, - 0x6e,0x61,0x74,0x75,0x72,0x61,0x6c,0x65,0, - 0x6e,0x61,0x75,0x74,0x69,0x63,0x61,0, - 0x6e,0x61,0x76,0x69,0x67,0x6c,0x69,0x6f,0, - 0x6e,0x65,0x62,0x75,0x6c,0x6f,0x73,0x61,0, - 0x6e,0x65,0x63,0x72,0x6f,0x73,0x69,0, - 0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x6f,0, - 0x6e,0x65,0x67,0x6f,0x7a,0x69,0x6f,0, - 0x6e,0x65,0x6d,0x6d,0x65,0x6e,0x6f,0, - 0x6e,0x65,0x6f,0x66,0x69,0x74,0x61,0, - 0x6e,0x65,0x72,0x65,0x74,0x74,0x6f,0, - 0x6e,0x65,0x72,0x76,0x6f,0, - 0x6e,0x65,0x73,0x73,0x75,0x6e,0x6f,0, - 0x6e,0x65,0x74,0x74,0x75,0x6e,0x6f,0, - 0x6e,0x65,0x75,0x74,0x72,0x61,0x6c,0x65,0, - 0x6e,0x65,0x76,0x65,0, - 0x6e,0x65,0x76,0x72,0x6f,0x74,0x69,0x63,0x6f,0, - 0x6e,0x69,0x63,0x63,0x68,0x69,0x61,0, - 0x6e,0x69,0x6e,0x66,0x61,0, - 0x6e,0x69,0x74,0x69,0x64,0x6f,0, - 0x6e,0x6f,0x62,0x69,0x6c,0x65,0, - 0x6e,0x6f,0x63,0x69,0x76,0x6f,0, - 0x6e,0x6f,0x64,0x6f,0, - 0x6e,0x6f,0x6d,0x65,0, - 0x6e,0x6f,0x6d,0x69,0x6e,0x61,0, - 0x6e,0x6f,0x72,0x64,0x69,0x63,0x6f,0, - 0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x65,0, - 0x6e,0x6f,0x72,0x76,0x65,0x67,0x65,0x73,0x65,0, - 0x6e,0x6f,0x73,0x74,0x72,0x61,0x6e,0x6f,0, - 0x6e,0x6f,0x74,0x61,0x72,0x65,0, - 0x6e,0x6f,0x74,0x69,0x7a,0x69,0x61,0, - 0x6e,0x6f,0x74,0x74,0x75,0x72,0x6e,0x6f,0, - 0x6e,0x6f,0x76,0x65,0x6c,0x6c,0x61,0, - 0x6e,0x75,0x63,0x6c,0x65,0x6f,0, - 0x6e,0x75,0x6c,0x6c,0x61,0, - 0x6e,0x75,0x6d,0x65,0x72,0x6f,0, - 0x6e,0x75,0x6f,0x76,0x6f,0, - 0x6e,0x75,0x74,0x72,0x69,0x72,0x65,0, - 0x6e,0x75,0x76,0x6f,0x6c,0x61,0, - 0x6e,0x75,0x7a,0x69,0x61,0x6c,0x65,0, - 0x6f,0x61,0x73,0x69,0, - 0x6f,0x62,0x62,0x65,0x64,0x69,0x72,0x65,0, - 0x6f,0x62,0x62,0x6c,0x69,0x67,0x6f,0, - 0x6f,0x62,0x65,0x6c,0x69,0x73,0x63,0x6f,0, - 0x6f,0x62,0x6c,0x69,0x6f,0, - 0x6f,0x62,0x6f,0x6c,0x6f,0, - 0x6f,0x62,0x73,0x6f,0x6c,0x65,0x74,0x6f,0, - 0x6f,0x63,0x63,0x61,0x73,0x69,0x6f,0x6e,0x65,0, - 0x6f,0x63,0x63,0x68,0x69,0x6f,0, - 0x6f,0x63,0x63,0x69,0x64,0x65,0x6e,0x74,0x65,0, - 0x6f,0x63,0x63,0x6f,0x72,0x72,0x65,0x72,0x65,0, - 0x6f,0x63,0x63,0x75,0x6c,0x74,0x61,0x72,0x65,0, - 0x6f,0x63,0x72,0x61,0, - 0x6f,0x63,0x75,0x6c,0x61,0x74,0x6f,0, - 0x6f,0x64,0x69,0x65,0x72,0x6e,0x6f,0, - 0x6f,0x64,0x6f,0x72,0x61,0x72,0x65,0, - 0x6f,0x66,0x66,0x65,0x72,0x74,0x61,0, - 0x6f,0x66,0x66,0x72,0x69,0x72,0x65,0, - 0x6f,0x66,0x66,0x75,0x73,0x63,0x61,0x74,0x6f,0, - 0x6f,0x67,0x67,0x65,0x74,0x74,0x6f,0, - 0x6f,0x67,0x67,0x69,0, - 0x6f,0x67,0x6e,0x75,0x6e,0x6f,0, - 0x6f,0x6c,0x61,0x6e,0x64,0x65,0x73,0x65,0, - 0x6f,0x6c,0x66,0x61,0x74,0x74,0x6f,0, - 0x6f,0x6c,0x69,0x61,0x74,0x6f,0, - 0x6f,0x6c,0x69,0x76,0x61,0, - 0x6f,0x6c,0x6f,0x67,0x72,0x61,0x6d,0x6d,0x61,0, - 0x6f,0x6c,0x74,0x72,0x65,0, - 0x6f,0x6d,0x61,0x67,0x67,0x69,0x6f,0, - 0x6f,0x6d,0x62,0x65,0x6c,0x69,0x63,0x6f,0, - 0x6f,0x6d,0x62,0x72,0x61,0, - 0x6f,0x6d,0x65,0x67,0x61,0, - 0x6f,0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0x65,0, - 0x6f,0x6e,0x64,0x6f,0x73,0x6f,0, - 0x6f,0x6e,0x65,0x72,0x65,0, - 0x6f,0x6e,0x69,0x63,0x65,0, - 0x6f,0x6e,0x6e,0x69,0x76,0x6f,0x72,0x6f,0, - 0x6f,0x6e,0x6f,0x72,0x65,0x76,0x6f,0x6c,0x65,0, - 0x6f,0x6e,0x74,0x61,0, - 0x6f,0x70,0x65,0x72,0x61,0x74,0x6f,0, - 0x6f,0x70,0x69,0x6e,0x69,0x6f,0x6e,0x65,0, - 0x6f,0x70,0x70,0x6f,0x73,0x74,0x6f,0, - 0x6f,0x72,0x61,0x63,0x6f,0x6c,0x6f,0, - 0x6f,0x72,0x61,0x66,0x6f,0, - 0x6f,0x72,0x64,0x69,0x6e,0x65,0, - 0x6f,0x72,0x65,0x63,0x63,0x68,0x69,0x6e,0x6f,0, - 0x6f,0x72,0x65,0x66,0x69,0x63,0x65,0, - 0x6f,0x72,0x66,0x61,0x6e,0x6f,0, - 0x6f,0x72,0x67,0x61,0x6e,0x69,0x63,0x6f,0, - 0x6f,0x72,0x69,0x67,0x69,0x6e,0x65,0, - 0x6f,0x72,0x69,0x7a,0x7a,0x6f,0x6e,0x74,0x65,0, - 0x6f,0x72,0x6d,0x61,0, - 0x6f,0x72,0x6d,0x65,0x67,0x67,0x69,0x6f,0, - 0x6f,0x72,0x6e,0x61,0x74,0x69,0x76,0x6f,0, - 0x6f,0x72,0x6f,0x6c,0x6f,0x67,0x69,0x6f,0, - 0x6f,0x72,0x72,0x65,0x6e,0x64,0x6f,0, - 0x6f,0x72,0x72,0x69,0x62,0x69,0x6c,0x65,0, - 0x6f,0x72,0x74,0x65,0x6e,0x73,0x69,0x61,0, - 0x6f,0x72,0x74,0x69,0x63,0x61,0, - 0x6f,0x72,0x7a,0x61,0x74,0x61,0, - 0x6f,0x72,0x7a,0x6f,0, - 0x6f,0x73,0x61,0x72,0x65,0, - 0x6f,0x73,0x63,0x75,0x72,0x61,0x72,0x65,0, - 0x6f,0x73,0x6d,0x6f,0x73,0x69,0, - 0x6f,0x73,0x70,0x65,0x64,0x61,0x6c,0x65,0, - 0x6f,0x73,0x70,0x69,0x74,0x65,0, - 0x6f,0x73,0x73,0x61,0, - 0x6f,0x73,0x73,0x69,0x64,0x61,0x72,0x65,0, - 0x6f,0x73,0x74,0x61,0x63,0x6f,0x6c,0x6f,0, - 0x6f,0x73,0x74,0x65,0, - 0x6f,0x74,0x69,0x74,0x65,0, - 0x6f,0x74,0x72,0x65,0, - 0x6f,0x74,0x74,0x61,0x67,0x6f,0x6e,0x6f,0, - 0x6f,0x74,0x74,0x69,0x6d,0x6f,0, - 0x6f,0x74,0x74,0x6f,0x62,0x72,0x65,0, - 0x6f,0x76,0x61,0x6c,0x65,0, - 0x6f,0x76,0x65,0x73,0x74,0, - 0x6f,0x76,0x69,0x6e,0x6f,0, - 0x6f,0x76,0x69,0x70,0x61,0x72,0x6f,0, - 0x6f,0x76,0x6f,0x63,0x69,0x74,0x6f,0, - 0x6f,0x76,0x75,0x6e,0x71,0x75,0x65,0, - 0x6f,0x76,0x76,0x69,0x61,0x72,0x65,0, - 0x6f,0x7a,0x69,0x6f,0, - 0x70,0x61,0x63,0x63,0x68,0x65,0x74,0x74,0x6f,0, - 0x70,0x61,0x63,0x65,0, - 0x70,0x61,0x63,0x69,0x66,0x69,0x63,0x6f,0, - 0x70,0x61,0x64,0x65,0x6c,0x6c,0x61,0, - 0x70,0x61,0x64,0x72,0x6f,0x6e,0x65,0, - 0x70,0x61,0x65,0x73,0x65,0, - 0x70,0x61,0x67,0x61,0, - 0x70,0x61,0x67,0x69,0x6e,0x61,0, - 0x70,0x61,0x6c,0x61,0x7a,0x7a,0x69,0x6e,0x61,0, - 0x70,0x61,0x6c,0x65,0x73,0x61,0x72,0x65,0, - 0x70,0x61,0x6c,0x6c,0x69,0x64,0x6f,0, - 0x70,0x61,0x6c,0x6f,0, - 0x70,0x61,0x6c,0x75,0x64,0x65,0, - 0x70,0x61,0x6e,0x64,0x6f,0x72,0x6f,0, - 0x70,0x61,0x6e,0x6e,0x65,0x6c,0x6c,0x6f,0, - 0x70,0x61,0x6f,0x6c,0x6f,0, - 0x70,0x61,0x6f,0x6e,0x61,0x7a,0x7a,0x6f,0, - 0x70,0x61,0x70,0x72,0x69,0x63,0x61,0, - 0x70,0x61,0x72,0x61,0x62,0x6f,0x6c,0x61,0, - 0x70,0x61,0x72,0x63,0x65,0x6c,0x6c,0x61,0, - 0x70,0x61,0x72,0x65,0x72,0x65,0, - 0x70,0x61,0x72,0x67,0x6f,0x6c,0x6f,0, - 0x70,0x61,0x72,0x69,0, - 0x70,0x61,0x72,0x6c,0x61,0x74,0x6f,0, - 0x70,0x61,0x72,0x6f,0x6c,0x61,0, - 0x70,0x61,0x72,0x74,0x69,0x72,0x65,0, - 0x70,0x61,0x72,0x76,0x65,0x6e,0x7a,0x61,0, - 0x70,0x61,0x72,0x7a,0x69,0x61,0x6c,0x65,0, - 0x70,0x61,0x73,0x73,0x69,0x76,0x6f,0, - 0x70,0x61,0x73,0x74,0x69,0x63,0x63,0x61,0, - 0x70,0x61,0x74,0x61,0x63,0x63,0x61,0, - 0x70,0x61,0x74,0x6f,0x6c,0x6f,0x67,0x69,0x61,0, - 0x70,0x61,0x74,0x74,0x75,0x6d,0x65,0, - 0x70,0x61,0x76,0x6f,0x6e,0x65,0, - 0x70,0x65,0x63,0x63,0x61,0x74,0x6f,0, - 0x70,0x65,0x64,0x61,0x6c,0x61,0x72,0x65,0, - 0x70,0x65,0x64,0x6f,0x6e,0x61,0x6c,0x65,0, - 0x70,0x65,0x67,0x67,0x69,0x6f,0, - 0x70,0x65,0x6c,0x6f,0x73,0x6f,0, - 0x70,0x65,0x6e,0x61,0x72,0x65,0, - 0x70,0x65,0x6e,0x64,0x69,0x63,0x65,0, - 0x70,0x65,0x6e,0x69,0x73,0x6f,0x6c,0x61,0, - 0x70,0x65,0x6e,0x6e,0x75,0x74,0x6f,0, - 0x70,0x65,0x6e,0x6f,0x6d,0x62,0x72,0x61,0, - 0x70,0x65,0x6e,0x73,0x61,0x72,0x65,0, - 0x70,0x65,0x6e,0x74,0x6f,0x6c,0x61,0, - 0x70,0x65,0x70,0x65,0, - 0x70,0x65,0x70,0x69,0x74,0x61,0, - 0x70,0x65,0x72,0x62,0x65,0x6e,0x65,0, - 0x70,0x65,0x72,0x63,0x6f,0x72,0x73,0x6f,0, - 0x70,0x65,0x72,0x64,0x6f,0x6e,0x61,0x74,0x6f,0, - 0x70,0x65,0x72,0x66,0x6f,0x72,0x61,0x72,0x65,0, - 0x70,0x65,0x72,0x67,0x61,0x6d,0x65,0x6e,0x61,0, - 0x70,0x65,0x72,0x69,0x6f,0x64,0x6f,0, - 0x70,0x65,0x72,0x6d,0x65,0x73,0x73,0x6f,0, - 0x70,0x65,0x72,0x6e,0x6f,0, - 0x70,0x65,0x72,0x70,0x6c,0x65,0x73,0x73,0x6f,0, - 0x70,0x65,0x72,0x73,0x75,0x61,0x73,0x6f,0, - 0x70,0x65,0x72,0x74,0x75,0x67,0x69,0x6f,0, - 0x70,0x65,0x72,0x76,0x61,0x73,0x6f,0, - 0x70,0x65,0x73,0x61,0x74,0x6f,0x72,0x65,0, - 0x70,0x65,0x73,0x69,0x73,0x74,0x61,0, - 0x70,0x65,0x73,0x6f,0, - 0x70,0x65,0x73,0x74,0x69,0x66,0x65,0x72,0x6f,0, - 0x70,0x65,0x74,0x61,0x6c,0x6f,0, - 0x70,0x65,0x74,0x74,0x69,0x6e,0x65,0, - 0x70,0x65,0x74,0x75,0x6c,0x61,0x6e,0x74,0x65,0, - 0x70,0x65,0x7a,0x7a,0x6f,0, - 0x70,0x69,0x61,0x63,0x65,0x72,0x65,0, - 0x70,0x69,0x61,0x6e,0x74,0x61,0, - 0x70,0x69,0x61,0x74,0x74,0x69,0x6e,0x6f,0, - 0x70,0x69,0x63,0x63,0x69,0x6e,0x6f,0, - 0x70,0x69,0x63,0x6f,0x7a,0x7a,0x61,0, - 0x70,0x69,0x65,0x67,0x61,0, - 0x70,0x69,0x65,0x74,0x72,0x61,0, - 0x70,0x69,0x66,0x66,0x65,0x72,0x6f,0, - 0x70,0x69,0x67,0x69,0x61,0x6d,0x61,0, - 0x70,0x69,0x67,0x6f,0x6c,0x69,0x6f,0, - 0x70,0x69,0x67,0x72,0x6f,0, - 0x70,0x69,0x6c,0x61,0, - 0x70,0x69,0x6c,0x69,0x66,0x65,0x72,0x6f,0, - 0x70,0x69,0x6c,0x6c,0x6f,0x6c,0x61,0, - 0x70,0x69,0x6c,0x6f,0x74,0x61,0, - 0x70,0x69,0x6d,0x70,0x61,0x6e,0x74,0x65,0, - 0x70,0x69,0x6e,0x65,0x74,0x61,0, - 0x70,0x69,0x6e,0x6e,0x61,0, - 0x70,0x69,0x6e,0x6f,0x6c,0x6f,0, - 0x70,0x69,0x6f,0x67,0x67,0x69,0x61,0, - 0x70,0x69,0x6f,0x6d,0x62,0x6f,0, - 0x70,0x69,0x72,0x61,0x6d,0x69,0x64,0x65,0, - 0x70,0x69,0x72,0x65,0x74,0x69,0x63,0x6f,0, - 0x70,0x69,0x72,0x69,0x74,0x65,0, - 0x70,0x69,0x72,0x6f,0x6c,0x69,0x73,0x69,0, - 0x70,0x69,0x74,0x6f,0x6e,0x65,0, - 0x70,0x69,0x7a,0x7a,0x69,0x63,0x6f,0, - 0x70,0x6c,0x61,0x63,0x65,0x62,0x6f,0, - 0x70,0x6c,0x61,0x6e,0x61,0x72,0x65,0, - 0x70,0x6c,0x61,0x73,0x6d,0x61,0, - 0x70,0x6c,0x61,0x74,0x61,0x6e,0x6f,0, - 0x70,0x6c,0x65,0x6e,0x61,0x72,0x69,0x6f,0, - 0x70,0x6f,0x63,0x68,0x65,0x7a,0x7a,0x61,0, - 0x70,0x6f,0x64,0x65,0x72,0x6f,0x73,0x6f,0, - 0x70,0x6f,0x64,0x69,0x73,0x6d,0x6f,0, - 0x70,0x6f,0x65,0x73,0x69,0x61,0, - 0x70,0x6f,0x67,0x67,0x69,0x61,0x72,0x65,0, - 0x70,0x6f,0x6c,0x65,0x6e,0x74,0x61,0, - 0x70,0x6f,0x6c,0x69,0x67,0x6f,0x6e,0x6f,0, - 0x70,0x6f,0x6c,0x6c,0x69,0x63,0x65,0, - 0x70,0x6f,0x6c,0x6d,0x6f,0x6e,0x69,0x74,0x65,0, - 0x70,0x6f,0x6c,0x70,0x65,0x74,0x74,0x61,0, - 0x70,0x6f,0x6c,0x73,0x6f,0, - 0x70,0x6f,0x6c,0x74,0x72,0x6f,0x6e,0x61,0, - 0x70,0x6f,0x6c,0x76,0x65,0x72,0x65,0, - 0x70,0x6f,0x6d,0x69,0x63,0x65,0, - 0x70,0x6f,0x6d,0x6f,0x64,0x6f,0x72,0x6f,0, - 0x70,0x6f,0x6e,0x74,0x65,0, - 0x70,0x6f,0x70,0x6f,0x6c,0x6f,0x73,0x6f,0, - 0x70,0x6f,0x72,0x66,0x69,0x64,0x6f,0, - 0x70,0x6f,0x72,0x6f,0x73,0x6f,0, - 0x70,0x6f,0x72,0x70,0x6f,0x72,0x61,0, - 0x70,0x6f,0x72,0x72,0x65,0, - 0x70,0x6f,0x72,0x74,0x61,0x74,0x61,0, - 0x70,0x6f,0x73,0x61,0, - 0x70,0x6f,0x73,0x69,0x74,0x69,0x76,0x6f,0, - 0x70,0x6f,0x73,0x73,0x65,0x73,0x73,0x6f,0, - 0x70,0x6f,0x73,0x74,0x75,0x6c,0x61,0x74,0x6f,0, - 0x70,0x6f,0x74,0x61,0x73,0x73,0x69,0x6f,0, - 0x70,0x6f,0x74,0x65,0x72,0x65,0, - 0x70,0x72,0x61,0x6e,0x7a,0x6f,0, - 0x70,0x72,0x61,0x73,0x73,0x69,0, - 0x70,0x72,0x61,0x74,0x69,0x63,0x61,0, - 0x70,0x72,0x65,0x63,0x6c,0x75,0x73,0x6f,0, - 0x70,0x72,0x65,0x64,0x69,0x63,0x61,0, - 0x70,0x72,0x65,0x66,0x69,0x73,0x73,0x6f,0, - 0x70,0x72,0x65,0x67,0x69,0x61,0x74,0x6f,0, - 0x70,0x72,0x65,0x6c,0x69,0x65,0x76,0x6f,0, - 0x70,0x72,0x65,0x6d,0x65,0x72,0x65,0, - 0x70,0x72,0x65,0x6e,0x6f,0x74,0x61,0x72,0x65,0, - 0x70,0x72,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0, - 0x70,0x72,0x65,0x73,0x65,0x6e,0x7a,0x61,0, - 0x70,0x72,0x65,0x74,0x65,0x73,0x74,0x6f,0, - 0x70,0x72,0x65,0x76,0x61,0x6c,0x73,0x6f,0, - 0x70,0x72,0x69,0x6d,0x61,0, - 0x70,0x72,0x69,0x6e,0x63,0x69,0x70,0x65,0, - 0x70,0x72,0x69,0x76,0x61,0x74,0x6f,0, - 0x70,0x72,0x6f,0x62,0x6c,0x65,0x6d,0x61,0, - 0x70,0x72,0x6f,0x63,0x75,0x72,0x61,0, - 0x70,0x72,0x6f,0x64,0x75,0x72,0x72,0x65,0, - 0x70,0x72,0x6f,0x66,0x75,0x6d,0x6f,0, - 0x70,0x72,0x6f,0x67,0x65,0x74,0x74,0x6f,0, - 0x70,0x72,0x6f,0x6c,0x75,0x6e,0x67,0x61,0, - 0x70,0x72,0x6f,0x6d,0x65,0x73,0x73,0x61,0, - 0x70,0x72,0x6f,0x6e,0x6f,0x6d,0x65,0, - 0x70,0x72,0x6f,0x70,0x6f,0x73,0x74,0x61,0, - 0x70,0x72,0x6f,0x72,0x6f,0x67,0x61,0, - 0x70,0x72,0x6f,0x74,0x65,0x73,0x6f,0, - 0x70,0x72,0x6f,0x76,0x61,0, - 0x70,0x72,0x75,0x64,0x65,0x6e,0x74,0x65,0, - 0x70,0x72,0x75,0x67,0x6e,0x61,0, - 0x70,0x72,0x75,0x72,0x69,0x74,0x6f,0, - 0x70,0x73,0x69,0x63,0x68,0x65,0, - 0x70,0x75,0x62,0x62,0x6c,0x69,0x63,0x6f,0, - 0x70,0x75,0x64,0x69,0x63,0x61,0, - 0x70,0x75,0x67,0x69,0x6c,0x61,0x74,0x6f,0, - 0x70,0x75,0x67,0x6e,0x6f,0, - 0x70,0x75,0x6c,0x63,0x65,0, - 0x70,0x75,0x6c,0x69,0x74,0x6f,0, - 0x70,0x75,0x6c,0x73,0x61,0x6e,0x74,0x65,0, - 0x70,0x75,0x6e,0x74,0x61,0x72,0x65,0, - 0x70,0x75,0x70,0x61,0x7a,0x7a,0x6f,0, - 0x70,0x75,0x70,0x69,0x6c,0x6c,0x61,0, - 0x70,0x75,0x72,0x6f,0, - 0x71,0x75,0x61,0x64,0x72,0x6f,0, - 0x71,0x75,0x61,0x6c,0x63,0x6f,0x73,0x61,0, - 0x71,0x75,0x61,0x73,0x69,0, - 0x71,0x75,0x65,0x72,0x65,0x6c,0x61,0, - 0x71,0x75,0x6f,0x74,0x61,0, - 0x72,0x61,0x63,0x63,0x6f,0x6c,0x74,0x6f,0, - 0x72,0x61,0x64,0x64,0x6f,0x70,0x70,0x69,0x6f,0, - 0x72,0x61,0x64,0x69,0x63,0x61,0x6c,0x65,0, - 0x72,0x61,0x64,0x75,0x6e,0x61,0x74,0x6f,0, - 0x72,0x61,0x66,0x66,0x69,0x63,0x61,0, - 0x72,0x61,0x67,0x61,0x7a,0x7a,0x6f,0, - 0x72,0x61,0x67,0x69,0x6f,0x6e,0x65,0, - 0x72,0x61,0x67,0x6e,0x6f,0, - 0x72,0x61,0x6d,0x61,0x72,0x72,0x6f,0, - 0x72,0x61,0x6d,0x69,0x6e,0x67,0x6f,0, - 0x72,0x61,0x6d,0x6f,0, - 0x72,0x61,0x6e,0x64,0x61,0x67,0x69,0x6f,0, - 0x72,0x61,0x6e,0x74,0x6f,0x6c,0x61,0x72,0x65,0, - 0x72,0x61,0x70,0x61,0x74,0x6f,0, - 0x72,0x61,0x70,0x69,0x6e,0x61,0, - 0x72,0x61,0x70,0x70,0x72,0x65,0x73,0x6f,0, - 0x72,0x61,0x73,0x61,0x74,0x75,0x72,0x61,0, - 0x72,0x61,0x73,0x63,0x68,0x69,0x61,0x74,0x6f,0, - 0x72,0x61,0x73,0x65,0x6e,0x74,0x65,0, - 0x72,0x61,0x73,0x73,0x65,0x67,0x6e,0x61,0, - 0x72,0x61,0x73,0x74,0x72,0x65,0x6c,0x6c,0x6f,0, - 0x72,0x61,0x74,0x61,0, - 0x72,0x61,0x76,0x76,0x65,0x64,0x75,0x74,0x6f,0, - 0x72,0x65,0x61,0x6c,0x65,0, - 0x72,0x65,0x63,0x65,0x70,0x69,0x72,0x65,0, - 0x72,0x65,0x63,0x69,0x6e,0x74,0x6f,0, - 0x72,0x65,0x63,0x6c,0x75,0x74,0x61,0, - 0x72,0x65,0x63,0x6f,0x6e,0x64,0x69,0x74,0x6f,0, - 0x72,0x65,0x63,0x75,0x70,0x65,0x72,0x6f,0, - 0x72,0x65,0x64,0x64,0x69,0x74,0x6f,0, - 0x72,0x65,0x64,0x69,0x6d,0x65,0x72,0x65,0, - 0x72,0x65,0x67,0x61,0x6c,0x61,0x74,0x6f,0, - 0x72,0x65,0x67,0x69,0x73,0x74,0x72,0x6f,0, - 0x72,0x65,0x67,0x6f,0x6c,0x61,0, - 0x72,0x65,0x67,0x72,0x65,0x73,0x73,0x6f,0, - 0x72,0x65,0x6c,0x61,0x7a,0x69,0x6f,0x6e,0x65,0, - 0x72,0x65,0x6d,0x61,0x72,0x65,0, - 0x72,0x65,0x6d,0x6f,0x74,0x6f,0, - 0x72,0x65,0x6e,0x6e,0x61,0, - 0x72,0x65,0x70,0x6c,0x69,0x63,0x61,0, - 0x72,0x65,0x70,0x72,0x69,0x6d,0x65,0x72,0x65,0, - 0x72,0x65,0x70,0x75,0x74,0x61,0x72,0x65,0, - 0x72,0x65,0x73,0x61,0, - 0x72,0x65,0x73,0x69,0x64,0x65,0x6e,0x74,0x65,0, - 0x72,0x65,0x73,0x70,0x6f,0x6e,0x73,0x6f,0, - 0x72,0x65,0x73,0x74,0x61,0x75,0x72,0x6f,0, - 0x72,0x65,0x74,0x65,0, - 0x72,0x65,0x74,0x69,0x6e,0x61,0, - 0x72,0x65,0x74,0x6f,0x72,0x69,0x63,0x61,0, - 0x72,0x65,0x74,0x74,0x69,0x66,0x69,0x63,0x61,0, - 0x72,0x65,0x76,0x6f,0x63,0x61,0x74,0x6f,0, - 0x72,0x69,0x61,0x73,0x73,0x75,0x6e,0x74,0x6f,0, - 0x72,0x69,0x62,0x61,0x64,0x69,0x72,0x65,0, - 0x72,0x69,0x62,0x65,0x6c,0x6c,0x65,0, - 0x72,0x69,0x62,0x72,0x65,0x7a,0x7a,0x6f,0, - 0x72,0x69,0x63,0x61,0x72,0x69,0x63,0x61,0, - 0x72,0x69,0x63,0x63,0x6f,0, - 0x72,0x69,0x63,0x65,0x76,0x65,0x72,0x65,0, - 0x72,0x69,0x63,0x69,0x63,0x6c,0x61,0x74,0x6f,0, - 0x72,0x69,0x63,0x6f,0x72,0x64,0x6f,0, - 0x72,0x69,0x63,0x72,0x65,0x64,0x75,0x74,0x6f,0, - 0x72,0x69,0x64,0x69,0x63,0x6f,0x6c,0x6f,0, - 0x72,0x69,0x64,0x75,0x72,0x72,0x65,0, - 0x72,0x69,0x66,0x61,0x73,0x61,0x72,0x65,0, - 0x72,0x69,0x66,0x6c,0x65,0x73,0x73,0x6f,0, - 0x72,0x69,0x66,0x6f,0x72,0x6d,0x61,0, - 0x72,0x69,0x66,0x75,0x67,0x69,0x6f,0, - 0x72,0x69,0x67,0x61,0x72,0x65,0, - 0x72,0x69,0x67,0x65,0x74,0x74,0x61,0x74,0x6f,0, - 0x72,0x69,0x67,0x68,0x65,0x6c,0x6c,0x6f,0, - 0x72,0x69,0x6c,0x61,0x73,0x73,0x61,0x74,0x6f,0, - 0x72,0x69,0x6c,0x65,0x76,0x61,0x74,0x6f,0, - 0x72,0x69,0x6d,0x61,0x6e,0x65,0x72,0x65,0, - 0x72,0x69,0x6d,0x62,0x61,0x6c,0x7a,0x6f,0, - 0x72,0x69,0x6d,0x65,0x64,0x69,0x6f,0, - 0x72,0x69,0x6d,0x6f,0x72,0x63,0x68,0x69,0x6f,0, - 0x72,0x69,0x6e,0x61,0x73,0x63,0x69,0x74,0x61,0, - 0x72,0x69,0x6e,0x63,0x61,0x72,0x6f,0, - 0x72,0x69,0x6e,0x66,0x6f,0x72,0x7a,0x6f,0, - 0x72,0x69,0x6e,0x6e,0x6f,0x76,0x6f,0, - 0x72,0x69,0x6e,0x6f,0x6d,0x61,0x74,0x6f,0, - 0x72,0x69,0x6e,0x73,0x61,0x76,0x69,0x74,0x6f,0, - 0x72,0x69,0x6e,0x74,0x6f,0x63,0x63,0x6f,0, - 0x72,0x69,0x6e,0x75,0x6e,0x63,0x69,0x61,0, - 0x72,0x69,0x6e,0x76,0x65,0x6e,0x69,0x72,0x65,0, - 0x72,0x69,0x70,0x61,0x72,0x61,0x74,0x6f,0, - 0x72,0x69,0x70,0x65,0x74,0x75,0x74,0x6f,0, - 0x72,0x69,0x70,0x69,0x65,0x6e,0x6f,0, - 0x72,0x69,0x70,0x6f,0x72,0x74,0x61,0x72,0x65,0, - 0x72,0x69,0x70,0x72,0x65,0x73,0x61,0, - 0x72,0x69,0x70,0x75,0x6c,0x69,0x72,0x65,0, - 0x72,0x69,0x73,0x61,0x74,0x61,0, - 0x72,0x69,0x73,0x63,0x68,0x69,0x6f,0, - 0x72,0x69,0x73,0x65,0x72,0x76,0x61,0, - 0x72,0x69,0x73,0x69,0x62,0x69,0x6c,0x65,0, - 0x72,0x69,0x73,0x6f,0, - 0x72,0x69,0x73,0x70,0x65,0x74,0x74,0x6f,0, - 0x72,0x69,0x73,0x74,0x6f,0x72,0x6f,0, - 0x72,0x69,0x73,0x75,0x6c,0x74,0x61,0x74,0x6f,0, - 0x72,0x69,0x73,0x76,0x6f,0x6c,0x74,0x6f,0, - 0x72,0x69,0x74,0x61,0x72,0x64,0x6f,0, - 0x72,0x69,0x74,0x65,0x67,0x6e,0x6f,0, - 0x72,0x69,0x74,0x6d,0x69,0x63,0x6f,0, - 0x72,0x69,0x74,0x72,0x6f,0x76,0x6f,0, - 0x72,0x69,0x75,0x6e,0x69,0x6f,0x6e,0x65,0, - 0x72,0x69,0x76,0x61,0, - 0x72,0x69,0x76,0x65,0x72,0x73,0x6f,0, - 0x72,0x69,0x76,0x69,0x6e,0x63,0x69,0x74,0x61,0, - 0x72,0x69,0x76,0x6f,0x6c,0x74,0x6f,0, - 0x72,0x69,0x7a,0x6f,0x6d,0x61,0, - 0x72,0x6f,0x62,0x61,0, - 0x72,0x6f,0x62,0x6f,0x74,0x69,0x63,0x6f,0, - 0x72,0x6f,0x62,0x75,0x73,0x74,0x6f,0, - 0x72,0x6f,0x63,0x63,0x69,0x61,0, - 0x72,0x6f,0x63,0x6f,0, - 0x72,0x6f,0x64,0x61,0x67,0x67,0x69,0x6f,0, - 0x72,0x6f,0x64,0x65,0x72,0x65,0, - 0x72,0x6f,0x64,0x69,0x74,0x6f,0x72,0x65,0, - 0x72,0x6f,0x67,0x69,0x74,0x6f,0, - 0x72,0x6f,0x6c,0x6c,0x69,0x6f,0, - 0x72,0x6f,0x6d,0x61,0x6e,0x74,0x69,0x63,0x6f,0, - 0x72,0x6f,0x6d,0x70,0x65,0x72,0x65,0, - 0x72,0x6f,0x6e,0x7a,0x69,0x6f,0, - 0x72,0x6f,0x73,0x6f,0x6c,0x61,0x72,0x65,0, - 0x72,0x6f,0x73,0x70,0x6f,0, - 0x72,0x6f,0x74,0x61,0x6e,0x74,0x65,0, - 0x72,0x6f,0x74,0x6f,0x6e,0x64,0x6f,0, - 0x72,0x6f,0x74,0x75,0x6c,0x61,0, - 0x72,0x6f,0x76,0x65,0x73,0x63,0x69,0x6f,0, - 0x72,0x75,0x62,0x69,0x7a,0x7a,0x6f,0, - 0x72,0x75,0x62,0x72,0x69,0x63,0x61,0, - 0x72,0x75,0x67,0x61,0, - 0x72,0x75,0x6c,0x6c,0x69,0x6e,0x6f,0, - 0x72,0x75,0x6d,0x69,0x6e,0x65,0, - 0x72,0x75,0x6d,0x6f,0x72,0x6f,0x73,0x6f,0, - 0x72,0x75,0x6f,0x6c,0x6f,0, - 0x72,0x75,0x70,0x65,0, - 0x72,0x75,0x73,0x73,0x61,0x72,0x65,0, - 0x72,0x75,0x73,0x74,0x69,0x63,0x6f,0, - 0x73,0x61,0x62,0x61,0x74,0x6f,0, - 0x73,0x61,0x62,0x62,0x69,0x61,0x72,0x65,0, - 0x73,0x61,0x62,0x6f,0x74,0x61,0x74,0x6f,0, - 0x73,0x61,0x67,0x6f,0x6d,0x61,0, - 0x73,0x61,0x6c,0x61,0x73,0x73,0x6f,0, - 0x73,0x61,0x6c,0x64,0x61,0x74,0x75,0x72,0x61,0, - 0x73,0x61,0x6c,0x67,0x65,0x6d,0x6d,0x61,0, - 0x73,0x61,0x6c,0x69,0x76,0x61,0x72,0x65,0, - 0x73,0x61,0x6c,0x6d,0x6f,0x6e,0x65,0, - 0x73,0x61,0x6c,0x6f,0x6e,0x65,0, - 0x73,0x61,0x6c,0x74,0x61,0x72,0x65,0, - 0x73,0x61,0x6c,0x75,0x74,0x6f,0, - 0x73,0x61,0x6c,0x76,0x6f,0, - 0x73,0x61,0x70,0x65,0x72,0x65,0, - 0x73,0x61,0x70,0x69,0x64,0x6f,0, - 0x73,0x61,0x70,0x6f,0x72,0x69,0x74,0x6f,0, - 0x73,0x61,0x72,0x61,0x63,0x65,0x6e,0x6f,0, - 0x73,0x61,0x72,0x63,0x61,0x73,0x6d,0x6f,0, - 0x73,0x61,0x72,0x74,0x6f,0, - 0x73,0x61,0x73,0x73,0x6f,0x73,0x6f,0, - 0x73,0x61,0x74,0x65,0x6c,0x6c,0x69,0x74,0x65,0, - 0x73,0x61,0x74,0x69,0x72,0x61,0, - 0x73,0x61,0x74,0x6f,0x6c,0x6c,0x6f,0, - 0x73,0x61,0x74,0x75,0x72,0x6e,0x6f,0, - 0x73,0x61,0x76,0x61,0x6e,0x61,0, - 0x73,0x61,0x76,0x69,0x6f,0, - 0x73,0x61,0x7a,0x69,0x61,0x74,0x6f,0, - 0x73,0x62,0x61,0x64,0x69,0x67,0x6c,0x69,0x6f,0, - 0x73,0x62,0x61,0x6c,0x7a,0x6f,0, - 0x73,0x62,0x61,0x6e,0x63,0x61,0x74,0x6f,0, - 0x73,0x62,0x61,0x72,0x72,0x61,0, - 0x73,0x62,0x61,0x74,0x74,0x65,0x72,0x65,0, - 0x73,0x62,0x61,0x76,0x61,0x72,0x65,0, - 0x73,0x62,0x65,0x6e,0x64,0x61,0x72,0x65,0, - 0x73,0x62,0x69,0x72,0x63,0x69,0x61,0x72,0x65,0, - 0x73,0x62,0x6c,0x6f,0x63,0x63,0x61,0x74,0x6f,0, - 0x73,0x62,0x6f,0x63,0x63,0x69,0x61,0x74,0x6f,0, - 0x73,0x62,0x72,0x69,0x6e,0x61,0x72,0x65,0, - 0x73,0x62,0x72,0x75,0x66,0x66,0x6f,0x6e,0x65,0, - 0x73,0x62,0x75,0x66,0x66,0x61,0x72,0x65,0, - 0x73,0x63,0x61,0x62,0x72,0x6f,0x73,0x6f,0, - 0x73,0x63,0x61,0x64,0x65,0x6e,0x7a,0x61,0, - 0x73,0x63,0x61,0x6c,0x61,0, - 0x73,0x63,0x61,0x6d,0x62,0x69,0x61,0x72,0x65,0, - 0x73,0x63,0x61,0x6e,0x64,0x61,0x6c,0x6f,0, - 0x73,0x63,0x61,0x70,0x6f,0x6c,0x61,0, - 0x73,0x63,0x61,0x72,0x73,0x6f,0, - 0x73,0x63,0x61,0x74,0x65,0x6e,0x61,0x72,0x65,0, - 0x73,0x63,0x61,0x76,0x61,0x74,0x6f,0, - 0x73,0x63,0x65,0x6c,0x74,0x6f,0, - 0x73,0x63,0x65,0x6e,0x69,0x63,0x6f,0, - 0x73,0x63,0x65,0x74,0x74,0x72,0x6f,0, - 0x73,0x63,0x68,0x65,0x64,0x61,0, - 0x73,0x63,0x68,0x69,0x65,0x6e,0x61,0, - 0x73,0x63,0x69,0x61,0x72,0x70,0x61,0, - 0x73,0x63,0x69,0x65,0x6e,0x7a,0x61,0, - 0x73,0x63,0x69,0x6e,0x64,0x65,0x72,0x65,0, - 0x73,0x63,0x69,0x70,0x70,0x6f,0, - 0x73,0x63,0x69,0x72,0x6f,0x70,0x70,0x6f,0, - 0x73,0x63,0x69,0x76,0x6f,0x6c,0x6f,0, - 0x73,0x63,0x6c,0x65,0x72,0x61,0x72,0x65,0, - 0x73,0x63,0x6f,0x64,0x65,0x6c,0x6c,0x61,0, - 0x73,0x63,0x6f,0x6c,0x70,0x69,0x74,0x6f,0, - 0x73,0x63,0x6f,0x6d,0x70,0x61,0x72,0x74,0x6f,0, - 0x73,0x63,0x6f,0x6e,0x66,0x6f,0x72,0x74,0x6f,0, - 0x73,0x63,0x6f,0x70,0x72,0x69,0x72,0x65,0, - 0x73,0x63,0x6f,0x72,0x74,0x61,0, - 0x73,0x63,0x6f,0x73,0x73,0x6f,0x6e,0x65,0, - 0x73,0x63,0x6f,0x7a,0x7a,0x65,0x73,0x65,0, - 0x73,0x63,0x72,0x69,0x62,0x61,0, - 0x73,0x63,0x72,0x6f,0x6c,0x6c,0x61,0x72,0x65,0, - 0x73,0x63,0x72,0x75,0x74,0x69,0x6e,0x69,0x6f,0, - 0x73,0x63,0x75,0x64,0x65,0x72,0x69,0x61,0, - 0x73,0x63,0x75,0x6c,0x74,0x6f,0x72,0x65,0, - 0x73,0x63,0x75,0x6f,0x6c,0x61,0, - 0x73,0x63,0x75,0x72,0x6f,0, - 0x73,0x63,0x75,0x73,0x61,0x72,0x65,0, - 0x73,0x64,0x65,0x62,0x69,0x74,0x61,0x72,0x65,0, - 0x73,0x64,0x6f,0x67,0x61,0x6e,0x61,0x72,0x65,0, - 0x73,0x65,0x63,0x63,0x61,0x74,0x75,0x72,0x61,0, - 0x73,0x65,0x63,0x6f,0x6e,0x64,0x6f,0, - 0x73,0x65,0x64,0x61,0x6e,0x6f,0, - 0x73,0x65,0x67,0x67,0x69,0x6f,0x6c,0x61,0, - 0x73,0x65,0x67,0x6e,0x61,0x6c,0x61,0x74,0x6f,0, - 0x73,0x65,0x67,0x72,0x65,0x67,0x61,0x74,0x6f,0, - 0x73,0x65,0x67,0x75,0x69,0x74,0x6f,0, - 0x73,0x65,0x6c,0x63,0x69,0x61,0x74,0x6f,0, - 0x73,0x65,0x6c,0x65,0x74,0x74,0x69,0x76,0x6f,0, - 0x73,0x65,0x6c,0x6c,0x61,0, - 0x73,0x65,0x6c,0x76,0x61,0x67,0x67,0x69,0x6f,0, - 0x73,0x65,0x6d,0x61,0x66,0x6f,0x72,0x6f,0, - 0x73,0x65,0x6d,0x62,0x72,0x61,0x72,0x65,0, - 0x73,0x65,0x6d,0x65,0, - 0x73,0x65,0x6d,0x69,0x6e,0x61,0x74,0x6f,0, - 0x73,0x65,0x6d,0x70,0x72,0x65,0, - 0x73,0x65,0x6e,0x73,0x6f,0, - 0x73,0x65,0x6e,0x74,0x69,0x72,0x65,0, - 0x73,0x65,0x70,0x6f,0x6c,0x74,0x6f,0, - 0x73,0x65,0x71,0x75,0x65,0x6e,0x7a,0x61,0, - 0x73,0x65,0x72,0x61,0x74,0x61,0, - 0x73,0x65,0x72,0x62,0x61,0x74,0x6f,0, - 0x73,0x65,0x72,0x65,0x6e,0x6f,0, - 0x73,0x65,0x72,0x69,0x6f,0, - 0x73,0x65,0x72,0x70,0x65,0x6e,0x74,0x65,0, - 0x73,0x65,0x72,0x72,0x61,0x67,0x6c,0x69,0x6f,0, - 0x73,0x65,0x72,0x76,0x69,0x72,0x65,0, - 0x73,0x65,0x73,0x74,0x69,0x6e,0x61,0, - 0x73,0x65,0x74,0x6f,0x6c,0x61,0, - 0x73,0x65,0x74,0x74,0x69,0x6d,0x61,0x6e,0x61,0, - 0x73,0x66,0x61,0x63,0x65,0x6c,0x6f,0, - 0x73,0x66,0x61,0x6c,0x64,0x61,0x72,0x65,0, - 0x73,0x66,0x61,0x6d,0x61,0x74,0x6f,0, - 0x73,0x66,0x61,0x72,0x7a,0x6f,0x73,0x6f,0, - 0x73,0x66,0x61,0x74,0x69,0x63,0x61,0x74,0x6f,0, - 0x73,0x66,0x65,0x72,0x61,0, - 0x73,0x66,0x69,0x64,0x61,0, - 0x73,0x66,0x69,0x6c,0x61,0x74,0x6f,0, - 0x73,0x66,0x69,0x6e,0x67,0x65,0, - 0x73,0x66,0x6f,0x63,0x61,0x74,0x6f,0, - 0x73,0x66,0x6f,0x64,0x65,0x72,0x61,0x72,0x65,0, - 0x73,0x66,0x6f,0x67,0x6f,0, - 0x73,0x66,0x6f,0x6c,0x74,0x69,0x72,0x65,0, - 0x73,0x66,0x6f,0x72,0x7a,0x61,0x74,0x6f,0, - 0x73,0x66,0x72,0x61,0x74,0x74,0x6f,0, - 0x73,0x66,0x72,0x75,0x74,0x74,0x61,0x74,0x6f,0, - 0x73,0x66,0x75,0x67,0x67,0x69,0x74,0x6f,0, - 0x73,0x66,0x75,0x6d,0x61,0x72,0x65,0, - 0x73,0x66,0x75,0x73,0x6f,0, - 0x73,0x67,0x61,0x62,0x65,0x6c,0x6c,0x6f,0, - 0x73,0x67,0x61,0x72,0x62,0x61,0x74,0x6f,0, - 0x73,0x67,0x6f,0x6e,0x66,0x69,0x61,0x72,0x65,0, - 0x73,0x67,0x6f,0x72,0x62,0x69,0x6f,0, - 0x73,0x67,0x72,0x61,0x73,0x73,0x61,0x74,0x6f,0, - 0x73,0x67,0x75,0x61,0x72,0x64,0x6f,0, - 0x73,0x69,0x62,0x69,0x6c,0x6f,0, - 0x73,0x69,0x63,0x63,0x6f,0x6d,0x65,0, - 0x73,0x69,0x65,0x72,0x72,0x61,0, - 0x73,0x69,0x67,0x6c,0x61,0, - 0x73,0x69,0x67,0x6e,0x6f,0x72,0x65,0, - 0x73,0x69,0x6c,0x65,0x6e,0x7a,0x69,0x6f,0, - 0x73,0x69,0x6c,0x6c,0x61,0x62,0x61,0, - 0x73,0x69,0x6d,0x62,0x6f,0x6c,0x6f,0, - 0x73,0x69,0x6d,0x70,0x61,0x74,0x69,0x63,0x6f,0, - 0x73,0x69,0x6d,0x75,0x6c,0x61,0x74,0x6f,0, - 0x73,0x69,0x6e,0x66,0x6f,0x6e,0x69,0x61,0, - 0x73,0x69,0x6e,0x67,0x6f,0x6c,0x6f,0, - 0x73,0x69,0x6e,0x69,0x73,0x74,0x72,0x6f,0, - 0x73,0x69,0x6e,0x6f,0, - 0x73,0x69,0x6e,0x74,0x65,0x73,0x69,0, - 0x73,0x69,0x6e,0x75,0x73,0x6f,0x69,0x64,0x65,0, - 0x73,0x69,0x70,0x61,0x72,0x69,0x6f,0, - 0x73,0x69,0x73,0x6d,0x61,0, - 0x73,0x69,0x73,0x74,0x6f,0x6c,0x65,0, - 0x73,0x69,0x74,0x75,0x61,0x74,0x6f,0, - 0x73,0x6c,0x69,0x74,0x74,0x61,0, - 0x73,0x6c,0x6f,0x67,0x61,0x74,0x75,0x72,0x61,0, - 0x73,0x6c,0x6f,0x76,0x65,0x6e,0x6f,0, - 0x73,0x6d,0x61,0x72,0x72,0x69,0x74,0x6f,0, - 0x73,0x6d,0x65,0x6d,0x6f,0x72,0x61,0x74,0x6f,0, - 0x73,0x6d,0x65,0x6e,0x74,0x69,0x74,0x6f,0, - 0x73,0x6d,0x65,0x72,0x61,0x6c,0x64,0x6f,0, - 0x73,0x6d,0x69,0x6c,0x7a,0x6f,0, - 0x73,0x6d,0x6f,0x6e,0x74,0x61,0x72,0x65,0, - 0x73,0x6d,0x6f,0x74,0x74,0x61,0x74,0x6f,0, - 0x73,0x6d,0x75,0x73,0x73,0x61,0x74,0x6f,0, - 0x73,0x6e,0x65,0x6c,0x6c,0x69,0x72,0x65,0, - 0x73,0x6e,0x65,0x72,0x76,0x61,0x74,0x6f,0, - 0x73,0x6e,0x6f,0x64,0x6f,0, - 0x73,0x6f,0x62,0x62,0x61,0x6c,0x7a,0x6f,0, - 0x73,0x6f,0x62,0x72,0x69,0x6f,0, - 0x73,0x6f,0x63,0x63,0x6f,0x72,0x73,0x6f,0, - 0x73,0x6f,0x63,0x69,0x61,0x6c,0x65,0, - 0x73,0x6f,0x64,0x61,0x6c,0x65,0, - 0x73,0x6f,0x66,0x66,0x69,0x74,0x74,0x6f,0, - 0x73,0x6f,0x67,0x6e,0x6f,0, - 0x73,0x6f,0x6c,0x64,0x61,0x74,0x6f,0, - 0x73,0x6f,0x6c,0x65,0x6e,0x6e,0x65,0, - 0x73,0x6f,0x6c,0x69,0x64,0x6f,0, - 0x73,0x6f,0x6c,0x6c,0x61,0x7a,0x7a,0x6f,0, - 0x73,0x6f,0x6c,0x6f,0, - 0x73,0x6f,0x6c,0x75,0x62,0x69,0x6c,0x65,0, - 0x73,0x6f,0x6c,0x76,0x65,0x6e,0x74,0x65,0, - 0x73,0x6f,0x6d,0x61,0x74,0x69,0x63,0x6f,0, - 0x73,0x6f,0x6d,0x6d,0x61,0, - 0x73,0x6f,0x6e,0x64,0x61,0, - 0x73,0x6f,0x6e,0x65,0x74,0x74,0x6f,0, - 0x73,0x6f,0x6e,0x6e,0x69,0x66,0x65,0x72,0x6f,0, - 0x73,0x6f,0x70,0x69,0x72,0x65,0, - 0x73,0x6f,0x70,0x70,0x65,0x73,0x6f,0, - 0x73,0x6f,0x70,0x72,0x61,0, - 0x73,0x6f,0x72,0x67,0x65,0x72,0x65,0, - 0x73,0x6f,0x72,0x70,0x61,0x73,0x73,0x6f,0, - 0x73,0x6f,0x72,0x72,0x69,0x73,0x6f,0, - 0x73,0x6f,0x72,0x73,0x6f,0, - 0x73,0x6f,0x72,0x74,0x65,0x67,0x67,0x69,0x6f,0, - 0x73,0x6f,0x72,0x76,0x6f,0x6c,0x61,0x74,0x6f,0, - 0x73,0x6f,0x73,0x70,0x69,0x72,0x6f,0, - 0x73,0x6f,0x73,0x74,0x61,0, - 0x73,0x6f,0x74,0x74,0x69,0x6c,0x65,0, - 0x73,0x70,0x61,0x64,0x61,0, - 0x73,0x70,0x61,0x6c,0x6c,0x61,0, - 0x73,0x70,0x61,0x72,0x67,0x65,0x72,0x65,0, - 0x73,0x70,0x61,0x74,0x6f,0x6c,0x61,0, - 0x73,0x70,0x61,0x76,0x65,0x6e,0x74,0x6f,0, - 0x73,0x70,0x61,0x7a,0x7a,0x6f,0x6c,0x61,0, - 0x73,0x70,0x65,0x63,0x69,0x65,0, - 0x73,0x70,0x65,0x64,0x69,0x72,0x65,0, - 0x73,0x70,0x65,0x67,0x6e,0x65,0x72,0x65,0, - 0x73,0x70,0x65,0x6c,0x61,0x74,0x75,0x72,0x61,0, - 0x73,0x70,0x65,0x72,0x61,0x6e,0x7a,0x61,0, - 0x73,0x70,0x65,0x73,0x73,0x6f,0x72,0x65,0, - 0x73,0x70,0x65,0x74,0x74,0x72,0x61,0x6c,0x65,0, - 0x73,0x70,0x65,0x7a,0x7a,0x61,0x74,0x6f,0, - 0x73,0x70,0x69,0x61,0, - 0x73,0x70,0x69,0x67,0x6f,0x6c,0x6f,0x73,0x6f,0, - 0x73,0x70,0x69,0x6c,0x6c,0x61,0x74,0x6f,0, - 0x73,0x70,0x69,0x6e,0x6f,0x73,0x6f,0, - 0x73,0x70,0x69,0x72,0x61,0x6c,0x65,0, - 0x73,0x70,0x6c,0x65,0x6e,0x64,0x69,0x64,0x6f,0, - 0x73,0x70,0x6f,0x72,0x74,0x69,0x76,0x6f,0, - 0x73,0x70,0x6f,0x73,0x6f,0, - 0x73,0x70,0x72,0x61,0x6e,0x67,0x61,0, - 0x73,0x70,0x72,0x65,0x63,0x61,0x72,0x65,0, - 0x73,0x70,0x72,0x6f,0x6e,0x61,0x74,0x6f,0, - 0x73,0x70,0x72,0x75,0x7a,0x7a,0x6f,0, - 0x73,0x70,0x75,0x6e,0x74,0x69,0x6e,0x6f,0, - 0x73,0x71,0x75,0x69,0x6c,0x6c,0x6f,0, - 0x73,0x72,0x61,0x64,0x69,0x63,0x61,0x72,0x65,0, - 0x73,0x72,0x6f,0x74,0x6f,0x6c,0x61,0x74,0x6f,0, - 0x73,0x74,0x61,0x62,0x69,0x6c,0x65,0, - 0x73,0x74,0x61,0x63,0x63,0x6f,0, - 0x73,0x74,0x61,0x66,0x66,0x61,0, - 0x73,0x74,0x61,0x67,0x6e,0x61,0x72,0x65,0, - 0x73,0x74,0x61,0x6d,0x70,0x61,0x74,0x6f,0, - 0x73,0x74,0x61,0x6e,0x74,0x69,0x6f,0, - 0x73,0x74,0x61,0x72,0x6e,0x75,0x74,0x6f,0, - 0x73,0x74,0x61,0x73,0x65,0x72,0x61,0, - 0x73,0x74,0x61,0x74,0x75,0x74,0x6f,0, - 0x73,0x74,0x65,0x6c,0x6f,0, - 0x73,0x74,0x65,0x70,0x70,0x61,0, - 0x73,0x74,0x65,0x72,0x7a,0x6f,0, - 0x73,0x74,0x69,0x6c,0x65,0x74,0x74,0x6f,0, - 0x73,0x74,0x69,0x6d,0x61,0, - 0x73,0x74,0x69,0x72,0x70,0x65,0, - 0x73,0x74,0x69,0x76,0x61,0x6c,0x65,0, - 0x73,0x74,0x69,0x7a,0x7a,0x6f,0x73,0x6f,0, - 0x73,0x74,0x6f,0x6e,0x61,0x74,0x6f,0, - 0x73,0x74,0x6f,0x72,0x69,0x63,0x6f,0, - 0x73,0x74,0x72,0x61,0x70,0x70,0x6f,0, - 0x73,0x74,0x72,0x65,0x67,0x61,0x74,0x6f,0, - 0x73,0x74,0x72,0x69,0x64,0x75,0x6c,0x6f,0, - 0x73,0x74,0x72,0x6f,0x7a,0x7a,0x61,0x72,0x65,0, - 0x73,0x74,0x72,0x75,0x74,0x74,0x6f,0, - 0x73,0x74,0x75,0x63,0x63,0x61,0x72,0x65,0, - 0x73,0x74,0x75,0x66,0x6f,0, - 0x73,0x74,0x75,0x70,0x65,0x6e,0x64,0x6f,0, - 0x73,0x75,0x62,0x65,0x6e,0x74,0x72,0x6f,0, - 0x73,0x75,0x63,0x63,0x6f,0x73,0x6f,0, - 0x73,0x75,0x64,0x6f,0x72,0x65,0, - 0x73,0x75,0x67,0x67,0x65,0x72,0x69,0x74,0x6f,0, - 0x73,0x75,0x67,0x6f,0, - 0x73,0x75,0x6c,0x74,0x61,0x6e,0x6f,0, - 0x73,0x75,0x6f,0x6e,0x61,0x72,0x65,0, - 0x73,0x75,0x70,0x65,0x72,0x62,0x6f,0, - 0x73,0x75,0x70,0x70,0x6f,0x72,0x74,0x6f,0, - 0x73,0x75,0x72,0x67,0x65,0x6c,0x61,0x74,0x6f,0, - 0x73,0x75,0x72,0x72,0x6f,0x67,0x61,0x74,0x6f,0, - 0x73,0x75,0x73,0x73,0x75,0x72,0x72,0x6f,0, - 0x73,0x75,0x74,0x75,0x72,0x61,0, - 0x73,0x76,0x61,0x67,0x61,0x72,0x65,0, - 0x73,0x76,0x65,0x64,0x65,0x73,0x65,0, - 0x73,0x76,0x65,0x67,0x6c,0x69,0x6f,0, - 0x73,0x76,0x65,0x6c,0x61,0x72,0x65,0, - 0x73,0x76,0x65,0x6e,0x75,0x74,0x6f,0, - 0x73,0x76,0x65,0x7a,0x69,0x61,0, - 0x73,0x76,0x69,0x6c,0x75,0x70,0x70,0x6f,0, - 0x73,0x76,0x69,0x73,0x74,0x61,0, - 0x73,0x76,0x69,0x7a,0x7a,0x65,0x72,0x61,0, - 0x73,0x76,0x6f,0x6c,0x74,0x61,0, - 0x73,0x76,0x75,0x6f,0x74,0x61,0x72,0x65,0, - 0x74,0x61,0x62,0x61,0x63,0x63,0x6f,0, - 0x74,0x61,0x62,0x75,0x6c,0x61,0x74,0x6f,0, - 0x74,0x61,0x63,0x63,0x69,0x61,0x72,0x65,0, - 0x74,0x61,0x63,0x69,0x74,0x75,0x72,0x6e,0x6f,0, - 0x74,0x61,0x6c,0x65,0, - 0x74,0x61,0x6c,0x69,0x73,0x6d,0x61,0x6e,0x6f,0, - 0x74,0x61,0x6d,0x70,0x6f,0x6e,0x65,0, - 0x74,0x61,0x6e,0x6e,0x69,0x6e,0x6f,0, - 0x74,0x61,0x72,0x61,0, - 0x74,0x61,0x72,0x64,0x69,0x76,0x6f,0, - 0x74,0x61,0x72,0x67,0x61,0x74,0x6f,0, - 0x74,0x61,0x72,0x69,0x66,0x66,0x61,0, - 0x74,0x61,0x72,0x70,0x61,0x72,0x65,0, - 0x74,0x61,0x72,0x74,0x61,0x72,0x75,0x67,0x61,0, - 0x74,0x61,0x73,0x74,0x6f,0, - 0x74,0x61,0x74,0x74,0x69,0x63,0x6f,0, - 0x74,0x61,0x76,0x65,0x72,0x6e,0x61,0, - 0x74,0x61,0x76,0x6f,0x6c,0x61,0x74,0x61,0, - 0x74,0x61,0x7a,0x7a,0x61,0, - 0x74,0x65,0x63,0x61,0, - 0x74,0x65,0x63,0x6e,0x69,0x63,0x6f,0, - 0x74,0x65,0x6c,0x65,0x66,0x6f,0x6e,0x6f,0, - 0x74,0x65,0x6d,0x65,0x72,0x61,0x72,0x69,0x6f,0, - 0x74,0x65,0x6d,0x70,0x6f,0, - 0x74,0x65,0x6d,0x75,0x74,0x6f,0, - 0x74,0x65,0x6e,0x64,0x6f,0x6e,0x65,0, - 0x74,0x65,0x6e,0x65,0x72,0x6f,0, - 0x74,0x65,0x6e,0x73,0x69,0x6f,0x6e,0x65,0, - 0x74,0x65,0x6e,0x74,0x61,0x63,0x6f,0x6c,0x6f,0, - 0x74,0x65,0x6f,0x72,0x65,0x6d,0x61,0, - 0x74,0x65,0x72,0x6d,0x65,0, - 0x74,0x65,0x72,0x72,0x61,0x7a,0x7a,0x6f,0, - 0x74,0x65,0x72,0x7a,0x65,0x74,0x74,0x6f,0, - 0x74,0x65,0x73,0x69,0, - 0x74,0x65,0x73,0x73,0x65,0x72,0x61,0x74,0x6f,0, - 0x74,0x65,0x73,0x74,0x61,0x74,0x6f,0, - 0x74,0x65,0x74,0x72,0x6f,0, - 0x74,0x65,0x74,0x74,0x6f,0x69,0x61,0, - 0x74,0x69,0x66,0x61,0x72,0x65,0, - 0x74,0x69,0x67,0x65,0x6c,0x6c,0x61,0, - 0x74,0x69,0x6d,0x62,0x72,0x6f,0, - 0x74,0x69,0x6e,0x74,0x6f,0, - 0x74,0x69,0x70,0x69,0x63,0x6f,0, - 0x74,0x69,0x70,0x6f,0x67,0x72,0x61,0x66,0x6f,0, - 0x74,0x69,0x72,0x61,0x67,0x67,0x69,0x6f,0, - 0x74,0x69,0x72,0x6f,0, - 0x74,0x69,0x74,0x61,0x6e,0x69,0x6f,0, - 0x74,0x69,0x74,0x6f,0x6c,0x6f,0, - 0x74,0x69,0x74,0x75,0x62,0x61,0x6e,0x74,0x65,0, - 0x74,0x69,0x7a,0x69,0x6f,0, - 0x74,0x69,0x7a,0x7a,0x6f,0x6e,0x65,0, - 0x74,0x6f,0x63,0x63,0x61,0x72,0x65,0, - 0x74,0x6f,0x6c,0x6c,0x65,0x72,0x61,0x72,0x65,0, - 0x74,0x6f,0x6c,0x74,0x6f,0, - 0x74,0x6f,0x6d,0x62,0x6f,0x6c,0x61,0, - 0x74,0x6f,0x6d,0x6f,0, - 0x74,0x6f,0x6e,0x66,0x6f,0, - 0x74,0x6f,0x6e,0x73,0x69,0x6c,0x6c,0x61,0, - 0x74,0x6f,0x70,0x61,0x7a,0x69,0x6f,0, - 0x74,0x6f,0x70,0x6f,0x6c,0x6f,0x67,0x69,0x61,0, - 0x74,0x6f,0x70,0x70,0x61,0, - 0x74,0x6f,0x72,0x62,0x61,0, - 0x74,0x6f,0x72,0x6e,0x61,0x72,0x65,0, - 0x74,0x6f,0x72,0x72,0x6f,0x6e,0x65,0, - 0x74,0x6f,0x72,0x74,0x6f,0x72,0x61,0, - 0x74,0x6f,0x73,0x63,0x61,0x6e,0x6f,0, - 0x74,0x6f,0x73,0x73,0x69,0x72,0x65,0, - 0x74,0x6f,0x73,0x74,0x61,0x74,0x75,0x72,0x61,0, - 0x74,0x6f,0x74,0x61,0x6e,0x6f,0, - 0x74,0x72,0x61,0x62,0x6f,0x63,0x63,0x6f,0, - 0x74,0x72,0x61,0x63,0x68,0x65,0x61,0, - 0x74,0x72,0x61,0x66,0x69,0x6c,0x61,0, - 0x74,0x72,0x61,0x67,0x65,0x64,0x69,0x61,0, - 0x74,0x72,0x61,0x6c,0x63,0x69,0x6f,0, - 0x74,0x72,0x61,0x6d,0x6f,0x6e,0x74,0x6f,0, - 0x74,0x72,0x61,0x6e,0x73,0x69,0x74,0x6f,0, - 0x74,0x72,0x61,0x70,0x61,0x6e,0x6f,0, - 0x74,0x72,0x61,0x72,0x72,0x65,0, - 0x74,0x72,0x61,0x73,0x6c,0x6f,0x63,0x6f,0, - 0x74,0x72,0x61,0x74,0x74,0x61,0x74,0x6f,0, - 0x74,0x72,0x61,0x76,0x65,0, - 0x74,0x72,0x65,0x63,0x63,0x69,0x61,0, - 0x74,0x72,0x65,0x6d,0x6f,0x6c,0x69,0x6f,0, - 0x74,0x72,0x65,0x73,0x70,0x6f,0x6c,0x6f,0, - 0x74,0x72,0x69,0x62,0x75,0x74,0x6f,0, - 0x74,0x72,0x69,0x63,0x68,0x65,0x63,0x6f,0, - 0x74,0x72,0x69,0x66,0x6f,0x67,0x6c,0x69,0x6f,0, - 0x74,0x72,0x69,0x6c,0x6c,0x6f,0, - 0x74,0x72,0x69,0x6e,0x63,0x65,0x61,0, - 0x74,0x72,0x69,0x6f,0, - 0x74,0x72,0x69,0x73,0x74,0x65,0x7a,0x7a,0x61,0, - 0x74,0x72,0x69,0x74,0x75,0x72,0x61,0x74,0x6f,0, - 0x74,0x72,0x69,0x76,0x65,0x6c,0x6c,0x61,0, - 0x74,0x72,0x6f,0x6d,0x62,0x61,0, - 0x74,0x72,0x6f,0x6e,0x6f,0, - 0x74,0x72,0x6f,0x70,0x70,0x6f,0, - 0x74,0x72,0x6f,0x74,0x74,0x6f,0x6c,0x61,0, - 0x74,0x72,0x6f,0x76,0x61,0x72,0x65,0, - 0x74,0x72,0x75,0x63,0x63,0x61,0x74,0x6f,0, - 0x74,0x75,0x62,0x61,0x74,0x75,0x72,0x61,0, - 0x74,0x75,0x66,0x66,0x61,0x74,0x6f,0, - 0x74,0x75,0x6c,0x69,0x70,0x61,0x6e,0x6f,0, - 0x74,0x75,0x6d,0x75,0x6c,0x74,0x6f,0, - 0x74,0x75,0x6e,0x69,0x73,0x69,0x61,0, - 0x74,0x75,0x72,0x62,0x61,0x72,0x65,0, - 0x74,0x75,0x72,0x63,0x68,0x69,0x6e,0x6f,0, - 0x74,0x75,0x74,0x61,0, - 0x74,0x75,0x74,0x65,0x6c,0x61,0, - 0x75,0x62,0x69,0x63,0x61,0x74,0x6f,0, - 0x75,0x63,0x63,0x65,0x6c,0x6c,0x6f,0, - 0x75,0x63,0x63,0x69,0x73,0x6f,0x72,0x65,0, - 0x75,0x64,0x69,0x72,0x65,0, - 0x75,0x64,0x69,0x74,0x69,0x76,0x6f,0, - 0x75,0x66,0x66,0x61,0, - 0x75,0x66,0x66,0x69,0x63,0x69,0x6f,0, - 0x75,0x67,0x75,0x61,0x6c,0x65,0, - 0x75,0x6c,0x69,0x73,0x73,0x65,0, - 0x75,0x6c,0x74,0x69,0x6d,0x61,0x74,0x6f,0, - 0x75,0x6d,0x61,0x6e,0x6f,0, - 0x75,0x6d,0x69,0x6c,0x65,0, - 0x75,0x6d,0x6f,0x72,0x69,0x73,0x6d,0x6f,0, - 0x75,0x6e,0x63,0x69,0x6e,0x65,0x74,0x74,0x6f,0, - 0x75,0x6e,0x67,0x65,0x72,0x65,0, - 0x75,0x6e,0x67,0x68,0x65,0x72,0x65,0x73,0x65,0, - 0x75,0x6e,0x69,0x63,0x6f,0x72,0x6e,0x6f,0, - 0x75,0x6e,0x69,0x66,0x69,0x63,0x61,0x74,0x6f,0, - 0x75,0x6e,0x69,0x73,0x6f,0x6e,0x6f,0, - 0x75,0x6e,0x69,0x74,0x61,0x72,0x69,0x6f,0, - 0x75,0x6e,0x74,0x65,0, - 0x75,0x6f,0x76,0x6f,0, - 0x75,0x70,0x75,0x70,0x61,0, - 0x75,0x72,0x61,0x67,0x61,0x6e,0x6f,0, - 0x75,0x72,0x67,0x65,0x6e,0x7a,0x61,0, - 0x75,0x72,0x6c,0x6f,0, - 0x75,0x73,0x61,0x6e,0x7a,0x61,0, - 0x75,0x73,0x61,0x74,0x6f,0, - 0x75,0x73,0x63,0x69,0x74,0x6f,0, - 0x75,0x73,0x69,0x67,0x6e,0x6f,0x6c,0x6f,0, - 0x75,0x73,0x75,0x72,0x61,0x69,0x6f,0, - 0x75,0x74,0x65,0x6e,0x73,0x69,0x6c,0x65,0, - 0x75,0x74,0x69,0x6c,0x69,0x7a,0x7a,0x6f,0, - 0x75,0x74,0x6f,0x70,0x69,0x61,0, - 0x76,0x61,0x63,0x61,0x6e,0x74,0x65,0, - 0x76,0x61,0x63,0x63,0x69,0x6e,0x61,0x74,0x6f,0, - 0x76,0x61,0x67,0x61,0x62,0x6f,0x6e,0x64,0x6f,0, - 0x76,0x61,0x67,0x6c,0x69,0x61,0x74,0x6f,0, - 0x76,0x61,0x6c,0x61,0x6e,0x67,0x61,0, - 0x76,0x61,0x6c,0x67,0x6f,0, - 0x76,0x61,0x6c,0x69,0x63,0x6f,0, - 0x76,0x61,0x6c,0x6c,0x65,0x74,0x74,0x61,0, - 0x76,0x61,0x6c,0x6f,0x72,0x6f,0x73,0x6f,0, - 0x76,0x61,0x6c,0x75,0x74,0x61,0x72,0x65,0, - 0x76,0x61,0x6c,0x76,0x6f,0x6c,0x61,0, - 0x76,0x61,0x6d,0x70,0x61,0x74,0x61,0, - 0x76,0x61,0x6e,0x67,0x61,0x72,0x65,0, - 0x76,0x61,0x6e,0x69,0x74,0x6f,0x73,0x6f,0, - 0x76,0x61,0x6e,0x6f,0, - 0x76,0x61,0x6e,0x74,0x61,0x67,0x67,0x69,0x6f,0, - 0x76,0x61,0x6e,0x76,0x65,0x72,0x61,0, - 0x76,0x61,0x70,0x6f,0x72,0x65,0, - 0x76,0x61,0x72,0x61,0x6e,0x6f,0, - 0x76,0x61,0x72,0x63,0x61,0x74,0x6f,0, - 0x76,0x61,0x72,0x69,0x61,0x6e,0x74,0x65,0, - 0x76,0x61,0x73,0x63,0x61,0, - 0x76,0x65,0x64,0x65,0x74,0x74,0x61,0, - 0x76,0x65,0x64,0x6f,0x76,0x61,0, - 0x76,0x65,0x64,0x75,0x74,0x6f,0, - 0x76,0x65,0x67,0x65,0x74,0x61,0x6c,0x65,0, - 0x76,0x65,0x69,0x63,0x6f,0x6c,0x6f,0, - 0x76,0x65,0x6c,0x63,0x72,0x6f,0, - 0x76,0x65,0x6c,0x69,0x6e,0x61,0, - 0x76,0x65,0x6c,0x6c,0x75,0x74,0x6f,0, - 0x76,0x65,0x6c,0x6f,0x63,0x65,0, - 0x76,0x65,0x6e,0x61,0x74,0x6f,0, - 0x76,0x65,0x6e,0x64,0x65,0x6d,0x6d,0x69,0x61,0, - 0x76,0x65,0x6e,0x74,0x6f,0, - 0x76,0x65,0x72,0x61,0x63,0x65,0, - 0x76,0x65,0x72,0x62,0x61,0x6c,0x65,0, - 0x76,0x65,0x72,0x67,0x6f,0x67,0x6e,0x61,0, - 0x76,0x65,0x72,0x69,0x66,0x69,0x63,0x61,0, - 0x76,0x65,0x72,0x6f,0, - 0x76,0x65,0x72,0x72,0x75,0x63,0x61,0, - 0x76,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x65,0, - 0x76,0x65,0x73,0x63,0x69,0x63,0x61,0, - 0x76,0x65,0x73,0x73,0x69,0x6c,0x6c,0x6f,0, - 0x76,0x65,0x73,0x74,0x61,0x6c,0x65,0, - 0x76,0x65,0x74,0x65,0x72,0x61,0x6e,0x6f,0, - 0x76,0x65,0x74,0x72,0x69,0x6e,0x61,0, - 0x76,0x65,0x74,0x75,0x73,0x74,0x6f,0, - 0x76,0x69,0x61,0x6e,0x64,0x61,0x6e,0x74,0x65,0, - 0x76,0x69,0x62,0x72,0x61,0x6e,0x74,0x65,0, - 0x76,0x69,0x63,0x65,0x6e,0x64,0x61,0, - 0x76,0x69,0x63,0x68,0x69,0x6e,0x67,0x6f,0, - 0x76,0x69,0x63,0x69,0x6e,0x61,0x6e,0x7a,0x61,0, - 0x76,0x69,0x64,0x69,0x6d,0x61,0x72,0x65,0, - 0x76,0x69,0x67,0x69,0x6c,0x69,0x61,0, - 0x76,0x69,0x67,0x6e,0x65,0x74,0x6f,0, - 0x76,0x69,0x67,0x6f,0x72,0x65,0, - 0x76,0x69,0x6c,0x65,0, - 0x76,0x69,0x6c,0x6c,0x61,0x6e,0x6f,0, - 0x76,0x69,0x6d,0x69,0x6e,0x69,0, - 0x76,0x69,0x6e,0x63,0x69,0x74,0x6f,0x72,0x65,0, - 0x76,0x69,0x6f,0x6c,0x61,0, - 0x76,0x69,0x70,0x65,0x72,0x61,0, - 0x76,0x69,0x72,0x67,0x6f,0x6c,0x61,0, - 0x76,0x69,0x72,0x6f,0x6c,0x6f,0x67,0x6f,0, - 0x76,0x69,0x72,0x75,0x6c,0x65,0x6e,0x74,0x6f,0, - 0x76,0x69,0x73,0x63,0x6f,0x73,0x6f,0, - 0x76,0x69,0x73,0x69,0x6f,0x6e,0x65,0, - 0x76,0x69,0x73,0x70,0x6f,0, - 0x76,0x69,0x73,0x73,0x75,0x74,0x6f,0, - 0x76,0x69,0x73,0x75,0x72,0x61,0, - 0x76,0x69,0x74,0x61,0, - 0x76,0x69,0x74,0x65,0x6c,0x6c,0x6f,0, - 0x76,0x69,0x74,0x74,0x69,0x6d,0x61,0, - 0x76,0x69,0x76,0x61,0x6e,0x64,0x61,0, - 0x76,0x69,0x76,0x69,0x64,0x6f,0, - 0x76,0x69,0x7a,0x69,0x61,0x72,0x65,0, - 0x76,0x6f,0x63,0x65,0, - 0x76,0x6f,0x67,0x61,0, - 0x76,0x6f,0x6c,0x61,0x74,0x69,0x6c,0x65,0, - 0x76,0x6f,0x6c,0x65,0x72,0x65,0, - 0x76,0x6f,0x6c,0x70,0x65,0, - 0x76,0x6f,0x72,0x61,0x67,0x69,0x6e,0x65,0, - 0x76,0x75,0x6c,0x63,0x61,0x6e,0x6f,0, - 0x7a,0x61,0x6d,0x70,0x6f,0x67,0x6e,0x61,0, - 0x7a,0x61,0x6e,0x6e,0x61,0, - 0x7a,0x61,0x70,0x70,0x61,0x74,0x6f,0, - 0x7a,0x61,0x74,0x74,0x65,0x72,0x61,0, - 0x7a,0x61,0x76,0x6f,0x72,0x72,0x61,0, - 0x7a,0x65,0x66,0x69,0x72,0x6f,0, - 0x7a,0x65,0x6c,0x61,0x6e,0x74,0x65,0, - 0x7a,0x65,0x6c,0x6f,0, - 0x7a,0x65,0x6e,0x7a,0x65,0x72,0x6f,0, - 0x7a,0x65,0x72,0x62,0x69,0x6e,0x6f,0, - 0x7a,0x69,0x62,0x65,0x74,0x74,0x6f,0, - 0x7a,0x69,0x6e,0x63,0x6f,0, - 0x7a,0x69,0x72,0x63,0x6f,0x6e,0x65,0, - 0x7a,0x69,0x74,0x74,0x6f,0, - 0x7a,0x6f,0x6c,0x6c,0x61,0, - 0x7a,0x6f,0x74,0x69,0x63,0x6f,0, - 0x7a,0x75,0x63,0x63,0x68,0x65,0x72,0x6f,0, - 0x7a,0x75,0x66,0x6f,0x6c,0x6f,0, - 0x7a,0x75,0x6c,0x75,0, - 0x7a,0x75,0x70,0x70,0x61,0, -}; -#define it ((const char*)it_) -static const char *it_i[] = { - it+0, it+6, it+15, it+24, it+30, it+37, - it+45, it+54, it+63, it+72, it+80, it+89, - it+97, it+105, it+111, it+117, it+122, it+131, - it+140, it+146, it+153, it+162, it+169, it+178, - it+186, it+192, it+201, it+209, it+218, it+226, - it+234, it+243, it+252, it+258, it+267, it+273, - it+280, it+288, it+297, it+303, it+311, it+320, - it+329, it+338, it+345, it+354, it+360, it+368, - it+377, it+382, it+389, it+394, it+403, it+412, - it+417, it+425, it+433, it+439, it+448, it+457, - it+465, it+473, it+482, it+491, it+498, it+506, - it+513, it+522, it+531, it+539, it+548, it+556, - it+563, it+571, it+578, it+587, it+595, it+603, - it+610, it+618, it+624, it+632, it+641, it+647, - it+655, it+663, it+672, it+681, it+687, it+693, - it+702, it+710, it+719, it+728, it+737, it+746, - it+753, it+758, it+766, it+773, it+780, it+787, - it+794, it+801, it+810, it+818, it+824, it+833, - it+842, it+847, it+856, it+864, it+873, it+878, - it+886, it+895, it+901, it+910, it+919, it+928, - it+936, it+944, it+951, it+959, it+968, it+977, - it+986, it+994, it+1002, it+1009, it+1017, it+1026, - it+1033, it+1041, it+1049, it+1056, it+1063, it+1068, - it+1076, it+1083, it+1092, it+1100, it+1108, it+1117, - it+1122, it+1131, it+1139, it+1148, it+1156, it+1163, - it+1172, it+1180, it+1186, it+1192, it+1201, it+1207, - it+1216, it+1221, it+1230, it+1238, it+1243, it+1252, - it+1259, it+1268, it+1276, it+1284, it+1292, it+1298, - it+1305, it+1314, it+1322, it+1330, it+1338, it+1346, - it+1354, it+1362, it+1371, it+1379, it+1388, it+1394, - it+1403, it+1410, it+1420, it+1427, it+1433, it+1440, - it+1448, it+1455, it+1463, it+1470, it+1475, it+1483, - it+1492, it+1500, it+1506, it+1514, it+1520, it+1527, - it+1535, it+1543, it+1551, it+1559, it+1568, it+1576, - it+1582, it+1591, it+1599, it+1607, it+1616, it+1622, - it+1630, it+1638, it+1644, it+1649, it+1656, it+1662, - it+1668, it+1675, it+1681, it+1687, it+1696, it+1704, - it+1712, it+1717, it+1725, it+1730, it+1737, it+1742, - it+1749, it+1756, it+1761, it+1770, it+1776, it+1785, - it+1793, it+1800, it+1809, it+1818, it+1824, it+1833, - it+1841, it+1850, it+1858, it+1866, it+1875, it+1882, - it+1889, it+1897, it+1906, it+1912, it+1918, it+1927, - it+1935, it+1943, it+1951, it+1959, it+1965, it+1972, - it+1980, it+1989, it+1998, it+2005, it+2013, it+2023, - it+2032, it+2041, it+2047, it+2056, it+2063, it+2069, - it+2077, it+2082, it+2089, it+2097, it+2102, it+2108, - it+2114, it+2122, it+2131, it+2139, it+2145, it+2153, - it+2160, it+2169, it+2177, it+2185, it+2193, it+2199, - it+2207, it+2215, it+2224, it+2232, it+2240, it+2247, - it+2255, it+2262, it+2270, it+2275, it+2282, it+2290, - it+2298, it+2305, it+2313, it+2322, it+2331, it+2339, - it+2345, it+2353, it+2362, it+2371, it+2377, it+2385, - it+2394, it+2403, it+2413, it+2422, it+2430, it+2438, - it+2443, it+2451, it+2460, it+2468, it+2476, it+2483, - it+2491, it+2497, it+2505, it+2514, it+2522, it+2529, - it+2537, it+2547, it+2552, it+2559, it+2569, it+2578, - it+2586, it+2592, it+2599, it+2608, it+2615, it+2621, - it+2626, it+2632, it+2639, it+2646, it+2655, it+2663, - it+2669, it+2678, it+2687, it+2692, it+2701, it+2709, - it+2715, it+2724, it+2733, it+2739, it+2747, it+2755, - it+2765, it+2772, it+2780, it+2787, it+2796, it+2804, - it+2810, it+2816, it+2824, it+2831, it+2840, it+2848, - it+2856, it+2864, it+2871, it+2879, it+2889, it+2895, - it+2900, it+2907, it+2916, it+2923, it+2932, it+2939, - it+2947, it+2956, it+2965, it+2975, it+2983, it+2992, - it+3002, it+3010, it+3019, it+3028, it+3036, it+3044, - it+3051, it+3061, it+3069, it+3077, it+3086, it+3094, - it+3102, it+3108, it+3116, it+3123, it+3131, it+3139, - it+3148, it+3156, it+3163, it+3171, it+3180, it+3187, - it+3195, it+3203, it+3212, it+3218, it+3226, it+3234, - it+3240, it+3248, it+3254, it+3262, it+3271, it+3280, - it+3287, it+3294, it+3301, it+3308, it+3316, it+3323, - it+3332, it+3340, it+3346, it+3354, it+3362, it+3367, - it+3373, it+3381, it+3390, it+3398, it+3406, it+3414, - it+3421, it+3429, it+3437, it+3445, it+3454, it+3461, - it+3469, it+3477, it+3485, it+3494, it+3503, it+3511, - it+3517, it+3526, it+3534, it+3542, it+3548, it+3556, - it+3565, it+3572, it+3581, it+3590, it+3599, it+3606, - it+3616, it+3624, it+3634, it+3643, it+3653, it+3660, - it+3669, it+3678, it+3685, it+3692, it+3700, it+3709, - it+3718, it+3726, it+3735, it+3744, it+3752, it+3760, - it+3767, it+3776, it+3781, it+3789, it+3796, it+3804, - it+3813, it+3821, it+3829, it+3838, it+3847, it+3856, - it+3861, it+3868, it+3876, it+3885, it+3894, it+3902, - it+3910, it+3919, it+3925, it+3931, it+3938, it+3947, - it+3956, it+3964, it+3969, it+3977, it+3982, it+3990, - it+3997, it+4005, it+4011, it+4018, it+4025, it+4034, - it+4041, it+4046, it+4052, it+4060, it+4069, it+4075, - it+4083, it+4088, it+4096, it+4105, it+4111, it+4119, - it+4125, it+4134, it+4142, it+4151, it+4156, it+4164, - it+4172, it+4182, it+4191, it+4200, it+4209, it+4216, - it+4224, it+4231, it+4237, it+4242, it+4247, it+4253, - it+4261, it+4269, it+4276, it+4282, it+4290, it+4299, - it+4308, it+4314, it+4323, it+4330, it+4338, it+4345, - it+4353, it+4361, it+4368, it+4376, it+4384, it+4393, - it+4401, it+4408, it+4417, it+4424, it+4429, it+4436, - it+4442, it+4450, it+4458, it+4467, it+4472, it+4480, - it+4488, it+4496, it+4502, it+4510, it+4519, it+4524, - it+4532, it+4541, it+4549, it+4558, it+4567, it+4573, - it+4581, it+4590, it+4596, it+4604, it+4613, it+4621, - it+4626, it+4633, it+4642, it+4650, it+4658, it+4667, - it+4675, it+4682, it+4690, it+4695, it+4704, it+4711, - it+4717, it+4726, it+4734, it+4742, it+4749, it+4758, - it+4767, it+4775, it+4781, it+4790, it+4797, it+4805, - it+4811, it+4820, it+4825, it+4834, it+4843, it+4851, - it+4858, it+4866, it+4874, it+4883, it+4888, it+4897, - it+4904, it+4911, it+4916, it+4923, it+4929, it+4936, - it+4944, it+4952, it+4961, it+4970, it+4976, it+4984, - it+4992, it+5000, it+5006, it+5012, it+5018, it+5026, - it+5031, it+5040, it+5045, it+5053, it+5062, it+5069, - it+5075, it+5083, it+5090, it+5096, it+5104, it+5113, - it+5119, it+5126, it+5134, it+5142, it+5149, it+5156, - it+5165, it+5172, it+5181, it+5188, it+5195, it+5204, - it+5212, it+5221, it+5230, it+5236, it+5244, it+5252, - it+5262, it+5270, it+5278, it+5286, it+5291, it+5300, - it+5308, it+5316, it+5322, it+5331, it+5337, it+5346, - it+5355, it+5365, it+5373, it+5380, it+5386, it+5395, - it+5402, it+5410, it+5417, it+5426, it+5433, it+5442, - it+5450, it+5456, it+5464, it+5472, it+5479, it+5484, - it+5493, it+5499, it+5505, it+5513, it+5520, it+5525, - it+5532, it+5541, it+5547, it+5555, it+5563, it+5571, - it+5579, it+5585, it+5594, it+5600, it+5609, it+5617, - it+5626, it+5634, it+5643, it+5649, it+5656, it+5663, - it+5672, it+5677, it+5686, it+5692, it+5700, it+5708, - it+5713, it+5722, it+5730, it+5739, it+5745, it+5754, - it+5763, it+5769, it+5776, it+5782, it+5790, it+5798, - it+5807, it+5814, it+5820, it+5827, it+5834, it+5842, - it+5851, it+5859, it+5866, it+5874, it+5882, it+5888, - it+5894, it+5899, it+5906, it+5914, it+5921, it+5927, - it+5935, it+5943, it+5949, it+5957, it+5964, it+5971, - it+5980, it+5988, it+5995, it+6001, it+6008, it+6016, - it+6023, it+6030, it+6037, it+6044, it+6053, it+6059, - it+6066, it+6075, it+6080, it+6088, it+6097, it+6103, - it+6112, it+6120, it+6126, it+6131, it+6138, it+6147, - it+6154, it+6161, it+6170, it+6176, it+6183, it+6192, - it+6201, it+6209, it+6218, it+6226, it+6233, it+6240, - it+6248, it+6257, it+6265, it+6272, it+6280, it+6288, - it+6297, it+6305, it+6314, it+6323, it+6331, it+6340, - it+6348, it+6357, it+6365, it+6374, it+6383, it+6390, - it+6399, it+6405, it+6412, it+6420, it+6428, it+6437, - it+6446, it+6455, it+6463, it+6471, it+6479, it+6488, - it+6496, it+6504, it+6514, it+6523, it+6530, it+6538, - it+6546, it+6555, it+6564, it+6573, it+6580, it+6589, - it+6597, it+6607, it+6616, it+6623, it+6630, it+6639, - it+6648, it+6656, it+6663, it+6669, it+6677, it+6685, - it+6694, it+6703, it+6711, it+6719, it+6728, it+6737, - it+6745, it+6752, it+6760, it+6767, it+6777, it+6783, - it+6792, it+6800, it+6807, it+6815, it+6820, it+6826, - it+6835, it+6844, it+6852, it+6858, it+6866, it+6873, - it+6881, it+6888, it+6896, it+6904, it+6911, it+6918, - it+6926, it+6932, it+6941, it+6947, it+6953, it+6959, - it+6966, it+6974, it+6980, it+6990, it+6995, it+7004, - it+7011, it+7016, it+7024, it+7030, it+7039, it+7048, - it+7056, it+7064, it+7071, it+7079, it+7084, it+7091, - it+7097, it+7102, it+7110, it+7117, it+7125, it+7130, - it+7137, it+7145, it+7152, it+7160, it+7168, it+7176, - it+7181, it+7190, it+7195, it+7204, it+7211, it+7220, - it+7226, it+7231, it+7239, it+7247, it+7253, it+7259, - it+7267, it+7276, it+7283, it+7292, it+7299, it+7306, - it+7313, it+7321, it+7327, it+7336, it+7345, it+7354, - it+7364, it+7372, it+7378, it+7387, it+7392, it+7399, - it+7408, it+7417, it+7427, it+7435, it+7443, it+7452, - it+7460, it+7469, it+7475, it+7484, it+7492, it+7500, - it+7506, it+7515, it+7524, it+7532, it+7540, it+7550, - it+7560, it+7568, it+7575, it+7583, it+7591, it+7601, - it+7610, it+7619, it+7628, it+7633, it+7641, it+7647, - it+7655, it+7663, it+7668, it+7676, it+7685, it+7693, - it+7699, it+7708, it+7713, it+7721, it+7729, it+7737, - it+7744, it+7752, it+7762, it+7767, it+7775, it+7783, - it+7791, it+7799, it+7805, it+7814, it+7821, it+7828, - it+7835, it+7844, it+7849, it+7856, it+7863, it+7872, - it+7880, it+7888, it+7894, it+7903, it+7911, it+7920, - it+7926, it+7935, it+7945, it+7953, it+7962, it+7969, - it+7976, it+7982, it+7987, it+7995, it+8005, it+8011, - it+8019, it+8029, it+8036, it+8045, it+8053, it+8061, - it+8069, it+8074, it+8082, it+8092, it+8099, it+8108, - it+8117, it+8123, it+8131, it+8141, it+8147, it+8153, - it+8160, it+8166, it+8175, it+8183, it+8191, it+8201, - it+8210, it+8217, it+8223, it+8231, it+8238, it+8243, - it+8251, it+8258, it+8267, it+8272, it+8280, it+8286, - it+8296, it+8304, it+8311, it+8319, it+8327, it+8336, - it+8345, it+8353, it+8362, it+8371, it+8379, it+8388, - it+8396, it+8404, it+8412, it+8420, it+8426, it+8434, - it+8442, it+8451, it+8456, it+8466, it+8474, it+8480, - it+8487, it+8494, it+8501, it+8506, it+8511, it+8518, - it+8526, it+8534, it+8544, it+8553, it+8560, it+8568, - it+8577, it+8585, it+8592, it+8598, it+8605, it+8611, - it+8619, it+8626, it+8634, it+8639, it+8648, it+8656, - it+8665, it+8671, it+8677, it+8686, it+8696, it+8703, - it+8713, it+8723, it+8733, it+8738, it+8746, it+8754, - it+8762, it+8770, it+8778, it+8788, it+8796, it+8801, - it+8808, it+8817, it+8825, it+8832, it+8838, it+8848, - it+8854, it+8862, it+8871, it+8877, it+8883, it+8893, - it+8900, it+8906, it+8912, it+8921, it+8931, it+8936, - it+8944, it+8953, it+8961, it+8969, it+8975, it+8982, - it+8992, it+9000, it+9007, it+9016, it+9024, it+9034, - it+9039, it+9048, it+9057, it+9066, it+9074, it+9083, - it+9092, it+9099, it+9106, it+9111, it+9117, it+9126, - it+9133, it+9142, it+9149, it+9154, it+9163, it+9172, - it+9177, it+9183, it+9188, it+9197, it+9204, it+9212, - it+9218, it+9224, it+9230, it+9238, it+9246, it+9254, - it+9262, it+9267, it+9277, it+9282, it+9291, it+9299, - it+9307, it+9313, it+9318, it+9325, it+9335, it+9344, - it+9352, it+9357, it+9364, it+9372, it+9381, it+9387, - it+9396, it+9404, it+9413, it+9422, it+9429, it+9437, - it+9442, it+9450, it+9457, it+9465, it+9474, it+9483, - it+9491, it+9500, it+9508, it+9518, it+9526, it+9533, - it+9541, it+9550, it+9559, it+9566, it+9573, it+9580, - it+9588, it+9597, it+9605, it+9614, it+9622, it+9630, - it+9635, it+9642, it+9650, it+9659, it+9669, it+9679, - it+9689, it+9697, it+9706, it+9712, it+9722, it+9731, - it+9740, it+9748, it+9757, it+9765, it+9770, it+9780, - it+9787, it+9795, it+9805, it+9811, it+9819, it+9826, - it+9835, it+9843, it+9851, it+9857, it+9864, it+9872, - it+9880, it+9888, it+9894, it+9899, it+9908, it+9916, - it+9923, it+9932, it+9939, it+9945, it+9952, it+9960, - it+9967, it+9976, it+9985, it+9992, it+10001, it+10008, - it+10016, it+10024, it+10032, it+10039, it+10047, it+10056, - it+10065, it+10074, it+10082, it+10089, it+10098, it+10106, - it+10115, it+10123, it+10133, it+10142, it+10148, it+10157, - it+10165, it+10172, it+10181, it+10187, it+10196, it+10204, - it+10211, it+10219, it+10225, it+10233, it+10238, it+10247, - it+10256, it+10266, it+10275, it+10282, it+10289, it+10296, - it+10304, it+10313, it+10321, it+10330, it+10339, it+10348, - it+10356, it+10366, it+10376, it+10385, it+10394, it+10403, - it+10409, it+10418, it+10426, it+10435, it+10443, it+10452, - it+10460, it+10469, it+10478, it+10487, it+10495, it+10504, - it+10512, it+10520, it+10526, it+10535, it+10542, it+10550, - it+10557, it+10566, it+10573, it+10582, it+10588, it+10594, - it+10601, it+10610, it+10618, it+10626, it+10634, it+10639, - it+10646, it+10655, it+10661, it+10669, it+10675, it+10684, - it+10694, it+10703, it+10712, it+10720, it+10728, it+10736, - it+10742, it+10750, it+10758, it+10763, it+10772, it+10782, - it+10789, it+10796, it+10805, it+10814, it+10824, it+10832, - it+10841, it+10851, it+10856, it+10866, it+10872, it+10881, - it+10889, it+10897, it+10907, it+10916, it+10924, it+10933, - it+10942, it+10951, it+10958, it+10967, it+10977, it+10984, - it+10991, it+10997, it+11005, it+11015, it+11024, it+11029, - it+11039, it+11048, it+11057, it+11062, it+11069, it+11078, - it+11088, it+11097, it+11107, it+11116, it+11124, it+11133, - it+11142, it+11148, it+11157, it+11167, it+11175, it+11185, - it+11194, it+11202, it+11211, it+11220, it+11228, it+11236, - it+11243, it+11253, it+11262, it+11272, it+11281, it+11290, - it+11299, it+11307, it+11317, it+11327, it+11335, it+11344, - it+11352, it+11361, it+11371, it+11380, it+11389, it+11399, - it+11408, it+11417, it+11425, it+11435, it+11443, it+11452, - it+11459, it+11467, it+11475, it+11484, it+11489, it+11498, - it+11506, it+11516, it+11525, it+11533, it+11541, it+11549, - it+11557, it+11566, it+11571, it+11579, it+11589, it+11597, - it+11604, it+11609, it+11618, it+11626, it+11633, it+11638, - it+11647, it+11654, it+11663, it+11670, it+11677, it+11687, - it+11695, it+11702, it+11711, it+11717, it+11725, it+11733, - it+11740, it+11749, it+11757, it+11765, it+11770, it+11778, - it+11785, it+11794, it+11800, it+11805, it+11813, it+11821, - it+11828, it+11837, it+11846, it+11853, it+11861, it+11871, - it+11880, it+11889, it+11897, it+11904, it+11912, it+11919, - it+11925, it+11932, it+11939, it+11948, it+11957, it+11966, - it+11972, it+11980, it+11990, it+11997, it+12005, it+12013, - it+12020, it+12026, it+12034, it+12044, it+12051, it+12060, - it+12067, it+12076, it+12084, it+12093, it+12103, it+12113, - it+12123, it+12132, it+12142, it+12151, it+12160, it+12169, - it+12175, it+12185, it+12194, it+12202, it+12209, it+12219, - it+12227, it+12234, it+12242, it+12250, it+12257, it+12265, - it+12273, it+12281, it+12290, it+12297, it+12306, it+12314, - it+12323, it+12332, it+12341, it+12351, it+12361, it+12370, - it+12377, it+12386, it+12395, it+12402, it+12412, it+12422, - it+12431, it+12440, it+12447, it+12453, it+12461, it+12471, - it+12481, it+12491, it+12499, it+12506, it+12515, it+12525, - it+12535, it+12543, it+12552, it+12562, it+12568, it+12578, - it+12587, it+12596, it+12601, it+12610, it+12617, it+12623, - it+12631, it+12639, it+12648, it+12655, it+12663, it+12670, - it+12676, it+12685, it+12695, it+12703, it+12711, it+12718, - it+12728, it+12736, it+12745, it+12753, it+12762, it+12772, - it+12778, it+12784, it+12792, it+12799, it+12807, it+12817, - it+12823, it+12832, it+12841, it+12849, it+12859, it+12868, - it+12876, it+12882, it+12891, it+12900, it+12910, it+12918, - it+12928, it+12936, it+12943, it+12951, it+12958, it+12964, - it+12972, it+12981, it+12989, it+12997, it+13007, it+13016, - it+13025, it+13033, it+13042, it+13047, it+13055, it+13065, - it+13073, it+13079, it+13087, it+13095, it+13102, it+13112, - it+13120, it+13129, it+13139, it+13148, it+13157, it+13164, - it+13173, it+13182, it+13191, it+13200, it+13209, it+13215, - it+13224, it+13231, it+13240, it+13248, it+13255, it+13264, - it+13270, it+13278, it+13286, it+13293, it+13302, it+13307, - it+13316, it+13325, it+13334, it+13340, it+13346, it+13354, - it+13364, it+13371, it+13379, it+13385, it+13393, it+13402, - it+13410, it+13416, it+13426, it+13436, it+13444, it+13450, - it+13458, it+13464, it+13471, it+13480, it+13488, it+13497, - it+13506, it+13513, it+13521, it+13530, it+13540, it+13549, - it+13558, it+13568, it+13577, it+13582, it+13592, it+13601, - it+13609, it+13617, it+13627, it+13636, it+13642, it+13650, - it+13659, it+13668, it+13676, it+13685, it+13693, it+13703, - it+13713, it+13721, it+13728, it+13735, it+13744, it+13753, - it+13761, it+13770, it+13778, it+13786, it+13792, it+13799, - it+13806, it+13815, it+13821, it+13828, it+13836, it+13845, - it+13853, it+13861, it+13869, it+13878, it+13887, it+13897, - it+13905, it+13914, it+13920, it+13929, it+13938, it+13946, - it+13953, it+13963, it+13968, it+13976, it+13984, it+13992, - it+14001, it+14011, it+14021, it+14030, it+14037, it+14045, - it+14053, it+14061, it+14069, it+14077, it+14084, it+14093, - it+14100, it+14109, it+14116, it+14125, it+14133, it+14142, - it+14151, it+14161, it+14166, it+14176, it+14184, it+14192, - it+14197, it+14205, it+14213, it+14221, it+14229, it+14239, - it+14245, it+14253, it+14261, it+14270, it+14276, it+14281, - it+14289, it+14298, it+14308, it+14314, it+14321, it+14329, - it+14336, it+14345, it+14355, it+14363, it+14369, it+14378, - it+14387, it+14392, it+14402, it+14410, it+14416, it+14424, - it+14431, it+14439, it+14446, it+14452, it+14459, it+14469, - it+14478, it+14483, it+14491, it+14498, it+14508, it+14514, - it+14522, it+14530, it+14540, it+14546, it+14554, it+14559, - it+14565, it+14574, it+14582, it+14592, it+14598, it+14604, - it+14612, it+14620, it+14628, it+14636, it+14644, it+14654, - it+14661, it+14670, it+14678, it+14686, it+14695, it+14703, - it+14712, it+14721, it+14729, it+14736, it+14745, it+14754, - it+14760, it+14768, it+14777, it+14786, it+14794, it+14803, - it+14813, it+14820, it+14828, it+14833, it+14843, it+14853, - it+14862, it+14869, it+14875, it+14882, it+14891, it+14899, - it+14908, it+14917, it+14925, it+14934, it+14942, it+14950, - it+14958, it+14967, it+14972, it+14979, it+14987, it+14995, - it+15004, it+15010, it+15018, it+15023, it+15031, it+15038, - it+15045, it+15054, it+15060, it+15066, it+15075, it+15085, - it+15092, it+15102, it+15111, it+15121, it+15129, it+15138, - it+15143, it+15148, it+15154, it+15162, it+15170, it+15175, - it+15182, it+15188, it+15195, it+15204, it+15212, it+15221, - it+15230, it+15237, it+15245, it+15255, it+15265, it+15274, - it+15282, it+15288, it+15295, it+15304, it+15313, it+15322, - it+15330, it+15338, it+15346, it+15355, it+15360, it+15370, - it+15378, it+15385, it+15392, it+15400, it+15409, it+15415, - it+15423, it+15430, it+15437, it+15446, it+15454, it+15461, - it+15468, it+15476, it+15483, it+15490, it+15500, it+15506, - it+15513, it+15521, it+15530, it+15539, it+15544, it+15552, - it+15562, it+15570, it+15579, it+15587, it+15596, it+15604, - it+15612, it+15622, it+15631, it+15639, it+15648, it+15658, - it+15667, it+15675, it+15683, it+15690, it+15695, it+15703, - it+15710, it+15720, it+15726, it+15733, it+15741, it+15750, - it+15760, it+15768, it+15776, it+15782, it+15790, it+15797, - it+15802, it+15810, it+15818, it+15826, it+15833, it+15841, - it+15846, it+15851, it+15860, it+15867, it+15873, it+15882, - it+15890, it+15899, it+15905, it+15913, it+15921, it+15929, - it+15936, it+15944, it+15949, it+15957, it+15965, it+15973, - it+15979, it+15987, it+15993, it+15999, it+16006, it+16015, - it+16022, it+16027, it+16033, - }; -#undef it - -static const struct words it_words = { - 2048, - 11, - true, - (const char *)it_, - 0, /* Constant string */ - it_i -}; diff --git a/external/libwally-core/src/data/wordlists/italian.txt b/external/libwally-core/src/data/wordlists/italian.txt deleted file mode 100644 index c47370f4e..000000000 --- a/external/libwally-core/src/data/wordlists/italian.txt +++ /dev/null @@ -1,2048 +0,0 @@ -abaco -abbaglio -abbinato -abete -abisso -abolire -abrasivo -abrogato -accadere -accenno -accusato -acetone -achille -acido -acqua -acre -acrilico -acrobata -acuto -adagio -addebito -addome -adeguato -aderire -adipe -adottare -adulare -affabile -affetto -affisso -affranto -aforisma -afoso -africano -agave -agente -agevole -aggancio -agire -agitare -agonismo -agricolo -agrumeto -aguzzo -alabarda -alato -albatro -alberato -albo -albume -alce -alcolico -alettone -alfa -algebra -aliante -alibi -alimento -allagato -allegro -allievo -allodola -allusivo -almeno -alogeno -alpaca -alpestre -altalena -alterno -alticcio -altrove -alunno -alveolo -alzare -amalgama -amanita -amarena -ambito -ambrato -ameba -america -ametista -amico -ammasso -ammenda -ammirare -ammonito -amore -ampio -ampliare -amuleto -anacardo -anagrafe -analista -anarchia -anatra -anca -ancella -ancora -andare -andrea -anello -angelo -angolare -angusto -anima -annegare -annidato -anno -annuncio -anonimo -anticipo -anzi -apatico -apertura -apode -apparire -appetito -appoggio -approdo -appunto -aprile -arabica -arachide -aragosta -araldica -arancio -aratura -arazzo -arbitro -archivio -ardito -arenile -argento -argine -arguto -aria -armonia -arnese -arredato -arringa -arrosto -arsenico -arso -artefice -arzillo -asciutto -ascolto -asepsi -asettico -asfalto -asino -asola -aspirato -aspro -assaggio -asse -assoluto -assurdo -asta -astenuto -astice -astratto -atavico -ateismo -atomico -atono -attesa -attivare -attorno -attrito -attuale -ausilio -austria -autista -autonomo -autunno -avanzato -avere -avvenire -avviso -avvolgere -azione -azoto -azzimo -azzurro -babele -baccano -bacino -baco -badessa -badilata -bagnato -baita -balcone -baldo -balena -ballata -balzano -bambino -bandire -baraonda -barbaro -barca -baritono -barlume -barocco -basilico -basso -batosta -battuto -baule -bava -bavosa -becco -beffa -belgio -belva -benda -benevole -benigno -benzina -bere -berlina -beta -bibita -bici -bidone -bifido -biga -bilancia -bimbo -binocolo -biologo -bipede -bipolare -birbante -birra -biscotto -bisesto -bisnonno -bisonte -bisturi -bizzarro -blando -blatta -bollito -bonifico -bordo -bosco -botanico -bottino -bozzolo -braccio -bradipo -brama -branca -bravura -bretella -brevetto -brezza -briglia -brillante -brindare -broccolo -brodo -bronzina -brullo -bruno -bubbone -buca -budino -buffone -buio -bulbo -buono -burlone -burrasca -bussola -busta -cadetto -caduco -calamaro -calcolo -calesse -calibro -calmo -caloria -cambusa -camerata -camicia -cammino -camola -campale -canapa -candela -cane -canino -canotto -cantina -capace -capello -capitolo -capogiro -cappero -capra -capsula -carapace -carcassa -cardo -carisma -carovana -carretto -cartolina -casaccio -cascata -caserma -caso -cassone -castello -casuale -catasta -catena -catrame -cauto -cavillo -cedibile -cedrata -cefalo -celebre -cellulare -cena -cenone -centesimo -ceramica -cercare -certo -cerume -cervello -cesoia -cespo -ceto -chela -chiaro -chicca -chiedere -chimera -china -chirurgo -chitarra -ciao -ciclismo -cifrare -cigno -cilindro -ciottolo -circa -cirrosi -citrico -cittadino -ciuffo -civetta -civile -classico -clinica -cloro -cocco -codardo -codice -coerente -cognome -collare -colmato -colore -colposo -coltivato -colza -coma -cometa -commando -comodo -computer -comune -conciso -condurre -conferma -congelare -coniuge -connesso -conoscere -consumo -continuo -convegno -coperto -copione -coppia -copricapo -corazza -cordata -coricato -cornice -corolla -corpo -corredo -corsia -cortese -cosmico -costante -cottura -covato -cratere -cravatta -creato -credere -cremoso -crescita -creta -criceto -crinale -crisi -critico -croce -cronaca -crostata -cruciale -crusca -cucire -cuculo -cugino -cullato -cupola -curatore -cursore -curvo -cuscino -custode -dado -daino -dalmata -damerino -daniela -dannoso -danzare -datato -davanti -davvero -debutto -decennio -deciso -declino -decollo -decreto -dedicato -definito -deforme -degno -delegare -delfino -delirio -delta -demenza -denotato -dentro -deposito -derapata -derivare -deroga -descritto -deserto -desiderio -desumere -detersivo -devoto -diametro -dicembre -diedro -difeso -diffuso -digerire -digitale -diluvio -dinamico -dinnanzi -dipinto -diploma -dipolo -diradare -dire -dirotto -dirupo -disagio -discreto -disfare -disgelo -disposto -distanza -disumano -dito -divano -divelto -dividere -divorato -doblone -docente -doganale -dogma -dolce -domato -domenica -dominare -dondolo -dono -dormire -dote -dottore -dovuto -dozzina -drago -druido -dubbio -dubitare -ducale -duna -duomo -duplice -duraturo -ebano -eccesso -ecco -eclissi -economia -edera -edicola -edile -editoria -educare -egemonia -egli -egoismo -egregio -elaborato -elargire -elegante -elencato -eletto -elevare -elfico -elica -elmo -elsa -eluso -emanato -emblema -emesso -emiro -emotivo -emozione -empirico -emulo -endemico -enduro -energia -enfasi -enoteca -entrare -enzima -epatite -epilogo -episodio -epocale -eppure -equatore -erario -erba -erboso -erede -eremita -erigere -ermetico -eroe -erosivo -errante -esagono -esame -esanime -esaudire -esca -esempio -esercito -esibito -esigente -esistere -esito -esofago -esortato -esoso -espanso -espresso -essenza -esso -esteso -estimare -estonia -estroso -esultare -etilico -etnico -etrusco -etto -euclideo -europa -evaso -evidenza -evitato -evoluto -evviva -fabbrica -faccenda -fachiro -falco -famiglia -fanale -fanfara -fango -fantasma -fare -farfalla -farinoso -farmaco -fascia -fastoso -fasullo -faticare -fato -favoloso -febbre -fecola -fede -fegato -felpa -feltro -femmina -fendere -fenomeno -fermento -ferro -fertile -fessura -festivo -fetta -feudo -fiaba -fiducia -fifa -figurato -filo -finanza -finestra -finire -fiore -fiscale -fisico -fiume -flacone -flamenco -flebo -flemma -florido -fluente -fluoro -fobico -focaccia -focoso -foderato -foglio -folata -folclore -folgore -fondente -fonetico -fonia -fontana -forbito -forchetta -foresta -formica -fornaio -foro -fortezza -forzare -fosfato -fosso -fracasso -frana -frassino -fratello -freccetta -frenata -fresco -frigo -frollino -fronde -frugale -frutta -fucilata -fucsia -fuggente -fulmine -fulvo -fumante -fumetto -fumoso -fune -funzione -fuoco -furbo -furgone -furore -fuso -futile -gabbiano -gaffe -galateo -gallina -galoppo -gambero -gamma -garanzia -garbo -garofano -garzone -gasdotto -gasolio -gastrico -gatto -gaudio -gazebo -gazzella -geco -gelatina -gelso -gemello -gemmato -gene -genitore -gennaio -genotipo -gergo -ghepardo -ghiaccio -ghisa -giallo -gilda -ginepro -giocare -gioiello -giorno -giove -girato -girone -gittata -giudizio -giurato -giusto -globulo -glutine -gnomo -gobba -golf -gomito -gommone -gonfio -gonna -governo -gracile -grado -grafico -grammo -grande -grattare -gravoso -grazia -greca -gregge -grifone -grigio -grinza -grotta -gruppo -guadagno -guaio -guanto -guardare -gufo -guidare -ibernato -icona -identico -idillio -idolo -idra -idrico -idrogeno -igiene -ignaro -ignorato -ilare -illeso -illogico -illudere -imballo -imbevuto -imbocco -imbuto -immane -immerso -immolato -impacco -impeto -impiego -importo -impronta -inalare -inarcare -inattivo -incanto -incendio -inchino -incisivo -incluso -incontro -incrocio -incubo -indagine -india -indole -inedito -infatti -infilare -inflitto -ingaggio -ingegno -inglese -ingordo -ingrosso -innesco -inodore -inoltrare -inondato -insano -insetto -insieme -insonnia -insulina -intasato -intero -intonaco -intuito -inumidire -invalido -invece -invito -iperbole -ipnotico -ipotesi -ippica -iride -irlanda -ironico -irrigato -irrorare -isolato -isotopo -isterico -istituto -istrice -italia -iterare -labbro -labirinto -lacca -lacerato -lacrima -lacuna -laddove -lago -lampo -lancetta -lanterna -lardoso -larga -laringe -lastra -latenza -latino -lattuga -lavagna -lavoro -legale -leggero -lembo -lentezza -lenza -leone -lepre -lesivo -lessato -lesto -letterale -leva -levigato -libero -lido -lievito -lilla -limatura -limitare -limpido -lineare -lingua -liquido -lira -lirica -lisca -lite -litigio -livrea -locanda -lode -logica -lombare -londra -longevo -loquace -lorenzo -loto -lotteria -luce -lucidato -lumaca -luminoso -lungo -lupo -luppolo -lusinga -lusso -lutto -macabro -macchina -macero -macinato -madama -magico -maglia -magnete -magro -maiolica -malafede -malgrado -malinteso -malsano -malto -malumore -mana -mancia -mandorla -mangiare -manifesto -mannaro -manovra -mansarda -mantide -manubrio -mappa -maratona -marcire -maretta -marmo -marsupio -maschera -massaia -mastino -materasso -matricola -mattone -maturo -mazurca -meandro -meccanico -mecenate -medesimo -meditare -mega -melassa -melis -melodia -meninge -meno -mensola -mercurio -merenda -merlo -meschino -mese -messere -mestolo -metallo -metodo -mettere -miagolare -mica -micelio -michele -microbo -midollo -miele -migliore -milano -milite -mimosa -minerale -mini -minore -mirino -mirtillo -miscela -missiva -misto -misurare -mitezza -mitigare -mitra -mittente -mnemonico -modello -modifica -modulo -mogano -mogio -mole -molosso -monastero -monco -mondina -monetario -monile -monotono -monsone -montato -monviso -mora -mordere -morsicato -mostro -motivato -motosega -motto -movenza -movimento -mozzo -mucca -mucosa -muffa -mughetto -mugnaio -mulatto -mulinello -multiplo -mummia -munto -muovere -murale -musa -muscolo -musica -mutevole -muto -nababbo -nafta -nanometro -narciso -narice -narrato -nascere -nastrare -naturale -nautica -naviglio -nebulosa -necrosi -negativo -negozio -nemmeno -neofita -neretto -nervo -nessuno -nettuno -neutrale -neve -nevrotico -nicchia -ninfa -nitido -nobile -nocivo -nodo -nome -nomina -nordico -normale -norvegese -nostrano -notare -notizia -notturno -novella -nucleo -nulla -numero -nuovo -nutrire -nuvola -nuziale -oasi -obbedire -obbligo -obelisco -oblio -obolo -obsoleto -occasione -occhio -occidente -occorrere -occultare -ocra -oculato -odierno -odorare -offerta -offrire -offuscato -oggetto -oggi -ognuno -olandese -olfatto -oliato -oliva -ologramma -oltre -omaggio -ombelico -ombra -omega -omissione -ondoso -onere -onice -onnivoro -onorevole -onta -operato -opinione -opposto -oracolo -orafo -ordine -orecchino -orefice -orfano -organico -origine -orizzonte -orma -ormeggio -ornativo -orologio -orrendo -orribile -ortensia -ortica -orzata -orzo -osare -oscurare -osmosi -ospedale -ospite -ossa -ossidare -ostacolo -oste -otite -otre -ottagono -ottimo -ottobre -ovale -ovest -ovino -oviparo -ovocito -ovunque -ovviare -ozio -pacchetto -pace -pacifico -padella -padrone -paese -paga -pagina -palazzina -palesare -pallido -palo -palude -pandoro -pannello -paolo -paonazzo -paprica -parabola -parcella -parere -pargolo -pari -parlato -parola -partire -parvenza -parziale -passivo -pasticca -patacca -patologia -pattume -pavone -peccato -pedalare -pedonale -peggio -peloso -penare -pendice -penisola -pennuto -penombra -pensare -pentola -pepe -pepita -perbene -percorso -perdonato -perforare -pergamena -periodo -permesso -perno -perplesso -persuaso -pertugio -pervaso -pesatore -pesista -peso -pestifero -petalo -pettine -petulante -pezzo -piacere -pianta -piattino -piccino -picozza -piega -pietra -piffero -pigiama -pigolio -pigro -pila -pilifero -pillola -pilota -pimpante -pineta -pinna -pinolo -pioggia -piombo -piramide -piretico -pirite -pirolisi -pitone -pizzico -placebo -planare -plasma -platano -plenario -pochezza -poderoso -podismo -poesia -poggiare -polenta -poligono -pollice -polmonite -polpetta -polso -poltrona -polvere -pomice -pomodoro -ponte -popoloso -porfido -poroso -porpora -porre -portata -posa -positivo -possesso -postulato -potassio -potere -pranzo -prassi -pratica -precluso -predica -prefisso -pregiato -prelievo -premere -prenotare -preparato -presenza -pretesto -prevalso -prima -principe -privato -problema -procura -produrre -profumo -progetto -prolunga -promessa -pronome -proposta -proroga -proteso -prova -prudente -prugna -prurito -psiche -pubblico -pudica -pugilato -pugno -pulce -pulito -pulsante -puntare -pupazzo -pupilla -puro -quadro -qualcosa -quasi -querela -quota -raccolto -raddoppio -radicale -radunato -raffica -ragazzo -ragione -ragno -ramarro -ramingo -ramo -randagio -rantolare -rapato -rapina -rappreso -rasatura -raschiato -rasente -rassegna -rastrello -rata -ravveduto -reale -recepire -recinto -recluta -recondito -recupero -reddito -redimere -regalato -registro -regola -regresso -relazione -remare -remoto -renna -replica -reprimere -reputare -resa -residente -responso -restauro -rete -retina -retorica -rettifica -revocato -riassunto -ribadire -ribelle -ribrezzo -ricarica -ricco -ricevere -riciclato -ricordo -ricreduto -ridicolo -ridurre -rifasare -riflesso -riforma -rifugio -rigare -rigettato -righello -rilassato -rilevato -rimanere -rimbalzo -rimedio -rimorchio -rinascita -rincaro -rinforzo -rinnovo -rinomato -rinsavito -rintocco -rinuncia -rinvenire -riparato -ripetuto -ripieno -riportare -ripresa -ripulire -risata -rischio -riserva -risibile -riso -rispetto -ristoro -risultato -risvolto -ritardo -ritegno -ritmico -ritrovo -riunione -riva -riverso -rivincita -rivolto -rizoma -roba -robotico -robusto -roccia -roco -rodaggio -rodere -roditore -rogito -rollio -romantico -rompere -ronzio -rosolare -rospo -rotante -rotondo -rotula -rovescio -rubizzo -rubrica -ruga -rullino -rumine -rumoroso -ruolo -rupe -russare -rustico -sabato -sabbiare -sabotato -sagoma -salasso -saldatura -salgemma -salivare -salmone -salone -saltare -saluto -salvo -sapere -sapido -saporito -saraceno -sarcasmo -sarto -sassoso -satellite -satira -satollo -saturno -savana -savio -saziato -sbadiglio -sbalzo -sbancato -sbarra -sbattere -sbavare -sbendare -sbirciare -sbloccato -sbocciato -sbrinare -sbruffone -sbuffare -scabroso -scadenza -scala -scambiare -scandalo -scapola -scarso -scatenare -scavato -scelto -scenico -scettro -scheda -schiena -sciarpa -scienza -scindere -scippo -sciroppo -scivolo -sclerare -scodella -scolpito -scomparto -sconforto -scoprire -scorta -scossone -scozzese -scriba -scrollare -scrutinio -scuderia -scultore -scuola -scuro -scusare -sdebitare -sdoganare -seccatura -secondo -sedano -seggiola -segnalato -segregato -seguito -selciato -selettivo -sella -selvaggio -semaforo -sembrare -seme -seminato -sempre -senso -sentire -sepolto -sequenza -serata -serbato -sereno -serio -serpente -serraglio -servire -sestina -setola -settimana -sfacelo -sfaldare -sfamato -sfarzoso -sfaticato -sfera -sfida -sfilato -sfinge -sfocato -sfoderare -sfogo -sfoltire -sforzato -sfratto -sfruttato -sfuggito -sfumare -sfuso -sgabello -sgarbato -sgonfiare -sgorbio -sgrassato -sguardo -sibilo -siccome -sierra -sigla -signore -silenzio -sillaba -simbolo -simpatico -simulato -sinfonia -singolo -sinistro -sino -sintesi -sinusoide -sipario -sisma -sistole -situato -slitta -slogatura -sloveno -smarrito -smemorato -smentito -smeraldo -smilzo -smontare -smottato -smussato -snellire -snervato -snodo -sobbalzo -sobrio -soccorso -sociale -sodale -soffitto -sogno -soldato -solenne -solido -sollazzo -solo -solubile -solvente -somatico -somma -sonda -sonetto -sonnifero -sopire -soppeso -sopra -sorgere -sorpasso -sorriso -sorso -sorteggio -sorvolato -sospiro -sosta -sottile -spada -spalla -spargere -spatola -spavento -spazzola -specie -spedire -spegnere -spelatura -speranza -spessore -spettrale -spezzato -spia -spigoloso -spillato -spinoso -spirale -splendido -sportivo -sposo -spranga -sprecare -spronato -spruzzo -spuntino -squillo -sradicare -srotolato -stabile -stacco -staffa -stagnare -stampato -stantio -starnuto -stasera -statuto -stelo -steppa -sterzo -stiletto -stima -stirpe -stivale -stizzoso -stonato -storico -strappo -stregato -stridulo -strozzare -strutto -stuccare -stufo -stupendo -subentro -succoso -sudore -suggerito -sugo -sultano -suonare -superbo -supporto -surgelato -surrogato -sussurro -sutura -svagare -svedese -sveglio -svelare -svenuto -svezia -sviluppo -svista -svizzera -svolta -svuotare -tabacco -tabulato -tacciare -taciturno -tale -talismano -tampone -tannino -tara -tardivo -targato -tariffa -tarpare -tartaruga -tasto -tattico -taverna -tavolata -tazza -teca -tecnico -telefono -temerario -tempo -temuto -tendone -tenero -tensione -tentacolo -teorema -terme -terrazzo -terzetto -tesi -tesserato -testato -tetro -tettoia -tifare -tigella -timbro -tinto -tipico -tipografo -tiraggio -tiro -titanio -titolo -titubante -tizio -tizzone -toccare -tollerare -tolto -tombola -tomo -tonfo -tonsilla -topazio -topologia -toppa -torba -tornare -torrone -tortora -toscano -tossire -tostatura -totano -trabocco -trachea -trafila -tragedia -tralcio -tramonto -transito -trapano -trarre -trasloco -trattato -trave -treccia -tremolio -trespolo -tributo -tricheco -trifoglio -trillo -trincea -trio -tristezza -triturato -trivella -tromba -trono -troppo -trottola -trovare -truccato -tubatura -tuffato -tulipano -tumulto -tunisia -turbare -turchino -tuta -tutela -ubicato -uccello -uccisore -udire -uditivo -uffa -ufficio -uguale -ulisse -ultimato -umano -umile -umorismo -uncinetto -ungere -ungherese -unicorno -unificato -unisono -unitario -unte -uovo -upupa -uragano -urgenza -urlo -usanza -usato -uscito -usignolo -usuraio -utensile -utilizzo -utopia -vacante -vaccinato -vagabondo -vagliato -valanga -valgo -valico -valletta -valoroso -valutare -valvola -vampata -vangare -vanitoso -vano -vantaggio -vanvera -vapore -varano -varcato -variante -vasca -vedetta -vedova -veduto -vegetale -veicolo -velcro -velina -velluto -veloce -venato -vendemmia -vento -verace -verbale -vergogna -verifica -vero -verruca -verticale -vescica -vessillo -vestale -veterano -vetrina -vetusto -viandante -vibrante -vicenda -vichingo -vicinanza -vidimare -vigilia -vigneto -vigore -vile -villano -vimini -vincitore -viola -vipera -virgola -virologo -virulento -viscoso -visione -vispo -vissuto -visura -vita -vitello -vittima -vivanda -vivido -viziare -voce -voga -volatile -volere -volpe -voragine -vulcano -zampogna -zanna -zappato -zattera -zavorra -zefiro -zelante -zelo -zenzero -zerbino -zibetto -zinco -zircone -zitto -zolla -zotico -zucchero -zufolo -zulu -zuppa diff --git a/external/libwally-core/src/data/wordlists/japanese.c b/external/libwally-core/src/data/wordlists/japanese.c deleted file mode 100644 index 59925918e..000000000 --- a/external/libwally-core/src/data/wordlists/japanese.c +++ /dev/null @@ -1,2408 +0,0 @@ -/* Generated file - do not edit! */ -#include - -static const unsigned char jp_[] = { - 0xe3,0x81,0x82,0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x93,0, - 0xe3,0x81,0x82,0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x82,0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x82,0xe3,0x81,0x8a,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x82,0x89,0, - 0xe3,0x81,0x82,0xe3,0x81,0x8b,0xe3,0x81,0xa1,0xe3,0x82,0x83,0xe3,0x82,0x93,0, - 0xe3,0x81,0x82,0xe3,0x81,0x8d,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0x91,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x9f,0, - 0xe3,0x81,0x82,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x82,0xe3,0x81,0x95,0xe3,0x81,0xb2,0, - 0xe3,0x81,0x82,0xe3,0x81,0x97,0xe3,0x81,0x82,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x82,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x8f,0xe3,0x81,0x86,0, - 0xe3,0x81,0x82,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x82,0xe3,0x81,0x9d,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0x82,0xe3,0x81,0x9f,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0x9f,0xe3,0x81,0x9f,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0x9f,0xe3,0x82,0x8a,0xe3,0x81,0xbe,0xe3,0x81,0x88,0, - 0xe3,0x81,0x82,0xe3,0x81,0x9f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0xa4,0xe3,0x81,0x84,0, - 0xe3,0x81,0x82,0xe3,0x81,0xa4,0xe3,0x81,0x8b,0xe3,0x81,0x86,0, - 0xe3,0x81,0x82,0xe3,0x81,0xa3,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x82,0xe3,0x81,0xa4,0xe3,0x81,0xbe,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x82,0xe3,0x81,0xa4,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0xa6,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x82,0xe3,0x81,0xa6,0xe3,0x81,0xaf,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0xb2,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x89,0, - 0xe3,0x81,0x82,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0xb5,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x81,0xbe,0xe3,0x81,0x84,0, - 0xe3,0x81,0x82,0xe3,0x81,0xbe,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0x82,0xe3,0x81,0xbe,0xe3,0x82,0x84,0xe3,0x81,0x8b,0xe3,0x81,0x99,0, - 0xe3,0x81,0x82,0xe3,0x81,0xbe,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x82,0xe3,0x81,0xbf,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x82,0xe3,0x82,0x81,0xe3,0x82,0x8a,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x82,0x84,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x82,0x86,0xe3,0x82,0x80,0, - 0xe3,0x81,0x82,0xe3,0x82,0x89,0xe3,0x81,0x84,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x82,0xe3,0x82,0x89,0xe3,0x81,0x97,0, - 0xe3,0x81,0x82,0xe3,0x82,0x89,0xe3,0x81,0x99,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x82,0xe3,0x82,0x89,0xe3,0x81,0x9f,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x82,0x89,0xe3,0x82,0x86,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x82,0x89,0xe3,0x82,0x8f,0xe3,0x81,0x99,0, - 0xe3,0x81,0x82,0xe3,0x82,0x8a,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x82,0xe3,0x82,0x8f,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x82,0x8f,0xe3,0x81,0xa6,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x82,0xe3,0x82,0x93,0xe3,0x81,0x84,0, - 0xe3,0x81,0x82,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x82,0xe3,0x82,0x93,0xe3,0x81,0x93,0, - 0xe3,0x81,0x82,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x82,0xe3,0x82,0x93,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x82,0xe3,0x82,0x93,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x82,0xe3,0x82,0x93,0xe3,0x81,0xbe,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x84,0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x81,0x8a,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x81,0xaa,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x84,0xe3,0x81,0x8f,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x81,0xbe,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x84,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x88,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x82,0x8d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9d,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x82,0x89,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x82,0x8a,0xe3,0x81,0x82,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa1,0xe3,0x81,0x8a,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa1,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa1,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa1,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa1,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa1,0xe3,0x82,0x8a,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa4,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa3,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa3,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa3,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa3,0xe3,0x81,0x9f,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa3,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa3,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa3,0xe3,0x81,0xbb,0xe3,0x82,0x9a,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa6,0xe3,0x81,0x95,0xe3,0x82,0x99,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x81,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x81,0xaa,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x81,0xad,0xe3,0x82,0x80,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x84,0xe3,0x81,0xae,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x84,0xe3,0x81,0xae,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x81,0xaf,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x84,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x81,0xaf,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x84,0xe3,0x81,0xb2,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0xb5,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x84,0xe3,0x81,0xb8,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x81,0xbf,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x82,0x82,0xe3,0x81,0x86,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x84,0xe3,0x82,0x82,0xe3,0x81,0x9f,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x84,0xe3,0x82,0x82,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x84,0xe3,0x82,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x82,0x84,0xe3,0x81,0x99,0, - 0xe3,0x81,0x84,0xe3,0x82,0x88,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x82,0x88,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x84,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x82,0x89,0xe3,0x81,0x99,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8a,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8c,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8d,0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0xb2,0xe3,0x82,0x9a,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8f,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8f,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8f,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x81,0x84,0xe3,0x82,0x8f,0xe3,0x82,0x86,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x84,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xbe,0xe3,0x82,0x81,0, - 0xe3,0x81,0x84,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x84,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x84,0xe3,0x82,0x93,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x86,0xe3,0x81,0x88,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x86,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0x8a,0xe3,0x81,0x95,0xe3,0x82,0x99,0, - 0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0x8d,0xe3,0x82,0x8f,0, - 0xe3,0x81,0x86,0xe3,0x81,0x8f,0xe3,0x82,0x89,0xe3,0x81,0x84,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x86,0xe3,0x81,0x8f,0xe3,0x82,0x8c,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x86,0xe3,0x81,0x91,0xe3,0x81,0x9f,0xe3,0x81,0xbe,0xe3,0x82,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0x91,0xe3,0x81,0xa4,0xe3,0x81,0x91,0, - 0xe3,0x81,0x86,0xe3,0x81,0x91,0xe3,0x81,0xa8,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0x91,0xe3,0x82,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x86,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x81,0x99,0, - 0xe3,0x81,0x86,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x86,0xe3,0x81,0x93,0xe3,0x82,0x93,0, - 0xe3,0x81,0x86,0xe3,0x81,0x95,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x81,0xaa,0xe3,0x81,0x86,0, - 0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x8d,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x86,0xe3,0x81,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x86,0xe3,0x81,0x99,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0x86,0xe3,0x81,0x99,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0x86,0xe3,0x81,0x99,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0x9b,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa1,0xe3,0x81,0x82,0xe3,0x82,0x8f,0xe3,0x81,0x9b,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa1,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8f,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa1,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa1,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa4,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa3,0xe3,0x81,0x9f,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa4,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x86,0xe3,0x81,0xaa,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0x86,0xe3,0x81,0xaa,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x86,0xe3,0x81,0xaa,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x86,0xe3,0x81,0xaa,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0xad,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0x86,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0x86,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x88,0, - 0xe3,0x81,0x86,0xe3,0x81,0xbe,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x82,0x82,0xe3,0x81,0x86,0, - 0xe3,0x81,0x86,0xe3,0x82,0x84,0xe3,0x81,0xbe,0xe3,0x81,0x86,0, - 0xe3,0x81,0x86,0xe3,0x82,0x88,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x86,0xe3,0x82,0x89,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x88,0xe3,0x81,0x99,0, - 0xe3,0x81,0x86,0xe3,0x82,0x89,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x86,0xe3,0x82,0x89,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8a,0xe3,0x81,0x82,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8a,0xe3,0x81,0x8d,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8b,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8c,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8c,0xe3,0x82,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8d,0xe3,0x81,0x93,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8f,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x86,0xe3,0x82,0x8f,0xe3,0x81,0x95,0, - 0xe3,0x81,0x86,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x86,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x82,0x93,0, - 0xe3,0x81,0x86,0xe3,0x82,0x93,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0x86,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x88,0xe3,0x81,0x84,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x81,0x88,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x99,0, - 0xe3,0x81,0x88,0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x88,0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0x88,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x88,0xe3,0x81,0x84,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x88,0xe3,0x81,0x84,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x88,0xe3,0x81,0x84,0xe3,0x82,0x8f,0, - 0xe3,0x81,0x88,0xe3,0x81,0x8a,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x88,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8a,0, - 0xe3,0x81,0x88,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x88,0xe3,0x81,0x8d,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x88,0xe3,0x81,0x8f,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x88,0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x88,0xe3,0x81,0x99,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x88,0xe3,0x81,0xa4,0xe3,0x82,0x89,0xe3,0x82,0x93,0, - 0xe3,0x81,0x88,0xe3,0x81,0xae,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x88,0xe3,0x81,0xbb,0xe3,0x81,0x86,0xe3,0x81,0xbe,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x88,0xe3,0x81,0xbb,0xe3,0x82,0x93,0, - 0xe3,0x81,0x88,0xe3,0x81,0xbe,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x88,0xe3,0x82,0x82,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x88,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x88,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0x88,0xe3,0x82,0x89,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0x88,0xe3,0x82,0x8a,0xe3,0x81,0x82,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x84,0xe3,0x81,0xa4,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x86,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x86,0xe3,0x81,0x95,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x86,0xe3,0x81,0x9b,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x86,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x86,0xe3,0x81,0xb5,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x86,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x86,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8a,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8a,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8a,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x8a,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8a,0xe3,0x82,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8a,0xe3,0x82,0x88,0xe3,0x81,0x9d,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8b,0xe3,0x81,0x88,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8b,0xe3,0x81,0x99,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x80,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8b,0xe3,0x82,0x8f,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0xaa,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8d,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8f,0xe3,0x82,0x8a,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x8f,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x93,0xe3,0x81,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x93,0xe3,0x81,0xaa,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x93,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x95,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x95,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x95,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x97,0xe3,0x81,0x84,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x97,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x9d,0xe3,0x82,0x89,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x9d,0xe3,0x82,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x9f,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x9f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8a,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x84,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xa1,0xe3,0x81,0xa4,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xa3,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xa4,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x81,0x91,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xa8,0xe3,0x81,0x97,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xa8,0xe3,0x81,0xaa,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x82,0x8d,0xe3,0x81,0x8b,0xe3,0x81,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8a,0xe3,0x81,0xbe,0xe3,0x81,0x84,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x81,0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x82,0xe3,0x81,0x84,0xe3,0x81,0xa6,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x82,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x82,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x82,0xe3,0x81,0xa1,0xe3,0x82,0x83,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x84,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x84,0xe3,0x82,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x88,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x89,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x8d,0xe3,0x81,0x99,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x83,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8a,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x83,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x99,0xe3,0x81,0x84,0xe3,0x82,0x88,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0xa4,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0xb5,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0xb8,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x82,0x8f,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x8a,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x8b,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x97,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x8f,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x8f,0xe3,0x81,0xa8,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8b,0xe3,0x81,0x9f,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x81,0xaa,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x82,0x8f,0xe3,0x81,0x97,0, - 0xe3,0x81,0x8b,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xaf,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8b,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x8b,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x81,0xbb,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8b,0xe3,0x81,0xbe,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x81,0xbe,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x93,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x81,0xe3,0x82,0x8c,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x86,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x8d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x8f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x8f,0xe3,0x82,0x89,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x83,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x93,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x82,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x84,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x86,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x86,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8a,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8a,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8a,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8b,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x83,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8d,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8f,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x8f,0xe3,0x82,0x89,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x93,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x95,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x95,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x95,0xe3,0x82,0x89,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x82,0x83,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x9b,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0x9f,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xa4,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0xa1,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xa4,0xe3,0x81,0xa4,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xa4,0xe3,0x81,0xad,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xaa,0xe3,0x81,0x8b,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xaa,0xe3,0x81,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xac,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x97,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xad,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xae,0xe3,0x81,0x97,0xe3,0x81,0x9f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xaf,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xb2,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xb5,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xbb,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8d,0xe3,0x81,0xbf,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x80,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x82,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x81,0xe3,0x81,0x97,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x82,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x81,0x86,0xe3,0x81,0xab,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x86,0xe3,0x82,0x8a,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x89,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x8c,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x8d,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x8f,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x84,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0, - 0xe3,0x81,0x8d,0xe3,0x82,0x93,0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x82,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x84,0xe3,0x81,0x99,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x86,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x86,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x86,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x9f,0xe3,0x82,0x89,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x86,0xe3,0x81,0xb5,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x86,0xe3,0x81,0xbb,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x99,0xe3,0x81,0xae,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x99,0xe3,0x82,0x8a,0xe3,0x82,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x9b,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xa6,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x95,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8f,0xe3,0x81,0x9f,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xa1,0xe3,0x81,0x93,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xa1,0xe3,0x81,0x95,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x81,0x9f,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xa4,0xe3,0x82,0x8d,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xa8,0xe3,0x81,0x86,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xaa,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xad,0xe3,0x81,0x8f,0xe3,0x81,0xad,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xb5,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xbf,0xe3,0x81,0x82,0xe3,0x82,0x8f,0xe3,0x81,0x9b,0, - 0xe3,0x81,0x8f,0xe3,0x81,0xbf,0xe3,0x81,0x9f,0xe3,0x81,0xa6,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x84,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x89,0xe3,0x81,0x99,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x89,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x8b,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x8d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x8f,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x91,0xe3,0x81,0x82,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x91,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x91,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x81,0x84,0xe3,0x81,0x93,0, - 0xe3,0x81,0x91,0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x91,0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0xae,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x81,0x84,0xe3,0x82,0x8c,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x81,0x84,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x81,0x8a,0xe3,0x81,0xa8,0xe3,0x81,0x99,0, - 0xe3,0x81,0x91,0xe3,0x81,0x8a,0xe3,0x82,0x8a,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x81,0xa1,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x81,0xa8,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x81,0xaf,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x82,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x93,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x81,0x95,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x81,0x97,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x81,0x97,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x82,0x80,0, - 0xe3,0x81,0x91,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x99,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x91,0xe3,0x81,0x9f,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa1,0xe3,0x82,0x83,0xe3,0x81,0xa3,0xe3,0x81,0xb5,0xe3,0x82,0x9a,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa1,0xe3,0x82,0x89,0xe3,0x81,0x99,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa4,0xe3,0x81,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa4,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa4,0xe3,0x81,0x88,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa3,0xe3,0x81,0x93,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa3,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa3,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa4,0xe3,0x81,0xbe,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0xa4,0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0xa4,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa4,0xe3,0x82,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa8,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0x91,0xe3,0x81,0xa8,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x91,0xe3,0x81,0xaa,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0x91,0xe3,0x81,0xaa,0xe3,0x81,0x99,0, - 0xe3,0x81,0x91,0xe3,0x81,0xaa,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x91,0xe3,0x81,0xac,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0xad,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x91,0xe3,0x81,0xad,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x81,0xaf,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0xb2,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x91,0xe3,0x81,0xbe,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x91,0xe3,0x81,0xbf,0xe3,0x81,0x8b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x91,0xe3,0x82,0x80,0xe3,0x81,0x97,0, - 0xe3,0x81,0x91,0xe3,0x82,0x80,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x91,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x91,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x8d,0xe3,0x81,0x91,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x82,0x8f,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x88,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x8a,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0xab,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x81,0xbf,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x82,0x81,0xe3,0x81,0x84,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x82,0x89,0xe3,0x82,0x93,0, - 0xe3,0x81,0x91,0xe3,0x82,0x93,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x93,0xe3,0x81,0x82,0xe3,0x81,0x8f,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x93,0xe3,0x81,0x84,0xe3,0x81,0xac,0, - 0xe3,0x81,0x93,0xe3,0x81,0x84,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x8d,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0xa1,0xe3,0x82,0x83,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0xa4,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0xaf,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0xbe,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x82,0x82,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x82,0x8a,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x93,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x81,0x8a,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0x8f,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0x93,0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x8f,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x81,0x8f,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x8f,0xe3,0x81,0xaf,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x93,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x93,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x81,0x93,0xe3,0x81,0xae,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x81,0x93,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x93,0xe3,0x81,0x95,0xe3,0x82,0x81,0, - 0xe3,0x81,0x93,0xe3,0x81,0x97,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x93,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x93,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x93,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0x9f,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x81,0x9f,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa4,0xe3,0x81,0x93,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa4,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa4,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa8,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x89,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa8,0xe3,0x81,0x97,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa8,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x81,0x93,0xe3,0x81,0xa8,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x93,0xe3,0x81,0xaa,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x93,0xe3,0x81,0xad,0xe3,0x81,0x93,0xe3,0x81,0xad,0, - 0xe3,0x81,0x93,0xe3,0x81,0xae,0xe3,0x81,0xbe,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x93,0xe3,0x81,0xae,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x93,0xe3,0x81,0xae,0xe3,0x82,0x88,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0xaf,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0xb2,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x93,0xe3,0x81,0xb5,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0xbe,0xe3,0x81,0x82,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x89,0, - 0xe3,0x81,0x93,0xe3,0x81,0xbe,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0xbe,0xe3,0x81,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x93,0xe3,0x81,0xbe,0xe3,0x81,0xa4,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x93,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x82,0x80,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0x93,0, - 0xe3,0x81,0x93,0xe3,0x82,0x82,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x93,0xe3,0x82,0x82,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x93,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x93,0xe3,0x82,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x82,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x93,0xe3,0x82,0x84,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x93,0xe3,0x82,0x86,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x82,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x93,0xe3,0x82,0x88,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x82,0x8a,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x82,0x8c,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x82,0x8d,0xe3,0x81,0xa3,0xe3,0x81,0x91,0, - 0xe3,0x81,0x93,0xe3,0x82,0x8f,0xe3,0x82,0x82,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x93,0xe3,0x82,0x8f,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0x84,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0xaa,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x81,0xab,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x9a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x81,0xbe,0xe3,0x81,0x91,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x82,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x81,0x93,0xe3,0x82,0x93,0xe3,0x82,0x8f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x88,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x95,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x95,0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x93,0, - 0xe3,0x81,0x95,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0x95,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0xa1,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x81,0x84,0xe3,0x81,0xa6,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x81,0x86,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x97,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8b,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8b,0xe3,0x81,0xbf,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8f,0xe3,0x81,0x97,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8f,0xe3,0x81,0xb2,0xe3,0x82,0x93,0, - 0xe3,0x81,0x95,0xe3,0x81,0x8f,0xe3,0x82,0x89,0, - 0xe3,0x81,0x95,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x95,0xe3,0x81,0x93,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x95,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x95,0xe3,0x81,0x9f,0xe3,0x82,0x93,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa4,0xe3,0x81,0x88,0xe3,0x81,0x84,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0xa4,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0xa4,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x97,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa4,0xe3,0x81,0x9f,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa4,0xe3,0x81,0xbe,0xe3,0x81,0x84,0xe3,0x82,0x82,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa8,0xe3,0x81,0x84,0xe3,0x82,0x82,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa8,0xe3,0x81,0x8a,0xe3,0x82,0x84,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa8,0xe3,0x81,0x97,0, - 0xe3,0x81,0x95,0xe3,0x81,0xa8,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x95,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x95,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x95,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x95,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x81,0xbb,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0x95,0xe3,0x81,0xbe,0xe3,0x81,0x99,0, - 0xe3,0x81,0x95,0xe3,0x81,0xbf,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x95,0xe3,0x81,0xbf,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x95,0xe3,0x82,0x80,0xe3,0x81,0x91,0, - 0xe3,0x81,0x95,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x95,0xe3,0x82,0x84,0xe3,0x81,0x88,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x82,0x86,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x82,0x88,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x95,0xe3,0x82,0x89,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x82,0x8b,0xe3,0x81,0x9d,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x81,0x95,0xe3,0x82,0x8f,0xe3,0x82,0x84,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x95,0xe3,0x82,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x84,0xe3,0x82,0x93,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x9d,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x82,0x89,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0x82,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x81,0x82,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0x97,0xe3,0x81,0x82,0xe3,0x81,0x95,0xe3,0x81,0xa3,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x97,0xe3,0x81,0x82,0xe3,0x82,0x8f,0xe3,0x81,0x9b,0, - 0xe3,0x81,0x97,0xe3,0x81,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x97,0xe3,0x81,0x84,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0x86,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x97,0xe3,0x81,0x88,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x81,0x8a,0xe3,0x81,0x91,0, - 0xe3,0x81,0x97,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x97,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x81,0x9f,0xe3,0x81,0x86,0xe3,0x81,0x91,0, - 0xe3,0x81,0x97,0xe3,0x81,0x9f,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0x97,0xe3,0x81,0x9f,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x97,0xe3,0x81,0x9f,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x97,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x81,0xa1,0xe3,0x82,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x97,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x97,0xe3,0x81,0xa4,0xe3,0x82,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x81,0xa6,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x97,0xe3,0x81,0xa6,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x81,0xaa,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x97,0xe3,0x81,0xaa,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x97,0xe3,0x81,0xaa,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0xad,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x97,0xe3,0x81,0xad,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0xae,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x97,0xe3,0x81,0xae,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0x97,0xe3,0x81,0xaf,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x97,0xe3,0x81,0xaf,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x97,0xe3,0x81,0xaf,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x81,0xaf,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0xb2,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x81,0xb5,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0xb8,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x81,0xbb,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x81,0xbe,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x97,0xe3,0x81,0xbf,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x80,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x80,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0x97,0xe3,0x82,0x81,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x97,0xe3,0x82,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x84,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x86,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x83,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x82,0x82,0, - 0xe3,0x81,0x97,0xe3,0x82,0x84,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x8f,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x97,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x83,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x82,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x83,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x86,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0x8f,0xe3,0x81,0xaf,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x81,0x97,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0xa3,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x82,0x89,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x82,0x93,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x8f,0xe3,0x81,0x9f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0xa3,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x82,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x97,0xe3,0x82,0x89,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x97,0xe3,0x82,0x89,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x97,0xe3,0x82,0x93,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x97,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x83,0, - 0xe3,0x81,0x97,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x97,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x97,0xe3,0x82,0x93,0xe3,0x82,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x99,0xe3,0x81,0x82,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0x99,0xe3,0x81,0x82,0xe3,0x81,0x97,0, - 0xe3,0x81,0x99,0xe3,0x81,0x82,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0x99,0xe3,0x81,0x84,0xe3,0x81,0x88,0xe3,0x81,0x84,0, - 0xe3,0x81,0x99,0xe3,0x81,0x84,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x99,0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x99,0xe3,0x81,0x84,0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x99,0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x99,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x99,0xe3,0x81,0x86,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x99,0xe3,0x81,0x8a,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x99,0xe3,0x81,0x8d,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x99,0xe3,0x81,0x8f,0xe3,0x81,0x86,0, - 0xe3,0x81,0x99,0xe3,0x81,0x8f,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x99,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x99,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x99,0xe3,0x81,0x93,0xe3,0x81,0x97,0, - 0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0x99,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x99,0xe3,0x81,0x99,0xe3,0x82,0x80,0, - 0xe3,0x81,0x99,0xe3,0x81,0x99,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x97,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x99,0xe3,0x81,0xa6,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x99,0xe3,0x81,0xa6,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x99,0xe3,0x81,0xad,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x99,0xe3,0x81,0xae,0xe3,0x81,0x93,0, - 0xe3,0x81,0x99,0xe3,0x81,0xaf,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x99,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x89,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0xb2,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0xac,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x99,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x99,0xe3,0x81,0xb5,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x99,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x81,0xa6,0, - 0xe3,0x81,0x99,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0x99,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x99,0xe3,0x81,0xbe,0xe3,0x81,0x84,0, - 0xe3,0x81,0x99,0xe3,0x82,0x81,0xe3,0x81,0x97,0, - 0xe3,0x81,0x99,0xe3,0x82,0x82,0xe3,0x81,0x86,0, - 0xe3,0x81,0x99,0xe3,0x82,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x99,0xe3,0x82,0x89,0xe3,0x81,0x99,0xe3,0x82,0x89,0, - 0xe3,0x81,0x99,0xe3,0x82,0x8b,0xe3,0x82,0x81,0, - 0xe3,0x81,0x99,0xe3,0x82,0x8c,0xe3,0x81,0xa1,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x99,0xe3,0x82,0x8d,0xe3,0x81,0xa3,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x99,0xe3,0x82,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x99,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x99,0xe3,0x82,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x9a,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x82,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x89,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x84,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x8a,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x8d,0xe3,0x81,0xab,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x8d,0xe3,0x82,0x80,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x8d,0xe3,0x82,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x8d,0xe3,0x82,0x89,0xe3,0x82,0x93,0xe3,0x81,0x86,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x99,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x81,0x9f,0xe3,0x81,0x91,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa3,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa3,0xe3,0x81,0x93,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa3,0xe3,0x81,0x95,0xe3,0x81,0x9f,0xe3,0x81,0x8f,0xe3,0x81,0xbe,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa4,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa4,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa4,0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa3,0xe3,0x81,0xaf,0xe3,0x82,0x9a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa4,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa4,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa4,0xe3,0x82,0x81,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xa4,0xe3,0x82,0x8a,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xaa,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xae,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xaf,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0xad,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xbe,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x82,0xe3,0x81,0x9f,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x8a,0xe3,0x81,0xb5,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x82,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x88,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x87,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x85,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0xac,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0xad,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x81,0xaf,0xe3,0x82,0x9a,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x9a,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x82,0x80,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x82,0x81,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x82,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x82,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x82,0x86,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x82,0x89,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x82,0x8a,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9b,0xe3,0x82,0x93,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x82,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x84,0xe3,0x81,0xad,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x81,0xaa,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x82,0x81,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x86,0xe3,0x82,0x8a,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x88,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x97,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9d,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa6,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa4,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa4,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa4,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa3,0xe3,0x81,0x91,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa3,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa3,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa3,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa8,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8f,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xa8,0xe3,0x81,0xa4,0xe3,0x82,0x99,0xe3,0x82,0x89,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xaa,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xaa,0xe3,0x81,0x9f,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xb5,0xe3,0x81,0xbb,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xbe,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9d,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x80,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x80,0xe3,0x82,0x8a,0xe3,0x81,0x88,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x82,0xe3,0x81,0x9d,0xe3,0x82,0x82,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x88,0xe3,0x81,0x8b,0xe3,0x81,0x9b,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x89,0xe3,0x81,0xbe,0xe3,0x82,0x81,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x8d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9d,0xe3,0x82,0x93,0xe3,0x81,0xbf,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x82,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x84,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x86,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x88,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x8a,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x93,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xad,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xaf,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0xb2,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xb5,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xb8,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xbb,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xbe,0xe3,0x81,0xa4,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0xbf,0xe3,0x82,0x93,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x82,0x80,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x82,0x81,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x82,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x82,0x89,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x82,0x8f,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x86,0xe3,0x81,0x88,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x8a,0xe3,0x81,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x8a,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x8a,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x8b,0xe3,0x81,0xad,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x8d,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x93,0xe3,0x82,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x97,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x83,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x99,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x95,0xe3,0x82,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x9d,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8c,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x9f,0xe3,0x81,0x8b,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x9f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x81,0x9f,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xa1,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xa6,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xa8,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xaa,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x9f,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xab,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xac,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xae,0xe3,0x81,0x97,0xe3,0x81,0xbf,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xaf,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xbe,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x80,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x81,0xe3,0x81,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x84,0xe3,0x81,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x89,0xe3,0x81,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x8a,0xe3,0x81,0x8d,0xe3,0x81,0xbb,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x8a,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x8b,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x8c,0xe3,0x82,0x93,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x8d,0xe3,0x81,0xa3,0xe3,0x81,0xa8,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x8f,0xe3,0x82,0x80,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x8b,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xa1,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xaa,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0xab,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xad,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0xb2,0xe3,0x82,0x9a,0xe3,0x82,0x93,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0xbe,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x82,0x81,0xe3,0x81,0x84,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x82,0x8c,0xe3,0x81,0xa4,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x82,0x8d,0, - 0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x82,0x8f,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x82,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x8b,0xe3,0x82,0x89,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x8d,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x91,0xe3,0x81,0x84,0xe3,0x81,0x99,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x97,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x97,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x81,0x9f,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xa1,0xe3,0x81,0x8a,0xe3,0x82,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xa6,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xac,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xac,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xb2,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xbe,0xe3,0x81,0x9f,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xbf,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xa1,0xe3,0x81,0xbf,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x82,0x8d,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x83,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x81,0xaa,0xe3,0x81,0xb8,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x85,0xe3,0x81,0x86,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x86,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0xe3,0x81,0x97,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x95,0xe3,0x81,0x8f,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x89,0xe3,0x81,0x97,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x89,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x8a,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x8b,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x8f,0xe3,0x82,0x8f,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa1,0xe3,0x82,0x93,0xe3,0x82,0x82,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x84,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x86,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x86,0xe3,0x81,0xaf,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x86,0xe3,0x82,0x8f,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x8b,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x8b,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x8f,0xe3,0x81,0xad,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x91,0xe3,0x81,0xad,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa4,0xe3,0x81,0x9f,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xa4,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xa4,0xe3,0x82,0x80,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xa8,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xaa,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xaa,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xad,0xe3,0x81,0xa4,0xe3,0x82,0x99,0xe3,0x81,0xad,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xae,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xbe,0xe3,0x82,0x89,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x81,0xbf,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa4,0xe3,0x82,0x81,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa4,0xe3,0x82,0x82,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xa4,0xe3,0x82,0x82,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa4,0xe3,0x82,0x88,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa4,0xe3,0x82,0x8b,0xe3,0x81,0xbb,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa4,0xe3,0x82,0x8b,0xe3,0x81,0xbf,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa4,0xe3,0x82,0x8f,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0xa4,0xe3,0x82,0x8f,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x82,0xe3,0x81,0x97,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x82,0xe3,0x81,0xa6,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x82,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x97,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0xad,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0xb2,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0xb8,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x84,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x86,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x8a,0xe3,0x81,0x8f,0xe3,0x82,0x8c,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x8d,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x8f,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x81,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x93,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x95,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x95,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xa6,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xa1,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xa4,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xa4,0xe3,0x81,0xa4,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x81,0xa3,0xe3,0x81,0xaf,0xe3,0x82,0x9a,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xa4,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xa4,0xe3,0x82,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x81,0xac,0xe3,0x81,0x8b,0xe3,0x81,0x88,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xac,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xac,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xae,0xe3,0x81,0xb2,0xe3,0x82,0x89,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xaf,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x8f,0xe3,0x82,0x8d,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xb5,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xbb,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xbb,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xbe,0xe3,0x81,0x88,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xbe,0xe3,0x81,0x8d,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x97,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xbf,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xa6,0xe3,0x81,0xbf,0xe3,0x82,0x84,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x89,0xe3,0x81,0x99,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x8c,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x8f,0xe3,0x81,0x91,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x8f,0xe3,0x81,0x9f,0xe3,0x81,0x97,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x84,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x97,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0xa6,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x9a,0xe3,0x82,0x89,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x82,0x81,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x93,0xe3,0x82,0x89,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x82,0x8f,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x82,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x84,0xe3,0x82,0x8c,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x86,0xe3,0x81,0x8d,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x86,0xe3,0x81,0x97,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x86,0xe3,0x82,0x80,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8a,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8a,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8a,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8a,0xe3,0x81,0x99,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8a,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8b,0xe3,0x81,0x99,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8d,0xe3,0x81,0x8a,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8d,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8f,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8f,0xe3,0x81,0xab,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x8f,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x93,0xe3,0x82,0x84,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x95,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa8,0xe3,0x81,0x9f,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xa1,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xa3,0xe3,0x81,0x8f,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xa4,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xa4,0xe3,0x81,0xab,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xa8,0xe3,0x81,0xae,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xaa,0xe3,0x81,0x84,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xaa,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xaa,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xae,0xe3,0x81,0x95,0xe3,0x81,0xbe,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8f,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0xa8,0xe3,0x81,0xbe,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x82,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x82,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x89,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x84,0xe3,0x81,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x84,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x8a,0xe3,0x81,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x8f,0xe3,0x81,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x95,0xe3,0x81,0x91,0, - 0xe3,0x81,0xaa,0xe3,0x81,0x9f,0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x81,0x93,0xe3,0x81,0x93,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xa3,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xa4,0xe3,0x82,0x84,0xe3,0x81,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xaa,0xe3,0x81,0x8a,0xe3,0x81,0x97,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xab,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0xa8,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xab,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xab,0xe3,0x82,0x8f,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xae,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xb5,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xbe,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xbe,0xe3,0x81,0x88,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xbe,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xaa,0xe3,0x81,0xbf,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x81,0xe3,0x82,0x89,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x84,0xe3,0x82,0x80,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x89,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x89,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x89,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x8f,0xe3,0x81,0xa8,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaa,0xe3,0x82,0x8f,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xab,0xe3,0x81,0x82,0xe3,0x81,0x86,0, - 0xe3,0x81,0xab,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x9f,0, - 0xe3,0x81,0xab,0xe3,0x81,0x86,0xe3,0x81,0x91,0, - 0xe3,0x81,0xab,0xe3,0x81,0x8a,0xe3,0x81,0x84,0, - 0xe3,0x81,0xab,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xab,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xa6,0, - 0xe3,0x81,0xab,0xe3,0x81,0x8d,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xab,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xab,0xe3,0x81,0x8f,0xe3,0x81,0xbe,0xe3,0x82,0x93,0, - 0xe3,0x81,0xab,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xab,0xe3,0x81,0x95,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x9f,0xe3,0x82,0x93,0xe3,0x81,0x9d,0, - 0xe3,0x81,0xab,0xe3,0x81,0x97,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xab,0xe3,0x81,0x9b,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa1,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa1,0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xab,0xe3,0x81,0xa3,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0xab,0xe3,0x81,0xaa,0xe3,0x81,0x86,0, - 0xe3,0x81,0xab,0xe3,0x81,0xbb,0xe3,0x82,0x93,0, - 0xe3,0x81,0xab,0xe3,0x81,0xbe,0xe3,0x82,0x81,0, - 0xe3,0x81,0xab,0xe3,0x82,0x82,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xab,0xe3,0x82,0x84,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xab,0xe3,0x82,0x85,0xe3,0x81,0x86,0xe3,0x81,0x84,0xe3,0x82,0x93,0, - 0xe3,0x81,0xab,0xe3,0x82,0x8a,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x83,0, - 0xe3,0x81,0xab,0xe3,0x82,0x8f,0xe3,0x81,0xa8,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0x84,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0xab,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x9a,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x81,0xbe,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x82,0x80,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x82,0x81,0xe3,0x81,0x84,0, - 0xe3,0x81,0xab,0xe3,0x82,0x93,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0xac,0xe3,0x81,0x84,0xe3,0x81,0x8f,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0xac,0xe3,0x81,0x8b,0xe3,0x81,0x99,0, - 0xe3,0x81,0xac,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xac,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xac,0xe3,0x81,0x8f,0xe3,0x82,0x82,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xac,0xe3,0x81,0x99,0xe3,0x82,0x80,0, - 0xe3,0x81,0xac,0xe3,0x81,0xbe,0xe3,0x81,0x88,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xac,0xe3,0x82,0x81,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xac,0xe3,0x82,0x89,0xe3,0x81,0x99,0, - 0xe3,0x81,0xac,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xad,0xe3,0x81,0x82,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0xad,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xad,0xe3,0x81,0x84,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xad,0xe3,0x81,0x84,0xe3,0x82,0x8d,0, - 0xe3,0x81,0xad,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0x9b,0, - 0xe3,0x81,0xad,0xe3,0x81,0x8f,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xad,0xe3,0x81,0x8f,0xe3,0x82,0x89,0, - 0xe3,0x81,0xad,0xe3,0x81,0x93,0xe3,0x81,0x9b,0xe3,0x82,0x99,0, - 0xe3,0x81,0xad,0xe3,0x81,0x93,0xe3,0x82,0x80,0, - 0xe3,0x81,0xad,0xe3,0x81,0x95,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0xad,0xe3,0x81,0x99,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0xad,0xe3,0x81,0x9d,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xad,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0xad,0xe3,0x81,0xa4,0xe3,0x81,0x84,0, - 0xe3,0x81,0xad,0xe3,0x81,0xa3,0xe3,0x81,0x97,0xe3,0x82,0x93,0, - 0xe3,0x81,0xad,0xe3,0x81,0xa4,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xad,0xe3,0x81,0xa3,0xe3,0x81,0x9f,0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x87,0, - 0xe3,0x81,0xad,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xad,0xe3,0x81,0xb5,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xad,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xad,0xe3,0x81,0xbb,0xe3,0x82,0x8a,0xe3,0x81,0xaf,0xe3,0x81,0xbb,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xad,0xe3,0x81,0xbe,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xad,0xe3,0x81,0xbe,0xe3,0x82,0x8f,0xe3,0x81,0x97,0, - 0xe3,0x81,0xad,0xe3,0x81,0xbf,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xad,0xe3,0x82,0x80,0xe3,0x81,0x84,0, - 0xe3,0x81,0xad,0xe3,0x82,0x80,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xad,0xe3,0x82,0x82,0xe3,0x81,0xa8,0, - 0xe3,0x81,0xad,0xe3,0x82,0x89,0xe3,0x81,0x86,0, - 0xe3,0x81,0xad,0xe3,0x82,0x8f,0xe3,0x81,0x95,0xe3,0x82,0x99,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0x84,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0x8a,0xe3,0x81,0x97,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x82,0x99,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0x97,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0xa1,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0xb2,0xe3,0x82,0x9a,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x81,0xbe,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xad,0xe3,0x82,0x93,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x81,0xae,0xe3,0x81,0x84,0xe3,0x81,0x99,0xe3,0x82,0x99,0, - 0xe3,0x81,0xae,0xe3,0x81,0x8a,0xe3,0x81,0xa4,0xe3,0x82,0x99,0xe3,0x81,0xbe,0, - 0xe3,0x81,0xae,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0xae,0xe3,0x81,0x8d,0xe3,0x81,0xaa,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xae,0xe3,0x81,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xae,0xe3,0x81,0x93,0xe3,0x81,0x99,0, - 0xe3,0x81,0xae,0xe3,0x81,0x93,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xae,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xae,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xae,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x82,0x80,0, - 0xe3,0x81,0xae,0xe3,0x81,0x9f,0xe3,0x81,0xbe,0xe3,0x81,0x86,0, - 0xe3,0x81,0xae,0xe3,0x81,0xa1,0xe3,0x81,0xbb,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0xae,0xe3,0x81,0xa3,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xae,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0xae,0xe3,0x81,0xaf,0xe3,0x82,0x89,0, - 0xe3,0x81,0xae,0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xae,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xae,0xe3,0x81,0xbf,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0xae,0xe3,0x82,0x84,0xe3,0x81,0xbe,0, - 0xe3,0x81,0xae,0xe3,0x82,0x89,0xe3,0x81,0x84,0xe3,0x81,0xac,0, - 0xe3,0x81,0xae,0xe3,0x82,0x89,0xe3,0x81,0xad,0xe3,0x81,0x93,0, - 0xe3,0x81,0xae,0xe3,0x82,0x8a,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x81,0xae,0xe3,0x82,0x8a,0xe3,0x82,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xae,0xe3,0x82,0x8c,0xe3,0x82,0x93,0, - 0xe3,0x81,0xae,0xe3,0x82,0x93,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x82,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x82,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x82,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x84,0xe3,0x81,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x84,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x84,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x84,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x84,0xe3,0x82,0x8c,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x8a,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x8b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x85,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x95,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x97,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x97,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x9a,0xe3,0x81,0x9d,0xe3,0x81,0x93,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x9d,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0x9f,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa1,0xe3,0x81,0xbf,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa4,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa4,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0x8f,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0x97,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0x9f,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0xa1,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0xb2,0xe3,0x82,0x9a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xa3,0xe3,0x81,0xbb,0xe3,0x82,0x9a,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xaa,0xe3,0x81,0x99,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xaa,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xab,0xe3,0x81,0x8b,0xe3,0x82,0x80,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x89,0xe3,0x81,0x97,0, - 0xe3,0x81,0xaf,0xe3,0x81,0xbf,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x80,0xe3,0x81,0x8b,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x81,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x84,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x84,0xe3,0x81,0x97,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x89,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x8d,0xe3,0x81,0x86,0xe3,0x81,0x83,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x8f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x88,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x83,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x9a,0xe3,0x82,0x93,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x9a,0xe3,0x82,0x93,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x81,0x97,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0xaf,0xe3,0x82,0x9a,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0xb8,0xe3,0x82,0x9a,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x82,0x81,0xe3,0x81,0x84,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x82,0x89,0xe3,0x82,0x93,0, - 0xe3,0x81,0xaf,0xe3,0x82,0x93,0xe3,0x82,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x86,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x8b,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x8b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x8f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x91,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x93,0xe3,0x81,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x95,0xe3,0x81,0x97,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x81,0xa4,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x97,0xe3,0x82,0x87,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x9d,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x9d,0xe3,0x82,0x80,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x9f,0xe3,0x82,0x80,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xb2,0xe3,0x81,0x9f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa4,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa3,0xe3,0x81,0x93,0xe3,0x81,0x97,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa3,0xe3,0x81,0x97,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa4,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x81,0xb2,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa3,0xe3,0x81,0x99,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa4,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x9a,0xe3,0x81,0xa3,0xe3,0x81,0x9f,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x9a,0xe3,0x81,0xa3,0xe3,0x81,0xa1,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa4,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xa8,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xaa,0xe3,0x81,0xbe,0xe3,0x81,0xa4,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xaa,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xad,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xaf,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xb2,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xbe,0xe3,0x82,0x8f,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xbe,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x81,0xbf,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x81,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x81,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x97,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x84,0xe3,0x81,0x91,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x84,0xe3,0x81,0x99,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x82,0x87,0xe3,0x81,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x89,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0xaa,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x89,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8a,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8b,0xe3,0x81,0xbe,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8b,0xe3,0x82,0x84,0xe3,0x81,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8d,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8d,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x8d,0xe3,0x82,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x85,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x9a,0xe3,0x82,0x93,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x93,0xe3,0x81,0xaf,0xe3,0x82,0x9a,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x84,0xe3,0x81,0x86,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x86,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x86,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x9a,0xe3,0x81,0x86,0xe3,0x81,0x9f,0xe3,0x82,0x8d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x86,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x86,0xe3,0x81,0xb5,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x8f,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x8f,0xe3,0x82,0x8d,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x97,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x99,0xe3,0x81,0xbe,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x9b,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x9f,0xe3,0x81,0xab,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb5,0xe3,0x81,0x9f,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xa1,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xa4,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xa4,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xa3,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xa8,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xa8,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xaf,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xb2,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xb8,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xbe,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x81,0xbf,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x81,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x81,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x8a,0xe3,0x81,0x93,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x8a,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x93,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8f,0xe3,0x82,0x99,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0xbb,0xe3,0x82,0x9a,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x95,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x83,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x9d,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0x9f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x81,0xad,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x84,0xe3,0x82,0x8f,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x8d,0xe3,0x81,0x8b,0xe3,0x82,0x99,0, - 0xe3,0x81,0xb8,0xe3,0x81,0x93,0xe3,0x82,0x80,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x81,0xab,0xe3,0x81,0x84,0xe3,0x82,0x8d,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x81,0xab,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x82,0x99,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x89,0xe3,0x81,0x99,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x81,0x97,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x81,0xb8,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x82,0x87,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x86,0xe3,0x81,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x86,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x86,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x86,0xe3,0x82,0x82,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x86,0xe3,0x82,0x8a,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x8a,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x8f,0xe3,0x82,0x8d,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x91,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x93,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x97,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x97,0xe3,0x82,0x85,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x97,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x9d,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x9f,0xe3,0x81,0xa6,0, - 0xe3,0x81,0xbb,0xe3,0x81,0x9f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x9a,0xe3,0x81,0xa1,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0x8f,0xe3,0x82,0x8d,0, - 0xe3,0x81,0xbb,0xe3,0x81,0xa3,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbb,0xe3,0x81,0xa3,0xe3,0x81,0x95,0, - 0xe3,0x81,0xbb,0xe3,0x81,0xa3,0xe3,0x81,0x9f,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbb,0xe3,0x81,0xa8,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x82,0x99,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x93,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x93,0xe3,0x81,0x8d,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x93,0xe3,0x81,0x91,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xbb,0xe3,0x82,0x93,0xe3,0x82,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x84,0xe3,0x81,0xab,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x8b,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x93,0xe3,0x81,0xa8,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x95,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x81,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbe,0xe3,0x81,0x9b,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbe,0xe3,0x81,0xa4,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xbe,0xe3,0x81,0xa8,0xe3,0x82,0x81,0, - 0xe3,0x81,0xbe,0xe3,0x81,0xaa,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x81,0xbe,0xe3,0x81,0xac,0xe3,0x81,0x91,0, - 0xe3,0x81,0xbe,0xe3,0x81,0xad,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbe,0xe3,0x81,0xbb,0xe3,0x81,0x86,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x82,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x86,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x8d,0xe3,0x82,0x84,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x8f,0xe3,0x81,0x99,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x8f,0xe3,0x82,0x8a,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x8f,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x93,0xe3,0x81,0x8b,0xe3,0x82,0x99,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x81,0xa4,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbe,0xe3,0x82,0x93,0xe3,0x81,0xaa,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x84,0xe3,0x82,0x89,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x86,0xe3,0x81,0xa1,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x8b,0xe3,0x81,0x9f,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x93,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x99,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x99,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xa4,0xe3,0x81,0x8b,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xa4,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xa8,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xaa,0xe3,0x81,0xa8,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xaa,0xe3,0x81,0xbf,0xe3,0x81,0x8b,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xad,0xe3,0x82,0x89,0xe3,0x82,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xae,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x81,0xbf,0xe3,0x81,0xbb,0xe3,0x82,0x93,0, - 0xe3,0x81,0xbf,0xe3,0x82,0x82,0xe3,0x81,0xa8,0, - 0xe3,0x81,0xbf,0xe3,0x82,0x84,0xe3,0x81,0x91,0xe3,0x82,0x99,0, - 0xe3,0x81,0xbf,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x81,0xbf,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbf,0xe3,0x82,0x8f,0xe3,0x81,0x8f,0, - 0xe3,0x81,0xbf,0xe3,0x82,0x93,0xe3,0x81,0x8b,0, - 0xe3,0x81,0xbf,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x80,0xe3,0x81,0x84,0xe3,0x81,0x8b,0, - 0xe3,0x82,0x80,0xe3,0x81,0x88,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x80,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x82,0x80,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x82,0x80,0xe3,0x81,0x8b,0xe3,0x81,0x86,0, - 0xe3,0x82,0x80,0xe3,0x81,0x8b,0xe3,0x81,0x88,0, - 0xe3,0x82,0x80,0xe3,0x81,0x8b,0xe3,0x81,0x97,0, - 0xe3,0x82,0x80,0xe3,0x81,0x8d,0xe3,0x82,0x99,0xe3,0x81,0xa1,0xe3,0x82,0x83,0, - 0xe3,0x82,0x80,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x80,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x82,0x80,0xe3,0x81,0x95,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x80,0xe3,0x81,0x97,0xe3,0x81,0x82,0xe3,0x81,0xa4,0xe3,0x81,0x84,0, - 0xe3,0x82,0x80,0xe3,0x81,0x97,0xe3,0x81,0xaf,0xe3,0x82,0x99,0, - 0xe3,0x82,0x80,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x85,0xe3,0x82,0x93,0, - 0xe3,0x82,0x80,0xe3,0x81,0x97,0xe3,0x82,0x8d,0, - 0xe3,0x82,0x80,0xe3,0x81,0x99,0xe3,0x81,0x86,0, - 0xe3,0x82,0x80,0xe3,0x81,0x99,0xe3,0x81,0x93,0, - 0xe3,0x82,0x80,0xe3,0x81,0x99,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x82,0x80,0xe3,0x81,0x99,0xe3,0x82,0x81,0, - 0xe3,0x82,0x80,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x80,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x82,0x80,0xe3,0x81,0xa1,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x82,0x80,0xe3,0x81,0xaa,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x82,0x80,0xe3,0x81,0xae,0xe3,0x81,0x86,0, - 0xe3,0x82,0x80,0xe3,0x82,0x84,0xe3,0x81,0xbf,0, - 0xe3,0x82,0x80,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x82,0x80,0xe3,0x82,0x89,0xe3,0x81,0x95,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x80,0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0, - 0xe3,0x82,0x80,0xe3,0x82,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x82,0xe3,0x82,0x93,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x86,0xe3,0x82,0x93,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x97,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x82,0x8c,0xe3,0x81,0x84,0, - 0xe3,0x82,0x81,0xe3,0x81,0x84,0xe3,0x82,0x8f,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x81,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x81,0xbe,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x81,0xe3,0x81,0x95,0xe3,0x82,0x99,0xe3,0x81,0x99,0, - 0xe3,0x82,0x81,0xe3,0x81,0x97,0xe3,0x81,0x9f,0, - 0xe3,0x82,0x81,0xe3,0x81,0x99,0xe3,0x82,0x99,0xe3,0x82,0x89,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x82,0x81,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x81,0xe3,0x81,0xbe,0xe3,0x81,0x84,0, - 0xe3,0x82,0x81,0xe3,0x82,0x84,0xe3,0x81,0x99,0, - 0xe3,0x82,0x81,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x87,0, - 0xe3,0x82,0x81,0xe3,0x82,0x93,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x81,0xe3,0x82,0x93,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x82,0x82,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x81,0x82,0xe3,0x81,0x91,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x82,0xe3,0x81,0x86,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x82,0x82,0xe3,0x81,0x88,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x82,0xe3,0x81,0x8f,0xe3,0x81,0x97,0, - 0xe3,0x82,0x82,0xe3,0x81,0x8f,0xe3,0x81,0xa6,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x82,0xe3,0x81,0x8f,0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0, - 0xe3,0x82,0x82,0xe3,0x81,0xa1,0xe3,0x82,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x82,0x82,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x82,0xe3,0x82,0x89,0xe3,0x81,0x86,0, - 0xe3,0x82,0x82,0xe3,0x82,0x93,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x82,0xe3,0x82,0x93,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x82,0x84,0xe3,0x81,0x8a,0xe3,0x82,0x84,0, - 0xe3,0x82,0x84,0xe3,0x81,0x91,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x84,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x82,0x84,0xe3,0x81,0x95,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x82,0x84,0xe3,0x81,0x99,0xe3,0x81,0x84,0, - 0xe3,0x82,0x84,0xe3,0x81,0x99,0xe3,0x81,0x9f,0xe3,0x82,0x8d,0xe3,0x81,0x86,0, - 0xe3,0x82,0x84,0xe3,0x81,0x99,0xe3,0x81,0xbf,0, - 0xe3,0x82,0x84,0xe3,0x81,0x9b,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x84,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x82,0x84,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x82,0x84,0xe3,0x81,0xa1,0xe3,0x82,0x93,0, - 0xe3,0x82,0x84,0xe3,0x81,0xa3,0xe3,0x81,0xa8,0, - 0xe3,0x82,0x84,0xe3,0x81,0xa3,0xe3,0x81,0xaf,0xe3,0x82,0x9a,0xe3,0x82,0x8a,0, - 0xe3,0x82,0x84,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x84,0xe3,0x82,0x81,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x84,0xe3,0x82,0x84,0xe3,0x81,0x93,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x82,0x84,0xe3,0x82,0x88,0xe3,0x81,0x84,0, - 0xe3,0x82,0x84,0xe3,0x82,0x8f,0xe3,0x82,0x89,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x82,0x86,0xe3,0x81,0x86,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x86,0xe3,0x81,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x87,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x86,0xe3,0x81,0x86,0xe3,0x81,0xb8,0xe3,0x82,0x99,0, - 0xe3,0x82,0x86,0xe3,0x81,0x86,0xe3,0x82,0x81,0xe3,0x81,0x84,0, - 0xe3,0x82,0x86,0xe3,0x81,0x91,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x86,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x86,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x82,0x86,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x82,0x86,0xe3,0x81,0x9f,0xe3,0x81,0x8b,0, - 0xe3,0x82,0x86,0xe3,0x81,0xa1,0xe3,0x82,0x83,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x86,0xe3,0x81,0xa6,0xe3,0x82,0x99,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x86,0xe3,0x81,0xab,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x82,0x86,0xe3,0x81,0xb2,0xe3,0x82,0x99,0xe3,0x82,0x8f,0, - 0xe3,0x82,0x86,0xe3,0x82,0x89,0xe3,0x81,0x84,0, - 0xe3,0x82,0x86,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0x84,0, - 0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0x8b,0, - 0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0x8d,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0x99,0, - 0xe3,0x82,0x88,0xe3,0x81,0x86,0xe3,0x81,0xa1,0xe3,0x81,0x88,0xe3,0x82,0x93,0, - 0xe3,0x82,0x88,0xe3,0x81,0x8b,0xe3,0x81,0x9b,0xe3,0x82,0x99,0, - 0xe3,0x82,0x88,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x82,0x88,0xe3,0x81,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x82,0x88,0xe3,0x81,0x8f,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x82,0x88,0xe3,0x81,0x8f,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x82,0x88,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x82,0x88,0xe3,0x81,0x93,0xe3,0x82,0x99,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x88,0xe3,0x81,0x95,0xe3,0x82,0x93,0, - 0xe3,0x82,0x88,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x82,0x88,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x82,0x88,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x88,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0, - 0xe3,0x82,0x88,0xe3,0x81,0xa6,0xe3,0x81,0x84,0, - 0xe3,0x82,0x88,0xe3,0x81,0xa8,0xe3,0x82,0x99,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8f,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x88,0xe3,0x81,0xad,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x88,0xe3,0x82,0x84,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x88,0xe3,0x82,0x86,0xe3,0x81,0x86,0, - 0xe3,0x82,0x88,0xe3,0x82,0x8d,0xe3,0x81,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0, - 0xe3,0x82,0x88,0xe3,0x82,0x8d,0xe3,0x81,0x97,0xe3,0x81,0x84,0, - 0xe3,0x82,0x89,0xe3,0x81,0x84,0xe3,0x81,0x86,0, - 0xe3,0x82,0x89,0xe3,0x81,0x8f,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x89,0xe3,0x81,0x8f,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x82,0x89,0xe3,0x81,0x8f,0xe3,0x81,0x95,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x89,0xe3,0x81,0x8f,0xe3,0x81,0x9f,0xe3,0x82,0x99,0, - 0xe3,0x82,0x89,0xe3,0x81,0x97,0xe3,0x82,0x93,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x82,0x89,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x82,0x89,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x89,0xe3,0x81,0x9f,0xe3,0x81,0x84,0, - 0xe3,0x82,0x89,0xe3,0x81,0xa3,0xe3,0x81,0x8b,0, - 0xe3,0x82,0x89,0xe3,0x82,0x8c,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x88,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x8b,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x8d,0xe3,0x81,0x95,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x8d,0xe3,0x81,0x9b,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x8f,0xe3,0x81,0x8f,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x8f,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x91,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x9d,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8a,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x8a,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8a,0xe3,0x81,0xad,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x86,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x85,0xe3,0x81,0x86,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x88,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x86,0xe3,0x82,0x8a,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x8f,0xe3,0x81,0xa1,0xe3,0x82,0x83,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x87,0xe3,0x81,0x93,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x8a,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x8c,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x8d,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8a,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x82,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x97,0xe3,0x82,0x99,0, - 0xe3,0x82,0x8b,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x8d,0, - 0xe3,0x82,0x8b,0xe3,0x81,0x99,0xe3,0x81,0xaf,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8b,0xe3,0x82,0x8a,0xe3,0x81,0x8b,0xe3,0x82,0x99,0xe3,0x82,0x8f,0xe3,0x82,0x89,0, - 0xe3,0x82,0x8c,0xe3,0x81,0x84,0xe3,0x81,0x8b,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8c,0xe3,0x81,0x84,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x82,0x8c,0xe3,0x81,0x84,0xe3,0x81,0x9b,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8c,0xe3,0x81,0x84,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x81,0x93,0, - 0xe3,0x82,0x8c,0xe3,0x81,0x84,0xe3,0x81,0xa8,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8c,0xe3,0x81,0x84,0xe3,0x81,0xbb,0xe3,0x82,0x99,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8c,0xe3,0x81,0x8d,0xe3,0x81,0x97,0, - 0xe3,0x82,0x8c,0xe3,0x81,0x8d,0xe3,0x81,0x9f,0xe3,0x82,0x99,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8c,0xe3,0x82,0x93,0xe3,0x81,0x82,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8c,0xe3,0x82,0x93,0xe3,0x81,0x91,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8c,0xe3,0x82,0x93,0xe3,0x81,0x93,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8c,0xe3,0x82,0x93,0xe3,0x81,0x95,0xe3,0x81,0x84,0, - 0xe3,0x82,0x8c,0xe3,0x82,0x93,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8c,0xe3,0x82,0x93,0xe3,0x81,0x9d,0xe3,0x82,0x99,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x8c,0xe3,0x82,0x93,0xe3,0x82,0x89,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x86,0xe3,0x81,0x8b,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x86,0xe3,0x81,0x93,0xe3,0x82,0x99,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x86,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x86,0xe3,0x81,0x9d,0xe3,0x81,0x8f,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x8f,0xe3,0x81,0x8b,0xe3,0x82,0x99,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x93,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0x86,0xe3,0x82,0x89,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x97,0xe3,0x82,0x85,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x8d,0xe3,0x81,0x9b,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8d,0xe3,0x81,0xa6,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8d,0xe3,0x82,0x81,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8d,0xe3,0x82,0x8c,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x8d,0xe3,0x82,0x93,0xe3,0x81,0x8d,0xe3,0x82,0x99,0, - 0xe3,0x82,0x8d,0xe3,0x82,0x93,0xe3,0x81,0xaf,0xe3,0x82,0x9a,0, - 0xe3,0x82,0x8d,0xe3,0x82,0x93,0xe3,0x81,0xb5,0xe3,0x82,0x99,0xe3,0x82,0x93,0, - 0xe3,0x82,0x8d,0xe3,0x82,0x93,0xe3,0x82,0x8a,0, - 0xe3,0x82,0x8f,0xe3,0x81,0x8b,0xe3,0x81,0x99,0, - 0xe3,0x82,0x8f,0xe3,0x81,0x8b,0xe3,0x82,0x81,0, - 0xe3,0x82,0x8f,0xe3,0x81,0x8b,0xe3,0x82,0x84,0xe3,0x81,0xbe,0, - 0xe3,0x82,0x8f,0xe3,0x81,0x8b,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, - 0xe3,0x82,0x8f,0xe3,0x81,0x97,0xe3,0x81,0xa4,0, - 0xe3,0x82,0x8f,0xe3,0x81,0x97,0xe3,0x82,0x99,0xe3,0x81,0xbe,0xe3,0x81,0x97,0, - 0xe3,0x82,0x8f,0xe3,0x81,0x99,0xe3,0x82,0x8c,0xe3,0x82,0x82,0xe3,0x81,0xae,0, - 0xe3,0x82,0x8f,0xe3,0x82,0x89,0xe3,0x81,0x86,0, - 0xe3,0x82,0x8f,0xe3,0x82,0x8c,0xe3,0x82,0x8b,0, -}; -#define jp ((const char*)jp_) -static const char *jp_i[] = { - jp+0, jp+19, jp+32, jp+45, jp+61, jp+77, - jp+87, jp+103, jp+113, jp+132, jp+142, jp+152, - jp+165, jp+181, jp+197, jp+210, jp+223, jp+236, - jp+252, jp+268, jp+278, jp+288, jp+301, jp+317, - jp+330, jp+343, jp+353, jp+369, jp+379, jp+392, - jp+405, jp+418, jp+428, jp+441, jp+457, jp+467, - jp+480, jp+493, jp+506, jp+516, jp+535, jp+545, - jp+561, jp+577, jp+590, jp+603, jp+622, jp+635, - jp+648, jp+658, jp+674, jp+684, jp+700, jp+713, - jp+726, jp+739, jp+755, jp+765, jp+778, jp+791, - jp+804, jp+817, jp+830, jp+840, jp+853, jp+869, - jp+885, jp+895, jp+905, jp+915, jp+925, jp+941, - jp+951, jp+961, jp+977, jp+993, jp+1009, jp+1022, - jp+1035, jp+1045, jp+1061, jp+1074, jp+1084, jp+1097, - jp+1113, jp+1132, jp+1145, jp+1158, jp+1174, jp+1184, - jp+1197, jp+1210, jp+1223, jp+1236, jp+1249, jp+1262, - jp+1278, jp+1288, jp+1304, jp+1317, jp+1330, jp+1343, - jp+1353, jp+1366, jp+1382, jp+1395, jp+1405, jp+1418, - jp+1428, jp+1438, jp+1448, jp+1461, jp+1471, jp+1481, - jp+1491, jp+1504, jp+1514, jp+1527, jp+1537, jp+1547, - jp+1557, jp+1567, jp+1577, jp+1590, jp+1603, jp+1613, - jp+1629, jp+1639, jp+1652, jp+1662, jp+1672, jp+1685, - jp+1701, jp+1714, jp+1724, jp+1737, jp+1747, jp+1769, - jp+1779, jp+1789, jp+1802, jp+1815, jp+1828, jp+1850, - jp+1863, jp+1879, jp+1892, jp+1902, jp+1912, jp+1925, - jp+1938, jp+1951, jp+1967, jp+1977, jp+1993, jp+2006, - jp+2025, jp+2038, jp+2051, jp+2064, jp+2074, jp+2090, - jp+2103, jp+2113, jp+2126, jp+2139, jp+2158, jp+2168, - jp+2181, jp+2200, jp+2213, jp+2223, jp+2239, jp+2255, - jp+2265, jp+2278, jp+2291, jp+2307, jp+2323, jp+2333, - jp+2346, jp+2359, jp+2372, jp+2388, jp+2398, jp+2408, - jp+2418, jp+2434, jp+2453, jp+2466, jp+2476, jp+2486, - jp+2499, jp+2509, jp+2528, jp+2544, jp+2557, jp+2573, - jp+2586, jp+2599, jp+2612, jp+2625, jp+2635, jp+2645, - jp+2655, jp+2665, jp+2678, jp+2691, jp+2704, jp+2720, - jp+2733, jp+2746, jp+2762, jp+2775, jp+2788, jp+2804, - jp+2817, jp+2827, jp+2837, jp+2850, jp+2863, jp+2876, - jp+2889, jp+2902, jp+2912, jp+2925, jp+2938, jp+2954, - jp+2964, jp+2974, jp+2987, jp+2997, jp+3007, jp+3020, - jp+3030, jp+3043, jp+3056, jp+3069, jp+3085, jp+3101, - jp+3117, jp+3130, jp+3146, jp+3159, jp+3175, jp+3188, - jp+3201, jp+3214, jp+3227, jp+3240, jp+3253, jp+3266, - jp+3279, jp+3292, jp+3308, jp+3321, jp+3331, jp+3341, - jp+3351, jp+3370, jp+3380, jp+3393, jp+3406, jp+3419, - jp+3432, jp+3445, jp+3461, jp+3471, jp+3484, jp+3503, - jp+3522, jp+3532, jp+3545, jp+3555, jp+3568, jp+3578, - jp+3591, jp+3604, jp+3617, jp+3630, jp+3643, jp+3659, - jp+3675, jp+3688, jp+3701, jp+3714, jp+3730, jp+3740, - jp+3756, jp+3769, jp+3779, jp+3789, jp+3805, jp+3821, - jp+3837, jp+3850, jp+3869, jp+3885, jp+3898, jp+3917, - jp+3933, jp+3943, jp+3956, jp+3969, jp+3979, jp+3995, - jp+4011, jp+4027, jp+4037, jp+4053, jp+4066, jp+4079, - jp+4092, jp+4108, jp+4124, jp+4143, jp+4153, jp+4166, - jp+4179, jp+4195, jp+4211, jp+4224, jp+4237, jp+4256, - jp+4272, jp+4294, jp+4307, jp+4320, jp+4333, jp+4346, - jp+4362, jp+4375, jp+4388, jp+4404, jp+4414, jp+4424, - jp+4434, jp+4447, jp+4460, jp+4473, jp+4486, jp+4499, - jp+4512, jp+4525, jp+4541, jp+4551, jp+4561, jp+4577, - jp+4596, jp+4612, jp+4628, jp+4647, jp+4666, jp+4676, - jp+4689, jp+4702, jp+4712, jp+4725, jp+4735, jp+4751, - jp+4767, jp+4777, jp+4793, jp+4803, jp+4813, jp+4823, - jp+4833, jp+4843, jp+4856, jp+4869, jp+4882, jp+4895, - jp+4908, jp+4921, jp+4931, jp+4950, jp+4960, jp+4970, - jp+4980, jp+4993, jp+5003, jp+5013, jp+5023, jp+5033, - jp+5043, jp+5053, jp+5063, jp+5073, jp+5083, jp+5099, - jp+5109, jp+5125, jp+5141, jp+5157, jp+5167, jp+5180, - jp+5190, jp+5200, jp+5210, jp+5220, jp+5236, jp+5261, - jp+5274, jp+5299, jp+5324, jp+5349, jp+5359, jp+5369, - jp+5379, jp+5389, jp+5399, jp+5412, jp+5425, jp+5438, - jp+5451, jp+5464, jp+5480, jp+5493, jp+5503, jp+5513, - jp+5526, jp+5539, jp+5549, jp+5562, jp+5572, jp+5588, - jp+5598, jp+5608, jp+5621, jp+5631, jp+5647, jp+5657, - jp+5667, jp+5680, jp+5693, jp+5703, jp+5713, jp+5723, - jp+5745, jp+5755, jp+5774, jp+5784, jp+5794, jp+5804, - jp+5814, jp+5833, jp+5843, jp+5862, jp+5872, jp+5882, - jp+5892, jp+5902, jp+5912, jp+5922, jp+5935, jp+5948, - jp+5964, jp+5983, jp+5999, jp+6018, jp+6031, jp+6044, - jp+6057, jp+6067, jp+6083, jp+6096, jp+6112, jp+6125, - jp+6141, jp+6154, jp+6167, jp+6177, jp+6190, jp+6203, - jp+6216, jp+6226, jp+6236, jp+6252, jp+6262, jp+6275, - jp+6288, jp+6301, jp+6320, jp+6333, jp+6343, jp+6362, - jp+6378, jp+6397, jp+6410, jp+6423, jp+6436, jp+6452, - jp+6468, jp+6484, jp+6497, jp+6507, jp+6520, jp+6530, - jp+6540, jp+6556, jp+6572, jp+6582, jp+6598, jp+6608, - jp+6624, jp+6634, jp+6644, jp+6654, jp+6667, jp+6683, - jp+6702, jp+6718, jp+6731, jp+6741, jp+6754, jp+6767, - jp+6777, jp+6790, jp+6812, jp+6825, jp+6850, jp+6863, - jp+6873, jp+6886, jp+6902, jp+6915, jp+6934, jp+6953, - jp+6969, jp+6985, jp+6998, jp+7014, jp+7027, jp+7052, - jp+7068, jp+7078, jp+7094, jp+7104, jp+7120, jp+7133, - jp+7146, jp+7159, jp+7178, jp+7191, jp+7204, jp+7214, - jp+7227, jp+7240, jp+7256, jp+7269, jp+7282, jp+7295, - jp+7317, jp+7333, jp+7346, jp+7362, jp+7378, jp+7388, - jp+7401, jp+7411, jp+7421, jp+7431, jp+7444, jp+7454, - jp+7464, jp+7477, jp+7493, jp+7509, jp+7519, jp+7532, - jp+7542, jp+7552, jp+7562, jp+7572, jp+7585, jp+7598, - jp+7608, jp+7621, jp+7631, jp+7641, jp+7654, jp+7670, - jp+7683, jp+7696, jp+7712, jp+7725, jp+7741, jp+7754, - jp+7767, jp+7780, jp+7793, jp+7806, jp+7825, jp+7835, - jp+7848, jp+7861, jp+7874, jp+7884, jp+7897, jp+7907, - jp+7923, jp+7936, jp+7949, jp+7962, jp+7975, jp+7994, - jp+8010, jp+8023, jp+8036, jp+8049, jp+8062, jp+8078, - jp+8091, jp+8104, jp+8117, jp+8130, jp+8143, jp+8159, - jp+8172, jp+8185, jp+8201, jp+8217, jp+8230, jp+8243, - jp+8253, jp+8263, jp+8276, jp+8292, jp+8305, jp+8318, - jp+8331, jp+8344, jp+8357, jp+8370, jp+8383, jp+8393, - jp+8403, jp+8416, jp+8426, jp+8436, jp+8446, jp+8456, - jp+8466, jp+8476, jp+8489, jp+8505, jp+8515, jp+8528, - jp+8538, jp+8551, jp+8561, jp+8574, jp+8590, jp+8603, - jp+8613, jp+8623, jp+8639, jp+8649, jp+8662, jp+8672, - jp+8688, jp+8701, jp+8714, jp+8724, jp+8734, jp+8747, - jp+8763, jp+8773, jp+8783, jp+8799, jp+8821, jp+8834, - jp+8850, jp+8863, jp+8873, jp+8889, jp+8902, jp+8912, - jp+8922, jp+8932, jp+8942, jp+8952, jp+8962, jp+8975, - jp+8985, jp+8995, jp+9005, jp+9024, jp+9037, jp+9050, - jp+9063, jp+9076, jp+9089, jp+9099, jp+9115, jp+9128, - jp+9144, jp+9157, jp+9170, jp+9186, jp+9202, jp+9215, - jp+9225, jp+9238, jp+9251, jp+9267, jp+9280, jp+9293, - jp+9312, jp+9325, jp+9338, jp+9351, jp+9367, jp+9386, - jp+9399, jp+9418, jp+9428, jp+9441, jp+9454, jp+9464, - jp+9477, jp+9490, jp+9506, jp+9516, jp+9529, jp+9539, - jp+9549, jp+9559, jp+9575, jp+9588, jp+9598, jp+9611, - jp+9627, jp+9640, jp+9659, jp+9675, jp+9688, jp+9704, - jp+9720, jp+9736, jp+9752, jp+9762, jp+9775, jp+9785, - jp+9798, jp+9808, jp+9818, jp+9828, jp+9841, jp+9857, - jp+9870, jp+9880, jp+9893, jp+9903, jp+9916, jp+9932, - jp+9942, jp+9952, jp+9974, jp+9984, jp+9994, jp+10004, - jp+10017, jp+10036, jp+10049, jp+10059, jp+10072, jp+10082, - jp+10098, jp+10111, jp+10124, jp+10140, jp+10153, jp+10166, - jp+10176, jp+10186, jp+10196, jp+10206, jp+10219, jp+10229, - jp+10242, jp+10258, jp+10271, jp+10281, jp+10291, jp+10301, - jp+10311, jp+10321, jp+10331, jp+10341, jp+10354, jp+10367, - jp+10377, jp+10393, jp+10406, jp+10419, jp+10429, jp+10439, - jp+10452, jp+10465, jp+10478, jp+10491, jp+10504, jp+10514, - jp+10524, jp+10534, jp+10547, jp+10563, jp+10579, jp+10592, - jp+10602, jp+10612, jp+10622, jp+10635, jp+10648, jp+10658, - jp+10674, jp+10684, jp+10697, jp+10707, jp+10720, jp+10730, - jp+10746, jp+10756, jp+10766, jp+10776, jp+10786, jp+10796, - jp+10806, jp+10819, jp+10835, jp+10845, jp+10855, jp+10865, - jp+10878, jp+10891, jp+10904, jp+10926, jp+10942, jp+10958, - jp+10971, jp+10981, jp+10997, jp+11010, jp+11023, jp+11036, - jp+11049, jp+11065, jp+11081, jp+11094, jp+11107, jp+11120, - jp+11133, jp+11152, jp+11168, jp+11184, jp+11200, jp+11210, - jp+11226, jp+11248, jp+11264, jp+11280, jp+11296, jp+11312, - jp+11325, jp+11338, jp+11354, jp+11364, jp+11377, jp+11396, - jp+11415, jp+11428, jp+11441, jp+11454, jp+11464, jp+11474, - jp+11487, jp+11500, jp+11510, jp+11523, jp+11542, jp+11561, - jp+11577, jp+11593, jp+11606, jp+11622, jp+11632, jp+11642, - jp+11655, jp+11665, jp+11678, jp+11688, jp+11701, jp+11717, - jp+11727, jp+11740, jp+11753, jp+11769, jp+11782, jp+11792, - jp+11802, jp+11812, jp+11822, jp+11835, jp+11854, jp+11870, - jp+11889, jp+11902, jp+11912, jp+11925, jp+11938, jp+11951, - jp+11964, jp+11974, jp+11984, jp+11994, jp+12004, jp+12017, - jp+12027, jp+12046, jp+12059, jp+12069, jp+12085, jp+12101, - jp+12117, jp+12130, jp+12146, jp+12159, jp+12172, jp+12182, - jp+12198, jp+12211, jp+12221, jp+12231, jp+12250, jp+12260, - jp+12270, jp+12283, jp+12293, jp+12303, jp+12316, jp+12332, - jp+12345, jp+12358, jp+12371, jp+12390, jp+12406, jp+12422, - jp+12438, jp+12454, jp+12467, jp+12483, jp+12496, jp+12509, - jp+12519, jp+12532, jp+12545, jp+12558, jp+12571, jp+12581, - jp+12591, jp+12601, jp+12614, jp+12624, jp+12640, jp+12650, - jp+12663, jp+12673, jp+12686, jp+12696, jp+12712, jp+12728, - jp+12741, jp+12754, jp+12767, jp+12780, jp+12793, jp+12806, - jp+12822, jp+12835, jp+12848, jp+12861, jp+12874, jp+12890, - jp+12906, jp+12925, jp+12935, jp+12957, jp+12970, jp+12983, - jp+12996, jp+13009, jp+13022, jp+13041, jp+13054, jp+13064, - jp+13074, jp+13093, jp+13103, jp+13128, jp+13138, jp+13151, - jp+13164, jp+13180, jp+13193, jp+13206, jp+13219, jp+13229, - jp+13242, jp+13252, jp+13265, jp+13278, jp+13288, jp+13301, - jp+13314, jp+13324, jp+13334, jp+13344, jp+13357, jp+13373, - jp+13383, jp+13396, jp+13409, jp+13428, jp+13441, jp+13454, - jp+13467, jp+13477, jp+13493, jp+13509, jp+13522, jp+13532, - jp+13545, jp+13558, jp+13571, jp+13581, jp+13591, jp+13601, - jp+13614, jp+13624, jp+13637, jp+13653, jp+13666, jp+13676, - jp+13689, jp+13702, jp+13718, jp+13731, jp+13747, jp+13763, - jp+13779, jp+13798, jp+13811, jp+13821, jp+13834, jp+13847, - jp+13860, jp+13873, jp+13892, jp+13902, jp+13918, jp+13931, - jp+13941, jp+13957, jp+13985, jp+14001, jp+14014, jp+14027, - jp+14043, jp+14059, jp+14072, jp+14094, jp+14107, jp+14120, - jp+14133, jp+14146, jp+14165, jp+14178, jp+14191, jp+14201, - jp+14223, jp+14242, jp+14252, jp+14265, jp+14278, jp+14291, - jp+14301, jp+14317, jp+14327, jp+14340, jp+14350, jp+14360, - jp+14370, jp+14380, jp+14393, jp+14403, jp+14413, jp+14426, - jp+14439, jp+14449, jp+14462, jp+14472, jp+14488, jp+14507, - jp+14520, jp+14539, jp+14555, jp+14568, jp+14578, jp+14594, - jp+14604, jp+14620, jp+14636, jp+14655, jp+14668, jp+14687, - jp+14703, jp+14713, jp+14726, jp+14742, jp+14752, jp+14762, - jp+14775, jp+14785, jp+14798, jp+14811, jp+14824, jp+14837, - jp+14847, jp+14860, jp+14873, jp+14883, jp+14893, jp+14903, - jp+14916, jp+14926, jp+14936, jp+14961, jp+14974, jp+14984, - jp+14994, jp+15004, jp+15017, jp+15030, jp+15046, jp+15062, - jp+15072, jp+15085, jp+15095, jp+15105, jp+15118, jp+15131, - jp+15144, jp+15169, jp+15185, jp+15198, jp+15211, jp+15224, - jp+15237, jp+15250, jp+15263, jp+15276, jp+15292, jp+15305, - jp+15321, jp+15340, jp+15353, jp+15366, jp+15382, jp+15395, - jp+15408, jp+15418, jp+15428, jp+15438, jp+15451, jp+15461, - jp+15471, jp+15481, jp+15494, jp+15504, jp+15520, jp+15530, - jp+15540, jp+15550, jp+15560, jp+15576, jp+15586, jp+15596, - jp+15606, jp+15616, jp+15629, jp+15645, jp+15655, jp+15665, - jp+15675, jp+15685, jp+15695, jp+15708, jp+15724, jp+15734, - jp+15744, jp+15754, jp+15770, jp+15786, jp+15808, jp+15821, - jp+15837, jp+15850, jp+15869, jp+15879, jp+15889, jp+15905, - jp+15918, jp+15931, jp+15941, jp+15954, jp+15967, jp+15977, - jp+15990, jp+16000, jp+16019, jp+16032, jp+16042, jp+16052, - jp+16065, jp+16075, jp+16085, jp+16095, jp+16105, jp+16118, - jp+16131, jp+16144, jp+16157, jp+16167, jp+16180, jp+16196, - jp+16206, jp+16222, jp+16232, jp+16245, jp+16261, jp+16271, - jp+16281, jp+16294, jp+16304, jp+16314, jp+16324, jp+16337, - jp+16350, jp+16363, jp+16373, jp+16383, jp+16393, jp+16403, - jp+16416, jp+16426, jp+16436, jp+16449, jp+16462, jp+16475, - jp+16485, jp+16498, jp+16511, jp+16524, jp+16537, jp+16553, - jp+16566, jp+16582, jp+16592, jp+16605, jp+16618, jp+16631, - jp+16650, jp+16669, jp+16682, jp+16692, jp+16702, jp+16718, - jp+16731, jp+16747, jp+16763, jp+16779, jp+16795, jp+16805, - jp+16821, jp+16831, jp+16847, jp+16860, jp+16870, jp+16886, - jp+16899, jp+16915, jp+16925, jp+16935, jp+16954, jp+16970, - jp+16986, jp+16996, jp+17009, jp+17019, jp+17032, jp+17048, - jp+17061, jp+17074, jp+17084, jp+17097, jp+17110, jp+17126, - jp+17139, jp+17149, jp+17162, jp+17175, jp+17188, jp+17201, - jp+17214, jp+17230, jp+17255, jp+17268, jp+17287, jp+17306, - jp+17319, jp+17332, jp+17342, jp+17358, jp+17374, jp+17390, - jp+17400, jp+17416, jp+17426, jp+17436, jp+17446, jp+17456, - jp+17466, jp+17476, jp+17486, jp+17499, jp+17515, jp+17525, - jp+17541, jp+17554, jp+17564, jp+17580, jp+17590, jp+17600, - jp+17610, jp+17620, jp+17636, jp+17646, jp+17656, jp+17669, - jp+17685, jp+17698, jp+17714, jp+17730, jp+17746, jp+17762, - jp+17772, jp+17785, jp+17795, jp+17808, jp+17821, jp+17843, - jp+17853, jp+17863, jp+17873, jp+17889, jp+17899, jp+17918, - jp+17931, jp+17944, jp+17963, jp+17976, jp+17989, jp+18002, - jp+18012, jp+18025, jp+18038, jp+18048, jp+18061, jp+18071, - jp+18084, jp+18100, jp+18110, jp+18129, jp+18142, jp+18158, - jp+18171, jp+18187, jp+18200, jp+18210, jp+18220, jp+18233, - jp+18246, jp+18256, jp+18266, jp+18279, jp+18292, jp+18302, - jp+18312, jp+18322, jp+18335, jp+18348, jp+18358, jp+18374, - jp+18390, jp+18400, jp+18416, jp+18426, jp+18436, jp+18446, - jp+18459, jp+18472, jp+18485, jp+18498, jp+18511, jp+18533, - jp+18543, jp+18556, jp+18575, jp+18594, jp+18604, jp+18614, - jp+18627, jp+18640, jp+18653, jp+18669, jp+18682, jp+18695, - jp+18708, jp+18718, jp+18728, jp+18738, jp+18748, jp+18758, - jp+18774, jp+18790, jp+18803, jp+18813, jp+18823, jp+18833, - jp+18849, jp+18862, jp+18878, jp+18891, jp+18904, jp+18914, - jp+18927, jp+18940, jp+18953, jp+18966, jp+18976, jp+18989, - jp+19002, jp+19018, jp+19028, jp+19047, jp+19060, jp+19073, - jp+19083, jp+19099, jp+19109, jp+19119, jp+19135, jp+19148, - jp+19158, jp+19168, jp+19178, jp+19191, jp+19204, jp+19214, - jp+19227, jp+19237, jp+19250, jp+19266, jp+19282, jp+19295, - jp+19305, jp+19318, jp+19334, jp+19356, jp+19372, jp+19385, - jp+19398, jp+19417, jp+19427, jp+19440, jp+19450, jp+19460, - jp+19473, jp+19483, jp+19493, jp+19506, jp+19519, jp+19532, - jp+19545, jp+19558, jp+19571, jp+19584, jp+19594, jp+19610, - jp+19623, jp+19636, jp+19652, jp+19665, jp+19681, jp+19694, - jp+19707, jp+19723, jp+19736, jp+19749, jp+19765, jp+19775, - jp+19785, jp+19795, jp+19808, jp+19821, jp+19834, jp+19850, - jp+19860, jp+19873, jp+19883, jp+19896, jp+19909, jp+19922, - jp+19932, jp+19945, jp+19958, jp+19971, jp+19984, jp+19994, - jp+20004, jp+20017, jp+20027, jp+20043, jp+20056, jp+20069, - jp+20082, jp+20095, jp+20108, jp+20121, jp+20134, jp+20147, - jp+20157, jp+20176, jp+20189, jp+20199, jp+20209, jp+20219, - jp+20232, jp+20242, jp+20255, jp+20265, jp+20278, jp+20288, - jp+20298, jp+20311, jp+20324, jp+20334, jp+20344, jp+20360, - jp+20370, jp+20380, jp+20393, jp+20406, jp+20419, jp+20432, - jp+20445, jp+20458, jp+20471, jp+20484, jp+20497, jp+20510, - jp+20523, jp+20539, jp+20552, jp+20571, jp+20587, jp+20597, - jp+20610, jp+20623, jp+20639, jp+20655, jp+20668, jp+20678, - jp+20688, jp+20698, jp+20708, jp+20724, jp+20734, jp+20744, - jp+20757, jp+20770, jp+20783, jp+20799, jp+20818, jp+20828, - jp+20841, jp+20854, jp+20870, jp+20883, jp+20896, jp+20909, - jp+20922, jp+20935, jp+20948, jp+20964, jp+20980, jp+20999, - jp+21012, jp+21025, jp+21038, jp+21048, jp+21058, jp+21068, - jp+21078, jp+21088, jp+21098, jp+21108, jp+21118, jp+21128, - jp+21141, jp+21151, jp+21161, jp+21180, jp+21190, jp+21215, - jp+21225, jp+21235, jp+21245, jp+21258, jp+21271, jp+21281, - jp+21294, jp+21307, jp+21317, jp+21339, jp+21349, jp+21365, - jp+21381, jp+21397, jp+21410, jp+21420, jp+21436, jp+21452, - jp+21462, jp+21472, jp+21482, jp+21495, jp+21508, jp+21518, - jp+21531, jp+21541, jp+21551, jp+21561, jp+21577, jp+21587, - jp+21597, jp+21607, jp+21623, jp+21639, jp+21649, jp+21659, - jp+21672, jp+21682, jp+21698, jp+21708, jp+21718, jp+21728, - jp+21738, jp+21751, jp+21764, jp+21777, jp+21790, jp+21803, - jp+21816, jp+21829, jp+21845, jp+21864, jp+21874, jp+21887, - jp+21900, jp+21913, jp+21932, jp+21945, jp+21955, jp+21965, - jp+21975, jp+21985, jp+21995, jp+22011, jp+22030, jp+22040, - jp+22050, jp+22063, jp+22076, jp+22086, jp+22096, jp+22109, - jp+22119, jp+22135, jp+22145, jp+22158, jp+22168, jp+22178, - jp+22191, jp+22201, jp+22214, jp+22230, jp+22240, jp+22250, - jp+22260, jp+22270, jp+22283, jp+22293, jp+22303, jp+22313, - jp+22323, jp+22333, jp+22343, jp+22353, jp+22363, jp+22373, - jp+22386, jp+22405, jp+22421, jp+22434, jp+22450, jp+22463, - jp+22482, jp+22495, jp+22508, jp+22524, jp+22534, jp+22550, - jp+22563, jp+22573, jp+22586, jp+22599, jp+22609, jp+22622, - jp+22635, jp+22648, jp+22658, jp+22671, jp+22681, jp+22697, - jp+22722, jp+22732, jp+22745, jp+22764, jp+22783, jp+22796, - jp+22809, jp+22822, jp+22832, jp+22842, jp+22861, jp+22874, - jp+22887, jp+22900, jp+22913, jp+22926, jp+22936, jp+22946, - jp+22956, jp+22969, jp+22982, jp+22992, jp+23002, jp+23012, - jp+23022, jp+23032, jp+23042, jp+23052, jp+23062, jp+23075, - jp+23085, jp+23095, jp+23105, jp+23115, jp+23125, jp+23147, - jp+23163, jp+23173, jp+23186, jp+23202, jp+23212, jp+23222, - jp+23232, jp+23242, jp+23255, jp+23268, jp+23281, jp+23291, - jp+23304, jp+23317, jp+23327, jp+23337, jp+23347, jp+23360, - jp+23370, jp+23383, jp+23393, jp+23403, jp+23416, jp+23426, - jp+23436, jp+23446, jp+23456, jp+23469, jp+23479, jp+23492, - jp+23502, jp+23512, jp+23522, jp+23535, jp+23548, jp+23564, - jp+23577, jp+23587, jp+23597, jp+23607, jp+23620, jp+23630, - jp+23640, jp+23650, jp+23660, jp+23676, jp+23686, jp+23699, - jp+23709, jp+23719, jp+23732, jp+23745, jp+23755, jp+23768, - jp+23778, jp+23797, jp+23810, jp+23820, jp+23836, jp+23846, - jp+23856, jp+23869, jp+23879, jp+23892, jp+23902, jp+23912, - jp+23928, jp+23938, jp+23948, jp+23958, jp+23968, jp+23978, - jp+23988, jp+23998, jp+24014, jp+24024, jp+24037, jp+24053, - jp+24069, jp+24082, jp+24098, jp+24108, jp+24118, jp+24128, - jp+24141, jp+24151, jp+24161, jp+24171, jp+24184, jp+24197, - jp+24207, jp+24217, jp+24227, jp+24240, jp+24253, jp+24263, - jp+24276, jp+24289, jp+24302, jp+24315, jp+24331, jp+24344, - jp+24354, jp+24367, jp+24383, jp+24396, jp+24409, jp+24428, - jp+24441, jp+24451, jp+24470, jp+24483, jp+24493, jp+24503, - jp+24516, jp+24529, jp+24545, jp+24567, jp+24589, jp+24599, - jp+24609, jp+24622, jp+24641, jp+24654, jp+24667, jp+24677, - jp+24687, jp+24703, jp+24713, jp+24723, jp+24733, jp+24746, - jp+24756, jp+24772, jp+24782, jp+24792, jp+24802, jp+24812, - jp+24822, jp+24832, jp+24848, jp+24861, jp+24871, jp+24887, - jp+24897, jp+24913, jp+24923, jp+24948, jp+24961, jp+24974, - jp+24984, jp+24997, jp+25007, jp+25017, jp+25027, jp+25040, - jp+25053, jp+25066, jp+25079, jp+25089, jp+25099, jp+25109, - jp+25119, jp+25135, jp+25148, jp+25158, jp+25174, jp+25187, - jp+25197, jp+25207, jp+25220, jp+25236, jp+25246, jp+25262, - jp+25272, jp+25285, jp+25295, jp+25305, jp+25315, jp+25325, - jp+25347, jp+25357, jp+25367, jp+25377, jp+25393, jp+25406, - jp+25416, jp+25432, jp+25445, jp+25458, jp+25471, jp+25490, - jp+25500, jp+25513, jp+25523, jp+25533, jp+25543, jp+25553, - jp+25563, jp+25576, jp+25589, jp+25605, jp+25615, jp+25625, - jp+25635, jp+25645, jp+25655, jp+25665, jp+25675, jp+25685, - jp+25695, jp+25714, jp+25724, jp+25737, jp+25750, jp+25766, - jp+25779, jp+25789, jp+25799, jp+25809, jp+25822, jp+25835, - jp+25848, jp+25861, jp+25874, jp+25890, jp+25909, jp+25922, - jp+25935, jp+25948, jp+25967, jp+25980, jp+25996, jp+26006, - jp+26022, jp+26035, jp+26048, jp+26061, jp+26074, jp+26090, - jp+26106, jp+26119, jp+26129, jp+26142, jp+26158, jp+26171, - jp+26184, jp+26194, jp+26210, jp+26223, jp+26233, jp+26243, - jp+26253, jp+26263, jp+26276, jp+26289, jp+26305, jp+26315, - jp+26325, jp+26335, jp+26348, jp+26361, jp+26371, jp+26387, - jp+26403, jp+26413, jp+26423, - }; -#undef jp - -static const struct words jp_words = { - 2048, - 11, - false, - (const char *)jp_, - 0, /* Constant string */ - jp_i -}; diff --git a/external/libwally-core/src/data/wordlists/japanese.txt b/external/libwally-core/src/data/wordlists/japanese.txt deleted file mode 100644 index fb8501a6e..000000000 --- a/external/libwally-core/src/data/wordlists/japanese.txt +++ /dev/null @@ -1,2048 +0,0 @@ -あいこくしん -あいさつ -あいだ -あおぞら -あかちゃん -あきる -あけがた -あける -あこがれる -あさい -あさひ -あしあと -あじわう -あずかる -あずき -あそぶ -あたえる -あたためる -あたりまえ -あたる -あつい -あつかう -あっしゅく -あつまり -あつめる -あてな -あてはまる -あひる -あぶら -あぶる -あふれる -あまい -あまど -あまやかす -あまり -あみもの -あめりか -あやまる -あゆむ -あらいぐま -あらし -あらすじ -あらためる -あらゆる -あらわす -ありがとう -あわせる -あわてる -あんい -あんがい -あんこ -あんぜん -あんてい -あんない -あんまり -いいだす -いおん -いがい -いがく -いきおい -いきなり -いきもの -いきる -いくじ -いくぶん -いけばな -いけん -いこう -いこく -いこつ -いさましい -いさん -いしき -いじゅう -いじょう -いじわる -いずみ -いずれ -いせい -いせえび -いせかい -いせき -いぜん -いそうろう -いそがしい -いだい -いだく -いたずら -いたみ -いたりあ -いちおう -いちじ -いちど -いちば -いちぶ -いちりゅう -いつか -いっしゅん -いっせい -いっそう -いったん -いっち -いってい -いっぽう -いてざ -いてん -いどう -いとこ -いない -いなか -いねむり -いのち -いのる -いはつ -いばる -いはん -いびき -いひん -いふく -いへん -いほう -いみん -いもうと -いもたれ -いもり -いやがる -いやす -いよかん -いよく -いらい -いらすと -いりぐち -いりょう -いれい -いれもの -いれる -いろえんぴつ -いわい -いわう -いわかん -いわば -いわゆる -いんげんまめ -いんさつ -いんしょう -いんよう -うえき -うえる -うおざ -うがい -うかぶ -うかべる -うきわ -うくらいな -うくれれ -うけたまわる -うけつけ -うけとる -うけもつ -うける -うごかす -うごく -うこん -うさぎ -うしなう -うしろがみ -うすい -うすぎ -うすぐらい -うすめる -うせつ -うちあわせ -うちがわ -うちき -うちゅう -うっかり -うつくしい -うったえる -うつる -うどん -うなぎ -うなじ -うなずく -うなる -うねる -うのう -うぶげ -うぶごえ -うまれる -うめる -うもう -うやまう -うよく -うらがえす -うらぐち -うらない -うりあげ -うりきれ -うるさい -うれしい -うれゆき -うれる -うろこ -うわき -うわさ -うんこう -うんちん -うんてん -うんどう -えいえん -えいが -えいきょう -えいご -えいせい -えいぶん -えいよう -えいわ -えおり -えがお -えがく -えきたい -えくせる -えしゃく -えすて -えつらん -えのぐ -えほうまき -えほん -えまき -えもじ -えもの -えらい -えらぶ -えりあ -えんえん -えんかい -えんぎ -えんげき -えんしゅう -えんぜつ -えんそく -えんちょう -えんとつ -おいかける -おいこす -おいしい -おいつく -おうえん -おうさま -おうじ -おうせつ -おうたい -おうふく -おうべい -おうよう -おえる -おおい -おおう -おおどおり -おおや -おおよそ -おかえり -おかず -おがむ -おかわり -おぎなう -おきる -おくさま -おくじょう -おくりがな -おくる -おくれる -おこす -おこなう -おこる -おさえる -おさない -おさめる -おしいれ -おしえる -おじぎ -おじさん -おしゃれ -おそらく -おそわる -おたがい -おたく -おだやか -おちつく -おっと -おつり -おでかけ -おとしもの -おとなしい -おどり -おどろかす -おばさん -おまいり -おめでとう -おもいで -おもう -おもたい -おもちゃ -おやつ -おやゆび -およぼす -おらんだ -おろす -おんがく -おんけい -おんしゃ -おんせん -おんだん -おんちゅう -おんどけい -かあつ -かいが -がいき -がいけん -がいこう -かいさつ -かいしゃ -かいすいよく -かいぜん -かいぞうど -かいつう -かいてん -かいとう -かいふく -がいへき -かいほう -かいよう -がいらい -かいわ -かえる -かおり -かかえる -かがく -かがし -かがみ -かくご -かくとく -かざる -がぞう -かたい -かたち -がちょう -がっきゅう -がっこう -がっさん -がっしょう -かなざわし -かのう -がはく -かぶか -かほう -かほご -かまう -かまぼこ -かめれおん -かゆい -かようび -からい -かるい -かろう -かわく -かわら -がんか -かんけい -かんこう -かんしゃ -かんそう -かんたん -かんち -がんばる -きあい -きあつ -きいろ -ぎいん -きうい -きうん -きえる -きおう -きおく -きおち -きおん -きかい -きかく -きかんしゃ -ききて -きくばり -きくらげ -きけんせい -きこう -きこえる -きこく -きさい -きさく -きさま -きさらぎ -ぎじかがく -ぎしき -ぎじたいけん -ぎじにってい -ぎじゅつしゃ -きすう -きせい -きせき -きせつ -きそう -きぞく -きぞん -きたえる -きちょう -きつえん -ぎっちり -きつつき -きつね -きてい -きどう -きどく -きない -きなが -きなこ -きぬごし -きねん -きのう -きのした -きはく -きびしい -きひん -きふく -きぶん -きぼう -きほん -きまる -きみつ -きむずかしい -きめる -きもだめし -きもち -きもの -きゃく -きやく -ぎゅうにく -きよう -きょうりゅう -きらい -きらく -きりん -きれい -きれつ -きろく -ぎろん -きわめる -ぎんいろ -きんかくじ -きんじょ -きんようび -ぐあい -くいず -くうかん -くうき -くうぐん -くうこう -ぐうせい -くうそう -ぐうたら -くうふく -くうぼ -くかん -くきょう -くげん -ぐこう -くさい -くさき -くさばな -くさる -くしゃみ -くしょう -くすのき -くすりゆび -くせげ -くせん -ぐたいてき -くださる -くたびれる -くちこみ -くちさき -くつした -ぐっすり -くつろぐ -くとうてん -くどく -くなん -くねくね -くのう -くふう -くみあわせ -くみたてる -くめる -くやくしょ -くらす -くらべる -くるま -くれる -くろう -くわしい -ぐんかん -ぐんしょく -ぐんたい -ぐんて -けあな -けいかく -けいけん -けいこ -けいさつ -げいじゅつ -けいたい -げいのうじん -けいれき -けいろ -けおとす -けおりもの -げきか -げきげん -げきだん -げきちん -げきとつ -げきは -げきやく -げこう -げこくじょう -げざい -けさき -げざん -けしき -けしごむ -けしょう -げすと -けたば -けちゃっぷ -けちらす -けつあつ -けつい -けつえき -けっこん -けつじょ -けっせき -けってい -けつまつ -げつようび -げつれい -けつろん -げどく -けとばす -けとる -けなげ -けなす -けなみ -けぬき -げねつ -けねん -けはい -げひん -けぶかい -げぼく -けまり -けみかる -けむし -けむり -けもの -けらい -けろけろ -けわしい -けんい -けんえつ -けんお -けんか -げんき -けんげん -けんこう -けんさく -けんしゅう -けんすう -げんそう -けんちく -けんてい -けんとう -けんない -けんにん -げんぶつ -けんま -けんみん -けんめい -けんらん -けんり -こあくま -こいぬ -こいびと -ごうい -こうえん -こうおん -こうかん -ごうきゅう -ごうけい -こうこう -こうさい -こうじ -こうすい -ごうせい -こうそく -こうたい -こうちゃ -こうつう -こうてい -こうどう -こうない -こうはい -ごうほう -ごうまん -こうもく -こうりつ -こえる -こおり -ごかい -ごがつ -ごかん -こくご -こくさい -こくとう -こくない -こくはく -こぐま -こけい -こける -ここのか -こころ -こさめ -こしつ -こすう -こせい -こせき -こぜん -こそだて -こたい -こたえる -こたつ -こちょう -こっか -こつこつ -こつばん -こつぶ -こてい -こてん -ことがら -ことし -ことば -ことり -こなごな -こねこね -このまま -このみ -このよ -ごはん -こひつじ -こふう -こふん -こぼれる -ごまあぶら -こまかい -ごますり -こまつな -こまる -こむぎこ -こもじ -こもち -こもの -こもん -こやく -こやま -こゆう -こゆび -こよい -こよう -こりる -これくしょん -ころっけ -こわもて -こわれる -こんいん -こんかい -こんき -こんしゅう -こんすい -こんだて -こんとん -こんなん -こんびに -こんぽん -こんまけ -こんや -こんれい -こんわく -ざいえき -さいかい -さいきん -ざいげん -ざいこ -さいしょ -さいせい -ざいたく -ざいちゅう -さいてき -ざいりょう -さうな -さかいし -さがす -さかな -さかみち -さがる -さぎょう -さくし -さくひん -さくら -さこく -さこつ -さずかる -ざせき -さたん -さつえい -ざつおん -ざっか -ざつがく -さっきょく -ざっし -さつじん -ざっそう -さつたば -さつまいも -さてい -さといも -さとう -さとおや -さとし -さとる -さのう -さばく -さびしい -さべつ -さほう -さほど -さます -さみしい -さみだれ -さむけ -さめる -さやえんどう -さゆう -さよう -さよく -さらだ -ざるそば -さわやか -さわる -さんいん -さんか -さんきゃく -さんこう -さんさい -ざんしょ -さんすう -さんせい -さんそ -さんち -さんま -さんみ -さんらん -しあい -しあげ -しあさって -しあわせ -しいく -しいん -しうち -しえい -しおけ -しかい -しかく -じかん -しごと -しすう -じだい -したうけ -したぎ -したて -したみ -しちょう -しちりん -しっかり -しつじ -しつもん -してい -してき -してつ -じてん -じどう -しなぎれ -しなもの -しなん -しねま -しねん -しのぐ -しのぶ -しはい -しばかり -しはつ -しはらい -しはん -しひょう -しふく -じぶん -しへい -しほう -しほん -しまう -しまる -しみん -しむける -じむしょ -しめい -しめる -しもん -しゃいん -しゃうん -しゃおん -じゃがいも -しやくしょ -しゃくほう -しゃけん -しゃこ -しゃざい -しゃしん -しゃせん -しゃそう -しゃたい -しゃちょう -しゃっきん -じゃま -しゃりん -しゃれい -じゆう -じゅうしょ -しゅくはく -じゅしん -しゅっせき -しゅみ -しゅらば -じゅんばん -しょうかい -しょくたく -しょっけん -しょどう -しょもつ -しらせる -しらべる -しんか -しんこう -じんじゃ -しんせいじ -しんちく -しんりん -すあげ -すあし -すあな -ずあん -すいえい -すいか -すいとう -ずいぶん -すいようび -すうがく -すうじつ -すうせん -すおどり -すきま -すくう -すくない -すける -すごい -すこし -ずさん -すずしい -すすむ -すすめる -すっかり -ずっしり -ずっと -すてき -すてる -すねる -すのこ -すはだ -すばらしい -ずひょう -ずぶぬれ -すぶり -すふれ -すべて -すべる -ずほう -すぼん -すまい -すめし -すもう -すやき -すらすら -するめ -すれちがう -すろっと -すわる -すんぜん -すんぽう -せあぶら -せいかつ -せいげん -せいじ -せいよう -せおう -せかいかん -せきにん -せきむ -せきゆ -せきらんうん -せけん -せこう -せすじ -せたい -せたけ -せっかく -せっきゃく -ぜっく -せっけん -せっこつ -せっさたくま -せつぞく -せつだん -せつでん -せっぱん -せつび -せつぶん -せつめい -せつりつ -せなか -せのび -せはば -せびろ -せぼね -せまい -せまる -せめる -せもたれ -せりふ -ぜんあく -せんい -せんえい -せんか -せんきょ -せんく -せんげん -ぜんご -せんさい -せんしゅ -せんすい -せんせい -せんぞ -せんたく -せんちょう -せんてい -せんとう -せんぬき -せんねん -せんぱい -ぜんぶ -ぜんぽう -せんむ -せんめんじょ -せんもん -せんやく -せんゆう -せんよう -ぜんら -ぜんりゃく -せんれい -せんろ -そあく -そいとげる -そいね -そうがんきょう -そうき -そうご -そうしん -そうだん -そうなん -そうび -そうめん -そうり -そえもの -そえん -そがい -そげき -そこう -そこそこ -そざい -そしな -そせい -そせん -そそぐ -そだてる -そつう -そつえん -そっかん -そつぎょう -そっけつ -そっこう -そっせん -そっと -そとがわ -そとづら -そなえる -そなた -そふぼ -そぼく -そぼろ -そまつ -そまる -そむく -そむりえ -そめる -そもそも -そよかぜ -そらまめ -そろう -そんかい -そんけい -そんざい -そんしつ -そんぞく -そんちょう -ぞんび -ぞんぶん -そんみん -たあい -たいいん -たいうん -たいえき -たいおう -だいがく -たいき -たいぐう -たいけん -たいこ -たいざい -だいじょうぶ -だいすき -たいせつ -たいそう -だいたい -たいちょう -たいてい -だいどころ -たいない -たいねつ -たいのう -たいはん -だいひょう -たいふう -たいへん -たいほ -たいまつばな -たいみんぐ -たいむ -たいめん -たいやき -たいよう -たいら -たいりょく -たいる -たいわん -たうえ -たえる -たおす -たおる -たおれる -たかい -たかね -たきび -たくさん -たこく -たこやき -たさい -たしざん -だじゃれ -たすける -たずさわる -たそがれ -たたかう -たたく -ただしい -たたみ -たちばな -だっかい -だっきゃく -だっこ -だっしゅつ -だったい -たてる -たとえる -たなばた -たにん -たぬき -たのしみ -たはつ -たぶん -たべる -たぼう -たまご -たまる -だむる -ためいき -ためす -ためる -たもつ -たやすい -たよる -たらす -たりきほんがん -たりょう -たりる -たると -たれる -たれんと -たろっと -たわむれる -だんあつ -たんい -たんおん -たんか -たんき -たんけん -たんご -たんさん -たんじょうび -だんせい -たんそく -たんたい -だんち -たんてい -たんとう -だんな -たんにん -だんねつ -たんのう -たんぴん -だんぼう -たんまつ -たんめい -だんれつ -だんろ -だんわ -ちあい -ちあん -ちいき -ちいさい -ちえん -ちかい -ちから -ちきゅう -ちきん -ちけいず -ちけん -ちこく -ちさい -ちしき -ちしりょう -ちせい -ちそう -ちたい -ちたん -ちちおや -ちつじょ -ちてき -ちてん -ちぬき -ちぬり -ちのう -ちひょう -ちへいせん -ちほう -ちまた -ちみつ -ちみどろ -ちめいど -ちゃんこなべ -ちゅうい -ちゆりょく -ちょうし -ちょさくけん -ちらし -ちらみ -ちりがみ -ちりょう -ちるど -ちわわ -ちんたい -ちんもく -ついか -ついたち -つうか -つうじょう -つうはん -つうわ -つかう -つかれる -つくね -つくる -つけね -つける -つごう -つたえる -つづく -つつじ -つつむ -つとめる -つながる -つなみ -つねづね -つのる -つぶす -つまらない -つまる -つみき -つめたい -つもり -つもる -つよい -つるぼ -つるみく -つわもの -つわり -てあし -てあて -てあみ -ていおん -ていか -ていき -ていけい -ていこく -ていさつ -ていし -ていせい -ていたい -ていど -ていねい -ていひょう -ていへん -ていぼう -てうち -ておくれ -てきとう -てくび -でこぼこ -てさぎょう -てさげ -てすり -てそう -てちがい -てちょう -てつがく -てつづき -でっぱ -てつぼう -てつや -でぬかえ -てぬき -てぬぐい -てのひら -てはい -てぶくろ -てふだ -てほどき -てほん -てまえ -てまきずし -てみじか -てみやげ -てらす -てれび -てわけ -てわたし -でんあつ -てんいん -てんかい -てんき -てんぐ -てんけん -てんごく -てんさい -てんし -てんすう -でんち -てんてき -てんとう -てんない -てんぷら -てんぼうだい -てんめつ -てんらんかい -でんりょく -でんわ -どあい -といれ -どうかん -とうきゅう -どうぐ -とうし -とうむぎ -とおい -とおか -とおく -とおす -とおる -とかい -とかす -ときおり -ときどき -とくい -とくしゅう -とくてん -とくに -とくべつ -とけい -とける -とこや -とさか -としょかん -とそう -とたん -とちゅう -とっきゅう -とっくん -とつぜん -とつにゅう -とどける -ととのえる -とない -となえる -となり -とのさま -とばす -どぶがわ -とほう -とまる -とめる -ともだち -ともる -どようび -とらえる -とんかつ -どんぶり -ないかく -ないこう -ないしょ -ないす -ないせん -ないそう -なおす -ながい -なくす -なげる -なこうど -なさけ -なたでここ -なっとう -なつやすみ -ななおし -なにごと -なにもの -なにわ -なのか -なふだ -なまいき -なまえ -なまみ -なみだ -なめらか -なめる -なやむ -ならう -ならび -ならぶ -なれる -なわとび -なわばり -にあう -にいがた -にうけ -におい -にかい -にがて -にきび -にくしみ -にくまん -にげる -にさんかたんそ -にしき -にせもの -にちじょう -にちようび -にっか -にっき -にっけい -にっこう -にっさん -にっしょく -にっすう -にっせき -にってい -になう -にほん -にまめ -にもつ -にやり -にゅういん -にりんしゃ -にわとり -にんい -にんか -にんき -にんげん -にんしき -にんずう -にんそう -にんたい -にんち -にんてい -にんにく -にんぷ -にんまり -にんむ -にんめい -にんよう -ぬいくぎ -ぬかす -ぬぐいとる -ぬぐう -ぬくもり -ぬすむ -ぬまえび -ぬめり -ぬらす -ぬんちゃく -ねあげ -ねいき -ねいる -ねいろ -ねぐせ -ねくたい -ねくら -ねこぜ -ねこむ -ねさげ -ねすごす -ねそべる -ねだん -ねつい -ねっしん -ねつぞう -ねったいぎょ -ねぶそく -ねふだ -ねぼう -ねほりはほり -ねまき -ねまわし -ねみみ -ねむい -ねむたい -ねもと -ねらう -ねわざ -ねんいり -ねんおし -ねんかん -ねんきん -ねんぐ -ねんざ -ねんし -ねんちゃく -ねんど -ねんぴ -ねんぶつ -ねんまつ -ねんりょう -ねんれい -のいず -のおづま -のがす -のきなみ -のこぎり -のこす -のこる -のせる -のぞく -のぞむ -のたまう -のちほど -のっく -のばす -のはら -のべる -のぼる -のみもの -のやま -のらいぬ -のらねこ -のりもの -のりゆき -のれん -のんき -ばあい -はあく -ばあさん -ばいか -ばいく -はいけん -はいご -はいしん -はいすい -はいせん -はいそう -はいち -ばいばい -はいれつ -はえる -はおる -はかい -ばかり -はかる -はくしゅ -はけん -はこぶ -はさみ -はさん -はしご -ばしょ -はしる -はせる -ぱそこん -はそん -はたん -はちみつ -はつおん -はっかく -はづき -はっきり -はっくつ -はっけん -はっこう -はっさん -はっしん -はったつ -はっちゅう -はってん -はっぴょう -はっぽう -はなす -はなび -はにかむ -はぶらし -はみがき -はむかう -はめつ -はやい -はやし -はらう -はろうぃん -はわい -はんい -はんえい -はんおん -はんかく -はんきょう -ばんぐみ -はんこ -はんしゃ -はんすう -はんだん -ぱんち -ぱんつ -はんてい -はんとし -はんのう -はんぱ -はんぶん -はんぺん -はんぼうき -はんめい -はんらん -はんろん -ひいき -ひうん -ひえる -ひかく -ひかり -ひかる -ひかん -ひくい -ひけつ -ひこうき -ひこく -ひさい -ひさしぶり -ひさん -びじゅつかん -ひしょ -ひそか -ひそむ -ひたむき -ひだり -ひたる -ひつぎ -ひっこし -ひっし -ひつじゅひん -ひっす -ひつぜん -ぴったり -ぴっちり -ひつよう -ひてい -ひとごみ -ひなまつり -ひなん -ひねる -ひはん -ひびく -ひひょう -ひほう -ひまわり -ひまん -ひみつ -ひめい -ひめじし -ひやけ -ひやす -ひよう -びょうき -ひらがな -ひらく -ひりつ -ひりょう -ひるま -ひるやすみ -ひれい -ひろい -ひろう -ひろき -ひろゆき -ひんかく -ひんけつ -ひんこん -ひんしゅ -ひんそう -ぴんち -ひんぱん -びんぼう -ふあん -ふいうち -ふうけい -ふうせん -ぷうたろう -ふうとう -ふうふ -ふえる -ふおん -ふかい -ふきん -ふくざつ -ふくぶくろ -ふこう -ふさい -ふしぎ -ふじみ -ふすま -ふせい -ふせぐ -ふそく -ぶたにく -ふたん -ふちょう -ふつう -ふつか -ふっかつ -ふっき -ふっこく -ぶどう -ふとる -ふとん -ふのう -ふはい -ふひょう -ふへん -ふまん -ふみん -ふめつ -ふめん -ふよう -ふりこ -ふりる -ふるい -ふんいき -ぶんがく -ぶんぐ -ふんしつ -ぶんせき -ふんそう -ぶんぽう -へいあん -へいおん -へいがい -へいき -へいげん -へいこう -へいさ -へいしゃ -へいせつ -へいそ -へいたく -へいてん -へいねつ -へいわ -へきが -へこむ -べにいろ -べにしょうが -へらす -へんかん -べんきょう -べんごし -へんさい -へんたい -べんり -ほあん -ほいく -ぼうぎょ -ほうこく -ほうそう -ほうほう -ほうもん -ほうりつ -ほえる -ほおん -ほかん -ほきょう -ぼきん -ほくろ -ほけつ -ほけん -ほこう -ほこる -ほしい -ほしつ -ほしゅ -ほしょう -ほせい -ほそい -ほそく -ほたて -ほたる -ぽちぶくろ -ほっきょく -ほっさ -ほったん -ほとんど -ほめる -ほんい -ほんき -ほんけ -ほんしつ -ほんやく -まいにち -まかい -まかせる -まがる -まける -まこと -まさつ -まじめ -ますく -まぜる -まつり -まとめ -まなぶ -まぬけ -まねく -まほう -まもる -まゆげ -まよう -まろやか -まわす -まわり -まわる -まんが -まんきつ -まんぞく -まんなか -みいら -みうち -みえる -みがく -みかた -みかん -みけん -みこん -みじかい -みすい -みすえる -みせる -みっか -みつかる -みつける -みてい -みとめる -みなと -みなみかさい -みねらる -みのう -みのがす -みほん -みもと -みやげ -みらい -みりょく -みわく -みんか -みんぞく -むいか -むえき -むえん -むかい -むかう -むかえ -むかし -むぎちゃ -むける -むげん -むさぼる -むしあつい -むしば -むじゅん -むしろ -むすう -むすこ -むすぶ -むすめ -むせる -むせん -むちゅう -むなしい -むのう -むやみ -むよう -むらさき -むりょう -むろん -めいあん -めいうん -めいえん -めいかく -めいきょく -めいさい -めいし -めいそう -めいぶつ -めいれい -めいわく -めぐまれる -めざす -めした -めずらしい -めだつ -めまい -めやす -めんきょ -めんせき -めんどう -もうしあげる -もうどうけん -もえる -もくし -もくてき -もくようび -もちろん -もどる -もらう -もんく -もんだい -やおや -やける -やさい -やさしい -やすい -やすたろう -やすみ -やせる -やそう -やたい -やちん -やっと -やっぱり -やぶる -やめる -ややこしい -やよい -やわらかい -ゆうき -ゆうびんきょく -ゆうべ -ゆうめい -ゆけつ -ゆしゅつ -ゆせん -ゆそう -ゆたか -ゆちゃく -ゆでる -ゆにゅう -ゆびわ -ゆらい -ゆれる -ようい -ようか -ようきゅう -ようじ -ようす -ようちえん -よかぜ -よかん -よきん -よくせい -よくぼう -よけい -よごれる -よさん -よしゅう -よそう -よそく -よっか -よてい -よどがわく -よねつ -よやく -よゆう -よろこぶ -よろしい -らいう -らくがき -らくご -らくさつ -らくだ -らしんばん -らせん -らぞく -らたい -らっか -られつ -りえき -りかい -りきさく -りきせつ -りくぐん -りくつ -りけん -りこう -りせい -りそう -りそく -りてん -りねん -りゆう -りゅうがく -りよう -りょうり -りょかん -りょくちゃ -りょこう -りりく -りれき -りろん -りんご -るいけい -るいさい -るいじ -るいせき -るすばん -るりがわら -れいかん -れいぎ -れいせい -れいぞうこ -れいとう -れいぼう -れきし -れきだい -れんあい -れんけい -れんこん -れんさい -れんしゅう -れんぞく -れんらく -ろうか -ろうご -ろうじん -ろうそく -ろくが -ろこつ -ろじうら -ろしゅつ -ろせん -ろてん -ろめん -ろれつ -ろんぎ -ろんぱ -ろんぶん -ろんり -わかす -わかめ -わかやま -わかれる -わしつ -わじまし -わすれもの -わらう -われる diff --git a/external/libwally-core/src/data/wordlists/spanish.c b/external/libwally-core/src/data/wordlists/spanish.c deleted file mode 100644 index 129550e60..000000000 --- a/external/libwally-core/src/data/wordlists/spanish.c +++ /dev/null @@ -1,2408 +0,0 @@ -/* Generated file - do not edit! */ -#include - -static const unsigned char es_[] = { - 0x61,0xcc,0x81,0x62,0x61,0x63,0x6f,0, - 0x61,0x62,0x64,0x6f,0x6d,0x65,0x6e,0, - 0x61,0x62,0x65,0x6a,0x61,0, - 0x61,0x62,0x69,0x65,0x72,0x74,0x6f,0, - 0x61,0x62,0x6f,0x67,0x61,0x64,0x6f,0, - 0x61,0x62,0x6f,0x6e,0x6f,0, - 0x61,0x62,0x6f,0x72,0x74,0x6f,0, - 0x61,0x62,0x72,0x61,0x7a,0x6f,0, - 0x61,0x62,0x72,0x69,0x72,0, - 0x61,0x62,0x75,0x65,0x6c,0x6f,0, - 0x61,0x62,0x75,0x73,0x6f,0, - 0x61,0x63,0x61,0x62,0x61,0x72,0, - 0x61,0x63,0x61,0x64,0x65,0x6d,0x69,0x61,0, - 0x61,0x63,0x63,0x65,0x73,0x6f,0, - 0x61,0x63,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x61,0x63,0x65,0x69,0x74,0x65,0, - 0x61,0x63,0x65,0x6c,0x67,0x61,0, - 0x61,0x63,0x65,0x6e,0x74,0x6f,0, - 0x61,0x63,0x65,0x70,0x74,0x61,0x72,0, - 0x61,0xcc,0x81,0x63,0x69,0x64,0x6f,0, - 0x61,0x63,0x6c,0x61,0x72,0x61,0x72,0, - 0x61,0x63,0x6e,0x65,0xcc,0x81,0, - 0x61,0x63,0x6f,0x67,0x65,0x72,0, - 0x61,0x63,0x6f,0x73,0x6f,0, - 0x61,0x63,0x74,0x69,0x76,0x6f,0, - 0x61,0x63,0x74,0x6f,0, - 0x61,0x63,0x74,0x72,0x69,0x7a,0, - 0x61,0x63,0x74,0x75,0x61,0x72,0, - 0x61,0x63,0x75,0x64,0x69,0x72,0, - 0x61,0x63,0x75,0x65,0x72,0x64,0x6f,0, - 0x61,0x63,0x75,0x73,0x61,0x72,0, - 0x61,0x64,0x69,0x63,0x74,0x6f,0, - 0x61,0x64,0x6d,0x69,0x74,0x69,0x72,0, - 0x61,0x64,0x6f,0x70,0x74,0x61,0x72,0, - 0x61,0x64,0x6f,0x72,0x6e,0x6f,0, - 0x61,0x64,0x75,0x61,0x6e,0x61,0, - 0x61,0x64,0x75,0x6c,0x74,0x6f,0, - 0x61,0x65,0xcc,0x81,0x72,0x65,0x6f,0, - 0x61,0x66,0x65,0x63,0x74,0x61,0x72,0, - 0x61,0x66,0x69,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x61,0x66,0x69,0x6e,0x61,0x72,0, - 0x61,0x66,0x69,0x72,0x6d,0x61,0x72,0, - 0x61,0xcc,0x81,0x67,0x69,0x6c,0, - 0x61,0x67,0x69,0x74,0x61,0x72,0, - 0x61,0x67,0x6f,0x6e,0x69,0xcc,0x81,0x61,0, - 0x61,0x67,0x6f,0x73,0x74,0x6f,0, - 0x61,0x67,0x6f,0x74,0x61,0x72,0, - 0x61,0x67,0x72,0x65,0x67,0x61,0x72,0, - 0x61,0x67,0x72,0x69,0x6f,0, - 0x61,0x67,0x75,0x61,0, - 0x61,0x67,0x75,0x64,0x6f,0, - 0x61,0xcc,0x81,0x67,0x75,0x69,0x6c,0x61,0, - 0x61,0x67,0x75,0x6a,0x61,0, - 0x61,0x68,0x6f,0x67,0x6f,0, - 0x61,0x68,0x6f,0x72,0x72,0x6f,0, - 0x61,0x69,0x72,0x65,0, - 0x61,0x69,0x73,0x6c,0x61,0x72,0, - 0x61,0x6a,0x65,0x64,0x72,0x65,0x7a,0, - 0x61,0x6a,0x65,0x6e,0x6f,0, - 0x61,0x6a,0x75,0x73,0x74,0x65,0, - 0x61,0x6c,0x61,0x63,0x72,0x61,0xcc,0x81,0x6e,0, - 0x61,0x6c,0x61,0x6d,0x62,0x72,0x65,0, - 0x61,0x6c,0x61,0x72,0x6d,0x61,0, - 0x61,0x6c,0x62,0x61,0, - 0x61,0xcc,0x81,0x6c,0x62,0x75,0x6d,0, - 0x61,0x6c,0x63,0x61,0x6c,0x64,0x65,0, - 0x61,0x6c,0x64,0x65,0x61,0, - 0x61,0x6c,0x65,0x67,0x72,0x65,0, - 0x61,0x6c,0x65,0x6a,0x61,0x72,0, - 0x61,0x6c,0x65,0x72,0x74,0x61,0, - 0x61,0x6c,0x65,0x74,0x61,0, - 0x61,0x6c,0x66,0x69,0x6c,0x65,0x72,0, - 0x61,0x6c,0x67,0x61,0, - 0x61,0x6c,0x67,0x6f,0x64,0x6f,0xcc,0x81,0x6e,0, - 0x61,0x6c,0x69,0x61,0x64,0x6f,0, - 0x61,0x6c,0x69,0x65,0x6e,0x74,0x6f,0, - 0x61,0x6c,0x69,0x76,0x69,0x6f,0, - 0x61,0x6c,0x6d,0x61,0, - 0x61,0x6c,0x6d,0x65,0x6a,0x61,0, - 0x61,0x6c,0x6d,0x69,0xcc,0x81,0x62,0x61,0x72,0, - 0x61,0x6c,0x74,0x61,0x72,0, - 0x61,0x6c,0x74,0x65,0x7a,0x61,0, - 0x61,0x6c,0x74,0x69,0x76,0x6f,0, - 0x61,0x6c,0x74,0x6f,0, - 0x61,0x6c,0x74,0x75,0x72,0x61,0, - 0x61,0x6c,0x75,0x6d,0x6e,0x6f,0, - 0x61,0x6c,0x7a,0x61,0x72,0, - 0x61,0x6d,0x61,0x62,0x6c,0x65,0, - 0x61,0x6d,0x61,0x6e,0x74,0x65,0, - 0x61,0x6d,0x61,0x70,0x6f,0x6c,0x61,0, - 0x61,0x6d,0x61,0x72,0x67,0x6f,0, - 0x61,0x6d,0x61,0x73,0x61,0x72,0, - 0x61,0xcc,0x81,0x6d,0x62,0x61,0x72,0, - 0x61,0xcc,0x81,0x6d,0x62,0x69,0x74,0x6f,0, - 0x61,0x6d,0x65,0x6e,0x6f,0, - 0x61,0x6d,0x69,0x67,0x6f,0, - 0x61,0x6d,0x69,0x73,0x74,0x61,0x64,0, - 0x61,0x6d,0x6f,0x72,0, - 0x61,0x6d,0x70,0x61,0x72,0x6f,0, - 0x61,0x6d,0x70,0x6c,0x69,0x6f,0, - 0x61,0x6e,0x63,0x68,0x6f,0, - 0x61,0x6e,0x63,0x69,0x61,0x6e,0x6f,0, - 0x61,0x6e,0x63,0x6c,0x61,0, - 0x61,0x6e,0x64,0x61,0x72,0, - 0x61,0x6e,0x64,0x65,0xcc,0x81,0x6e,0, - 0x61,0x6e,0x65,0x6d,0x69,0x61,0, - 0x61,0xcc,0x81,0x6e,0x67,0x75,0x6c,0x6f,0, - 0x61,0x6e,0x69,0x6c,0x6c,0x6f,0, - 0x61,0xcc,0x81,0x6e,0x69,0x6d,0x6f,0, - 0x61,0x6e,0x69,0xcc,0x81,0x73,0, - 0x61,0x6e,0x6f,0x74,0x61,0x72,0, - 0x61,0x6e,0x74,0x65,0x6e,0x61,0, - 0x61,0x6e,0x74,0x69,0x67,0x75,0x6f,0, - 0x61,0x6e,0x74,0x6f,0x6a,0x6f,0, - 0x61,0x6e,0x75,0x61,0x6c,0, - 0x61,0x6e,0x75,0x6c,0x61,0x72,0, - 0x61,0x6e,0x75,0x6e,0x63,0x69,0x6f,0, - 0x61,0x6e,0xcc,0x83,0x61,0x64,0x69,0x72,0, - 0x61,0x6e,0xcc,0x83,0x65,0x6a,0x6f,0, - 0x61,0x6e,0xcc,0x83,0x6f,0, - 0x61,0x70,0x61,0x67,0x61,0x72,0, - 0x61,0x70,0x61,0x72,0x61,0x74,0x6f,0, - 0x61,0x70,0x65,0x74,0x69,0x74,0x6f,0, - 0x61,0x70,0x69,0x6f,0, - 0x61,0x70,0x6c,0x69,0x63,0x61,0x72,0, - 0x61,0x70,0x6f,0x64,0x6f,0, - 0x61,0x70,0x6f,0x72,0x74,0x65,0, - 0x61,0x70,0x6f,0x79,0x6f,0, - 0x61,0x70,0x72,0x65,0x6e,0x64,0x65,0x72,0, - 0x61,0x70,0x72,0x6f,0x62,0x61,0x72,0, - 0x61,0x70,0x75,0x65,0x73,0x74,0x61,0, - 0x61,0x70,0x75,0x72,0x6f,0, - 0x61,0x72,0x61,0x64,0x6f,0, - 0x61,0x72,0x61,0x6e,0xcc,0x83,0x61,0, - 0x61,0x72,0x61,0x72,0, - 0x61,0xcc,0x81,0x72,0x62,0x69,0x74,0x72,0x6f,0, - 0x61,0xcc,0x81,0x72,0x62,0x6f,0x6c,0, - 0x61,0x72,0x62,0x75,0x73,0x74,0x6f,0, - 0x61,0x72,0x63,0x68,0x69,0x76,0x6f,0, - 0x61,0x72,0x63,0x6f,0, - 0x61,0x72,0x64,0x65,0x72,0, - 0x61,0x72,0x64,0x69,0x6c,0x6c,0x61,0, - 0x61,0x72,0x64,0x75,0x6f,0, - 0x61,0xcc,0x81,0x72,0x65,0x61,0, - 0x61,0xcc,0x81,0x72,0x69,0x64,0x6f,0, - 0x61,0x72,0x69,0x65,0x73,0, - 0x61,0x72,0x6d,0x6f,0x6e,0x69,0xcc,0x81,0x61,0, - 0x61,0x72,0x6e,0x65,0xcc,0x81,0x73,0, - 0x61,0x72,0x6f,0x6d,0x61,0, - 0x61,0x72,0x70,0x61,0, - 0x61,0x72,0x70,0x6f,0xcc,0x81,0x6e,0, - 0x61,0x72,0x72,0x65,0x67,0x6c,0x6f,0, - 0x61,0x72,0x72,0x6f,0x7a,0, - 0x61,0x72,0x72,0x75,0x67,0x61,0, - 0x61,0x72,0x74,0x65,0, - 0x61,0x72,0x74,0x69,0x73,0x74,0x61,0, - 0x61,0x73,0x61,0, - 0x61,0x73,0x61,0x64,0x6f,0, - 0x61,0x73,0x61,0x6c,0x74,0x6f,0, - 0x61,0x73,0x63,0x65,0x6e,0x73,0x6f,0, - 0x61,0x73,0x65,0x67,0x75,0x72,0x61,0x72,0, - 0x61,0x73,0x65,0x6f,0, - 0x61,0x73,0x65,0x73,0x6f,0x72,0, - 0x61,0x73,0x69,0x65,0x6e,0x74,0x6f,0, - 0x61,0x73,0x69,0x6c,0x6f,0, - 0x61,0x73,0x69,0x73,0x74,0x69,0x72,0, - 0x61,0x73,0x6e,0x6f,0, - 0x61,0x73,0x6f,0x6d,0x62,0x72,0x6f,0, - 0x61,0xcc,0x81,0x73,0x70,0x65,0x72,0x6f,0, - 0x61,0x73,0x74,0x69,0x6c,0x6c,0x61,0, - 0x61,0x73,0x74,0x72,0x6f,0, - 0x61,0x73,0x74,0x75,0x74,0x6f,0, - 0x61,0x73,0x75,0x6d,0x69,0x72,0, - 0x61,0x73,0x75,0x6e,0x74,0x6f,0, - 0x61,0x74,0x61,0x6a,0x6f,0, - 0x61,0x74,0x61,0x71,0x75,0x65,0, - 0x61,0x74,0x61,0x72,0, - 0x61,0x74,0x65,0x6e,0x74,0x6f,0, - 0x61,0x74,0x65,0x6f,0, - 0x61,0xcc,0x81,0x74,0x69,0x63,0x6f,0, - 0x61,0x74,0x6c,0x65,0x74,0x61,0, - 0x61,0xcc,0x81,0x74,0x6f,0x6d,0x6f,0, - 0x61,0x74,0x72,0x61,0x65,0x72,0, - 0x61,0x74,0x72,0x6f,0x7a,0, - 0x61,0x74,0x75,0xcc,0x81,0x6e,0, - 0x61,0x75,0x64,0x61,0x7a,0, - 0x61,0x75,0x64,0x69,0x6f,0, - 0x61,0x75,0x67,0x65,0, - 0x61,0x75,0x6c,0x61,0, - 0x61,0x75,0x6d,0x65,0x6e,0x74,0x6f,0, - 0x61,0x75,0x73,0x65,0x6e,0x74,0x65,0, - 0x61,0x75,0x74,0x6f,0x72,0, - 0x61,0x76,0x61,0x6c,0, - 0x61,0x76,0x61,0x6e,0x63,0x65,0, - 0x61,0x76,0x61,0x72,0x6f,0, - 0x61,0x76,0x65,0, - 0x61,0x76,0x65,0x6c,0x6c,0x61,0x6e,0x61,0, - 0x61,0x76,0x65,0x6e,0x61,0, - 0x61,0x76,0x65,0x73,0x74,0x72,0x75,0x7a,0, - 0x61,0x76,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x61,0x76,0x69,0x73,0x6f,0, - 0x61,0x79,0x65,0x72,0, - 0x61,0x79,0x75,0x64,0x61,0, - 0x61,0x79,0x75,0x6e,0x6f,0, - 0x61,0x7a,0x61,0x66,0x72,0x61,0xcc,0x81,0x6e,0, - 0x61,0x7a,0x61,0x72,0, - 0x61,0x7a,0x6f,0x74,0x65,0, - 0x61,0x7a,0x75,0xcc,0x81,0x63,0x61,0x72,0, - 0x61,0x7a,0x75,0x66,0x72,0x65,0, - 0x61,0x7a,0x75,0x6c,0, - 0x62,0x61,0x62,0x61,0, - 0x62,0x61,0x62,0x6f,0x72,0, - 0x62,0x61,0x63,0x68,0x65,0, - 0x62,0x61,0x68,0x69,0xcc,0x81,0x61,0, - 0x62,0x61,0x69,0x6c,0x65,0, - 0x62,0x61,0x6a,0x61,0x72,0, - 0x62,0x61,0x6c,0x61,0x6e,0x7a,0x61,0, - 0x62,0x61,0x6c,0x63,0x6f,0xcc,0x81,0x6e,0, - 0x62,0x61,0x6c,0x64,0x65,0, - 0x62,0x61,0x6d,0x62,0x75,0xcc,0x81,0, - 0x62,0x61,0x6e,0x63,0x6f,0, - 0x62,0x61,0x6e,0x64,0x61,0, - 0x62,0x61,0x6e,0xcc,0x83,0x6f,0, - 0x62,0x61,0x72,0x62,0x61,0, - 0x62,0x61,0x72,0x63,0x6f,0, - 0x62,0x61,0x72,0x6e,0x69,0x7a,0, - 0x62,0x61,0x72,0x72,0x6f,0, - 0x62,0x61,0xcc,0x81,0x73,0x63,0x75,0x6c,0x61,0, - 0x62,0x61,0x73,0x74,0x6f,0xcc,0x81,0x6e,0, - 0x62,0x61,0x73,0x75,0x72,0x61,0, - 0x62,0x61,0x74,0x61,0x6c,0x6c,0x61,0, - 0x62,0x61,0x74,0x65,0x72,0x69,0xcc,0x81,0x61,0, - 0x62,0x61,0x74,0x69,0x72,0, - 0x62,0x61,0x74,0x75,0x74,0x61,0, - 0x62,0x61,0x75,0xcc,0x81,0x6c,0, - 0x62,0x61,0x7a,0x61,0x72,0, - 0x62,0x65,0x62,0x65,0xcc,0x81,0, - 0x62,0x65,0x62,0x69,0x64,0x61,0, - 0x62,0x65,0x6c,0x6c,0x6f,0, - 0x62,0x65,0x73,0x61,0x72,0, - 0x62,0x65,0x73,0x6f,0, - 0x62,0x65,0x73,0x74,0x69,0x61,0, - 0x62,0x69,0x63,0x68,0x6f,0, - 0x62,0x69,0x65,0x6e,0, - 0x62,0x69,0x6e,0x67,0x6f,0, - 0x62,0x6c,0x61,0x6e,0x63,0x6f,0, - 0x62,0x6c,0x6f,0x71,0x75,0x65,0, - 0x62,0x6c,0x75,0x73,0x61,0, - 0x62,0x6f,0x61,0, - 0x62,0x6f,0x62,0x69,0x6e,0x61,0, - 0x62,0x6f,0x62,0x6f,0, - 0x62,0x6f,0x63,0x61,0, - 0x62,0x6f,0x63,0x69,0x6e,0x61,0, - 0x62,0x6f,0x64,0x61,0, - 0x62,0x6f,0x64,0x65,0x67,0x61,0, - 0x62,0x6f,0x69,0x6e,0x61,0, - 0x62,0x6f,0x6c,0x61,0, - 0x62,0x6f,0x6c,0x65,0x72,0x6f,0, - 0x62,0x6f,0x6c,0x73,0x61,0, - 0x62,0x6f,0x6d,0x62,0x61,0, - 0x62,0x6f,0x6e,0x64,0x61,0x64,0, - 0x62,0x6f,0x6e,0x69,0x74,0x6f,0, - 0x62,0x6f,0x6e,0x6f,0, - 0x62,0x6f,0x6e,0x73,0x61,0xcc,0x81,0x69,0, - 0x62,0x6f,0x72,0x64,0x65,0, - 0x62,0x6f,0x72,0x72,0x61,0x72,0, - 0x62,0x6f,0x73,0x71,0x75,0x65,0, - 0x62,0x6f,0x74,0x65,0, - 0x62,0x6f,0x74,0x69,0xcc,0x81,0x6e,0, - 0x62,0x6f,0xcc,0x81,0x76,0x65,0x64,0x61,0, - 0x62,0x6f,0x7a,0x61,0x6c,0, - 0x62,0x72,0x61,0x76,0x6f,0, - 0x62,0x72,0x61,0x7a,0x6f,0, - 0x62,0x72,0x65,0x63,0x68,0x61,0, - 0x62,0x72,0x65,0x76,0x65,0, - 0x62,0x72,0x69,0x6c,0x6c,0x6f,0, - 0x62,0x72,0x69,0x6e,0x63,0x6f,0, - 0x62,0x72,0x69,0x73,0x61,0, - 0x62,0x72,0x6f,0x63,0x61,0, - 0x62,0x72,0x6f,0x6d,0x61,0, - 0x62,0x72,0x6f,0x6e,0x63,0x65,0, - 0x62,0x72,0x6f,0x74,0x65,0, - 0x62,0x72,0x75,0x6a,0x61,0, - 0x62,0x72,0x75,0x73,0x63,0x6f,0, - 0x62,0x72,0x75,0x74,0x6f,0, - 0x62,0x75,0x63,0x65,0x6f,0, - 0x62,0x75,0x63,0x6c,0x65,0, - 0x62,0x75,0x65,0x6e,0x6f,0, - 0x62,0x75,0x65,0x79,0, - 0x62,0x75,0x66,0x61,0x6e,0x64,0x61,0, - 0x62,0x75,0x66,0x6f,0xcc,0x81,0x6e,0, - 0x62,0x75,0xcc,0x81,0x68,0x6f,0, - 0x62,0x75,0x69,0x74,0x72,0x65,0, - 0x62,0x75,0x6c,0x74,0x6f,0, - 0x62,0x75,0x72,0x62,0x75,0x6a,0x61,0, - 0x62,0x75,0x72,0x6c,0x61,0, - 0x62,0x75,0x72,0x72,0x6f,0, - 0x62,0x75,0x73,0x63,0x61,0x72,0, - 0x62,0x75,0x74,0x61,0x63,0x61,0, - 0x62,0x75,0x7a,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x61,0x62,0x61,0x6c,0x6c,0x6f,0, - 0x63,0x61,0x62,0x65,0x7a,0x61,0, - 0x63,0x61,0x62,0x69,0x6e,0x61,0, - 0x63,0x61,0x62,0x72,0x61,0, - 0x63,0x61,0x63,0x61,0x6f,0, - 0x63,0x61,0x64,0x61,0xcc,0x81,0x76,0x65,0x72,0, - 0x63,0x61,0x64,0x65,0x6e,0x61,0, - 0x63,0x61,0x65,0x72,0, - 0x63,0x61,0x66,0x65,0xcc,0x81,0, - 0x63,0x61,0x69,0xcc,0x81,0x64,0x61,0, - 0x63,0x61,0x69,0x6d,0x61,0xcc,0x81,0x6e,0, - 0x63,0x61,0x6a,0x61,0, - 0x63,0x61,0x6a,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x61,0x6c,0, - 0x63,0x61,0x6c,0x61,0x6d,0x61,0x72,0, - 0x63,0x61,0x6c,0x63,0x69,0x6f,0, - 0x63,0x61,0x6c,0x64,0x6f,0, - 0x63,0x61,0x6c,0x69,0x64,0x61,0x64,0, - 0x63,0x61,0x6c,0x6c,0x65,0, - 0x63,0x61,0x6c,0x6d,0x61,0, - 0x63,0x61,0x6c,0x6f,0x72,0, - 0x63,0x61,0x6c,0x76,0x6f,0, - 0x63,0x61,0x6d,0x61,0, - 0x63,0x61,0x6d,0x62,0x69,0x6f,0, - 0x63,0x61,0x6d,0x65,0x6c,0x6c,0x6f,0, - 0x63,0x61,0x6d,0x69,0x6e,0x6f,0, - 0x63,0x61,0x6d,0x70,0x6f,0, - 0x63,0x61,0xcc,0x81,0x6e,0x63,0x65,0x72,0, - 0x63,0x61,0x6e,0x64,0x69,0x6c,0, - 0x63,0x61,0x6e,0x65,0x6c,0x61,0, - 0x63,0x61,0x6e,0x67,0x75,0x72,0x6f,0, - 0x63,0x61,0x6e,0x69,0x63,0x61,0, - 0x63,0x61,0x6e,0x74,0x6f,0, - 0x63,0x61,0x6e,0xcc,0x83,0x61,0, - 0x63,0x61,0x6e,0xcc,0x83,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x61,0x6f,0x62,0x61,0, - 0x63,0x61,0x6f,0x73,0, - 0x63,0x61,0x70,0x61,0x7a,0, - 0x63,0x61,0x70,0x69,0x74,0x61,0xcc,0x81,0x6e,0, - 0x63,0x61,0x70,0x6f,0x74,0x65,0, - 0x63,0x61,0x70,0x74,0x61,0x72,0, - 0x63,0x61,0x70,0x75,0x63,0x68,0x61,0, - 0x63,0x61,0x72,0x61,0, - 0x63,0x61,0x72,0x62,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x61,0xcc,0x81,0x72,0x63,0x65,0x6c,0, - 0x63,0x61,0x72,0x65,0x74,0x61,0, - 0x63,0x61,0x72,0x67,0x61,0, - 0x63,0x61,0x72,0x69,0x6e,0xcc,0x83,0x6f,0, - 0x63,0x61,0x72,0x6e,0x65,0, - 0x63,0x61,0x72,0x70,0x65,0x74,0x61,0, - 0x63,0x61,0x72,0x72,0x6f,0, - 0x63,0x61,0x72,0x74,0x61,0, - 0x63,0x61,0x73,0x61,0, - 0x63,0x61,0x73,0x63,0x6f,0, - 0x63,0x61,0x73,0x65,0x72,0x6f,0, - 0x63,0x61,0x73,0x70,0x61,0, - 0x63,0x61,0x73,0x74,0x6f,0x72,0, - 0x63,0x61,0x74,0x6f,0x72,0x63,0x65,0, - 0x63,0x61,0x74,0x72,0x65,0, - 0x63,0x61,0x75,0x64,0x61,0x6c,0, - 0x63,0x61,0x75,0x73,0x61,0, - 0x63,0x61,0x7a,0x6f,0, - 0x63,0x65,0x62,0x6f,0x6c,0x6c,0x61,0, - 0x63,0x65,0x64,0x65,0x72,0, - 0x63,0x65,0x64,0x72,0x6f,0, - 0x63,0x65,0x6c,0x64,0x61,0, - 0x63,0x65,0xcc,0x81,0x6c,0x65,0x62,0x72,0x65,0, - 0x63,0x65,0x6c,0x6f,0x73,0x6f,0, - 0x63,0x65,0xcc,0x81,0x6c,0x75,0x6c,0x61,0, - 0x63,0x65,0x6d,0x65,0x6e,0x74,0x6f,0, - 0x63,0x65,0x6e,0x69,0x7a,0x61,0, - 0x63,0x65,0x6e,0x74,0x72,0x6f,0, - 0x63,0x65,0x72,0x63,0x61,0, - 0x63,0x65,0x72,0x64,0x6f,0, - 0x63,0x65,0x72,0x65,0x7a,0x61,0, - 0x63,0x65,0x72,0x6f,0, - 0x63,0x65,0x72,0x72,0x61,0x72,0, - 0x63,0x65,0x72,0x74,0x65,0x7a,0x61,0, - 0x63,0x65,0xcc,0x81,0x73,0x70,0x65,0x64,0, - 0x63,0x65,0x74,0x72,0x6f,0, - 0x63,0x68,0x61,0x63,0x61,0x6c,0, - 0x63,0x68,0x61,0x6c,0x65,0x63,0x6f,0, - 0x63,0x68,0x61,0x6d,0x70,0x75,0xcc,0x81,0, - 0x63,0x68,0x61,0x6e,0x63,0x6c,0x61,0, - 0x63,0x68,0x61,0x70,0x61,0, - 0x63,0x68,0x61,0x72,0x6c,0x61,0, - 0x63,0x68,0x69,0x63,0x6f,0, - 0x63,0x68,0x69,0x73,0x74,0x65,0, - 0x63,0x68,0x69,0x76,0x6f,0, - 0x63,0x68,0x6f,0x71,0x75,0x65,0, - 0x63,0x68,0x6f,0x7a,0x61,0, - 0x63,0x68,0x75,0x6c,0x65,0x74,0x61,0, - 0x63,0x68,0x75,0x70,0x61,0x72,0, - 0x63,0x69,0x63,0x6c,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x69,0x65,0x67,0x6f,0, - 0x63,0x69,0x65,0x6c,0x6f,0, - 0x63,0x69,0x65,0x6e,0, - 0x63,0x69,0x65,0x72,0x74,0x6f,0, - 0x63,0x69,0x66,0x72,0x61,0, - 0x63,0x69,0x67,0x61,0x72,0x72,0x6f,0, - 0x63,0x69,0x6d,0x61,0, - 0x63,0x69,0x6e,0x63,0x6f,0, - 0x63,0x69,0x6e,0x65,0, - 0x63,0x69,0x6e,0x74,0x61,0, - 0x63,0x69,0x70,0x72,0x65,0xcc,0x81,0x73,0, - 0x63,0x69,0x72,0x63,0x6f,0, - 0x63,0x69,0x72,0x75,0x65,0x6c,0x61,0, - 0x63,0x69,0x73,0x6e,0x65,0, - 0x63,0x69,0x74,0x61,0, - 0x63,0x69,0x75,0x64,0x61,0x64,0, - 0x63,0x6c,0x61,0x6d,0x6f,0x72,0, - 0x63,0x6c,0x61,0x6e,0, - 0x63,0x6c,0x61,0x72,0x6f,0, - 0x63,0x6c,0x61,0x73,0x65,0, - 0x63,0x6c,0x61,0x76,0x65,0, - 0x63,0x6c,0x69,0x65,0x6e,0x74,0x65,0, - 0x63,0x6c,0x69,0x6d,0x61,0, - 0x63,0x6c,0x69,0xcc,0x81,0x6e,0x69,0x63,0x61,0, - 0x63,0x6f,0x62,0x72,0x65,0, - 0x63,0x6f,0x63,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x6f,0x63,0x68,0x69,0x6e,0x6f,0, - 0x63,0x6f,0x63,0x69,0x6e,0x61,0, - 0x63,0x6f,0x63,0x6f,0, - 0x63,0x6f,0xcc,0x81,0x64,0x69,0x67,0x6f,0, - 0x63,0x6f,0x64,0x6f,0, - 0x63,0x6f,0x66,0x72,0x65,0, - 0x63,0x6f,0x67,0x65,0x72,0, - 0x63,0x6f,0x68,0x65,0x74,0x65,0, - 0x63,0x6f,0x6a,0x69,0xcc,0x81,0x6e,0, - 0x63,0x6f,0x6a,0x6f,0, - 0x63,0x6f,0x6c,0x61,0, - 0x63,0x6f,0x6c,0x63,0x68,0x61,0, - 0x63,0x6f,0x6c,0x65,0x67,0x69,0x6f,0, - 0x63,0x6f,0x6c,0x67,0x61,0x72,0, - 0x63,0x6f,0x6c,0x69,0x6e,0x61,0, - 0x63,0x6f,0x6c,0x6c,0x61,0x72,0, - 0x63,0x6f,0x6c,0x6d,0x6f,0, - 0x63,0x6f,0x6c,0x75,0x6d,0x6e,0x61,0, - 0x63,0x6f,0x6d,0x62,0x61,0x74,0x65,0, - 0x63,0x6f,0x6d,0x65,0x72,0, - 0x63,0x6f,0x6d,0x69,0x64,0x61,0, - 0x63,0x6f,0xcc,0x81,0x6d,0x6f,0x64,0x6f,0, - 0x63,0x6f,0x6d,0x70,0x72,0x61,0, - 0x63,0x6f,0x6e,0x64,0x65,0, - 0x63,0x6f,0x6e,0x65,0x6a,0x6f,0, - 0x63,0x6f,0x6e,0x67,0x61,0, - 0x63,0x6f,0x6e,0x6f,0x63,0x65,0x72,0, - 0x63,0x6f,0x6e,0x73,0x65,0x6a,0x6f,0, - 0x63,0x6f,0x6e,0x74,0x61,0x72,0, - 0x63,0x6f,0x70,0x61,0, - 0x63,0x6f,0x70,0x69,0x61,0, - 0x63,0x6f,0x72,0x61,0x7a,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x6f,0x72,0x62,0x61,0x74,0x61,0, - 0x63,0x6f,0x72,0x63,0x68,0x6f,0, - 0x63,0x6f,0x72,0x64,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x6f,0x72,0x6f,0x6e,0x61,0, - 0x63,0x6f,0x72,0x72,0x65,0x72,0, - 0x63,0x6f,0x73,0x65,0x72,0, - 0x63,0x6f,0x73,0x6d,0x6f,0x73,0, - 0x63,0x6f,0x73,0x74,0x61,0, - 0x63,0x72,0x61,0xcc,0x81,0x6e,0x65,0x6f,0, - 0x63,0x72,0x61,0xcc,0x81,0x74,0x65,0x72,0, - 0x63,0x72,0x65,0x61,0x72,0, - 0x63,0x72,0x65,0x63,0x65,0x72,0, - 0x63,0x72,0x65,0x69,0xcc,0x81,0x64,0x6f,0, - 0x63,0x72,0x65,0x6d,0x61,0, - 0x63,0x72,0x69,0xcc,0x81,0x61,0, - 0x63,0x72,0x69,0x6d,0x65,0x6e,0, - 0x63,0x72,0x69,0x70,0x74,0x61,0, - 0x63,0x72,0x69,0x73,0x69,0x73,0, - 0x63,0x72,0x6f,0x6d,0x6f,0, - 0x63,0x72,0x6f,0xcc,0x81,0x6e,0x69,0x63,0x61,0, - 0x63,0x72,0x6f,0x71,0x75,0x65,0x74,0x61,0, - 0x63,0x72,0x75,0x64,0x6f,0, - 0x63,0x72,0x75,0x7a,0, - 0x63,0x75,0x61,0x64,0x72,0x6f,0, - 0x63,0x75,0x61,0x72,0x74,0x6f,0, - 0x63,0x75,0x61,0x74,0x72,0x6f,0, - 0x63,0x75,0x62,0x6f,0, - 0x63,0x75,0x62,0x72,0x69,0x72,0, - 0x63,0x75,0x63,0x68,0x61,0x72,0x61,0, - 0x63,0x75,0x65,0x6c,0x6c,0x6f,0, - 0x63,0x75,0x65,0x6e,0x74,0x6f,0, - 0x63,0x75,0x65,0x72,0x64,0x61,0, - 0x63,0x75,0x65,0x73,0x74,0x61,0, - 0x63,0x75,0x65,0x76,0x61,0, - 0x63,0x75,0x69,0x64,0x61,0x72,0, - 0x63,0x75,0x6c,0x65,0x62,0x72,0x61,0, - 0x63,0x75,0x6c,0x70,0x61,0, - 0x63,0x75,0x6c,0x74,0x6f,0, - 0x63,0x75,0x6d,0x62,0x72,0x65,0, - 0x63,0x75,0x6d,0x70,0x6c,0x69,0x72,0, - 0x63,0x75,0x6e,0x61,0, - 0x63,0x75,0x6e,0x65,0x74,0x61,0, - 0x63,0x75,0x6f,0x74,0x61,0, - 0x63,0x75,0x70,0x6f,0xcc,0x81,0x6e,0, - 0x63,0x75,0xcc,0x81,0x70,0x75,0x6c,0x61,0, - 0x63,0x75,0x72,0x61,0x72,0, - 0x63,0x75,0x72,0x69,0x6f,0x73,0x6f,0, - 0x63,0x75,0x72,0x73,0x6f,0, - 0x63,0x75,0x72,0x76,0x61,0, - 0x63,0x75,0x74,0x69,0x73,0, - 0x64,0x61,0x6d,0x61,0, - 0x64,0x61,0x6e,0x7a,0x61,0, - 0x64,0x61,0x72,0, - 0x64,0x61,0x72,0x64,0x6f,0, - 0x64,0x61,0xcc,0x81,0x74,0x69,0x6c,0, - 0x64,0x65,0x62,0x65,0x72,0, - 0x64,0x65,0xcc,0x81,0x62,0x69,0x6c,0, - 0x64,0x65,0xcc,0x81,0x63,0x61,0x64,0x61,0, - 0x64,0x65,0x63,0x69,0x72,0, - 0x64,0x65,0x64,0x6f,0, - 0x64,0x65,0x66,0x65,0x6e,0x73,0x61,0, - 0x64,0x65,0x66,0x69,0x6e,0x69,0x72,0, - 0x64,0x65,0x6a,0x61,0x72,0, - 0x64,0x65,0x6c,0x66,0x69,0xcc,0x81,0x6e,0, - 0x64,0x65,0x6c,0x67,0x61,0x64,0x6f,0, - 0x64,0x65,0x6c,0x69,0x74,0x6f,0, - 0x64,0x65,0x6d,0x6f,0x72,0x61,0, - 0x64,0x65,0x6e,0x73,0x6f,0, - 0x64,0x65,0x6e,0x74,0x61,0x6c,0, - 0x64,0x65,0x70,0x6f,0x72,0x74,0x65,0, - 0x64,0x65,0x72,0x65,0x63,0x68,0x6f,0, - 0x64,0x65,0x72,0x72,0x6f,0x74,0x61,0, - 0x64,0x65,0x73,0x61,0x79,0x75,0x6e,0x6f,0, - 0x64,0x65,0x73,0x65,0x6f,0, - 0x64,0x65,0x73,0x66,0x69,0x6c,0x65,0, - 0x64,0x65,0x73,0x6e,0x75,0x64,0x6f,0, - 0x64,0x65,0x73,0x74,0x69,0x6e,0x6f,0, - 0x64,0x65,0x73,0x76,0x69,0xcc,0x81,0x6f,0, - 0x64,0x65,0x74,0x61,0x6c,0x6c,0x65,0, - 0x64,0x65,0x74,0x65,0x6e,0x65,0x72,0, - 0x64,0x65,0x75,0x64,0x61,0, - 0x64,0x69,0xcc,0x81,0x61,0, - 0x64,0x69,0x61,0x62,0x6c,0x6f,0, - 0x64,0x69,0x61,0x64,0x65,0x6d,0x61,0, - 0x64,0x69,0x61,0x6d,0x61,0x6e,0x74,0x65,0, - 0x64,0x69,0x61,0x6e,0x61,0, - 0x64,0x69,0x61,0x72,0x69,0x6f,0, - 0x64,0x69,0x62,0x75,0x6a,0x6f,0, - 0x64,0x69,0x63,0x74,0x61,0x72,0, - 0x64,0x69,0x65,0x6e,0x74,0x65,0, - 0x64,0x69,0x65,0x74,0x61,0, - 0x64,0x69,0x65,0x7a,0, - 0x64,0x69,0x66,0x69,0xcc,0x81,0x63,0x69,0x6c,0, - 0x64,0x69,0x67,0x6e,0x6f,0, - 0x64,0x69,0x6c,0x65,0x6d,0x61,0, - 0x64,0x69,0x6c,0x75,0x69,0x72,0, - 0x64,0x69,0x6e,0x65,0x72,0x6f,0, - 0x64,0x69,0x72,0x65,0x63,0x74,0x6f,0, - 0x64,0x69,0x72,0x69,0x67,0x69,0x72,0, - 0x64,0x69,0x73,0x63,0x6f,0, - 0x64,0x69,0x73,0x65,0x6e,0xcc,0x83,0x6f,0, - 0x64,0x69,0x73,0x66,0x72,0x61,0x7a,0, - 0x64,0x69,0x76,0x61,0, - 0x64,0x69,0x76,0x69,0x6e,0x6f,0, - 0x64,0x6f,0x62,0x6c,0x65,0, - 0x64,0x6f,0x63,0x65,0, - 0x64,0x6f,0x6c,0x6f,0x72,0, - 0x64,0x6f,0x6d,0x69,0x6e,0x67,0x6f,0, - 0x64,0x6f,0x6e,0, - 0x64,0x6f,0x6e,0x61,0x72,0, - 0x64,0x6f,0x72,0x61,0x64,0x6f,0, - 0x64,0x6f,0x72,0x6d,0x69,0x72,0, - 0x64,0x6f,0x72,0x73,0x6f,0, - 0x64,0x6f,0x73,0, - 0x64,0x6f,0x73,0x69,0x73,0, - 0x64,0x72,0x61,0x67,0x6f,0xcc,0x81,0x6e,0, - 0x64,0x72,0x6f,0x67,0x61,0, - 0x64,0x75,0x63,0x68,0x61,0, - 0x64,0x75,0x64,0x61,0, - 0x64,0x75,0x65,0x6c,0x6f,0, - 0x64,0x75,0x65,0x6e,0xcc,0x83,0x6f,0, - 0x64,0x75,0x6c,0x63,0x65,0, - 0x64,0x75,0xcc,0x81,0x6f,0, - 0x64,0x75,0x71,0x75,0x65,0, - 0x64,0x75,0x72,0x61,0x72,0, - 0x64,0x75,0x72,0x65,0x7a,0x61,0, - 0x64,0x75,0x72,0x6f,0, - 0x65,0xcc,0x81,0x62,0x61,0x6e,0x6f,0, - 0x65,0x62,0x72,0x69,0x6f,0, - 0x65,0x63,0x68,0x61,0x72,0, - 0x65,0x63,0x6f,0, - 0x65,0x63,0x75,0x61,0x64,0x6f,0x72,0, - 0x65,0x64,0x61,0x64,0, - 0x65,0x64,0x69,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x65,0x64,0x69,0x66,0x69,0x63,0x69,0x6f,0, - 0x65,0x64,0x69,0x74,0x6f,0x72,0, - 0x65,0x64,0x75,0x63,0x61,0x72,0, - 0x65,0x66,0x65,0x63,0x74,0x6f,0, - 0x65,0x66,0x69,0x63,0x61,0x7a,0, - 0x65,0x6a,0x65,0, - 0x65,0x6a,0x65,0x6d,0x70,0x6c,0x6f,0, - 0x65,0x6c,0x65,0x66,0x61,0x6e,0x74,0x65,0, - 0x65,0x6c,0x65,0x67,0x69,0x72,0, - 0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x6f,0, - 0x65,0x6c,0x65,0x76,0x61,0x72,0, - 0x65,0x6c,0x69,0x70,0x73,0x65,0, - 0x65,0xcc,0x81,0x6c,0x69,0x74,0x65,0, - 0x65,0x6c,0x69,0x78,0x69,0x72,0, - 0x65,0x6c,0x6f,0x67,0x69,0x6f,0, - 0x65,0x6c,0x75,0x64,0x69,0x72,0, - 0x65,0x6d,0x62,0x75,0x64,0x6f,0, - 0x65,0x6d,0x69,0x74,0x69,0x72,0, - 0x65,0x6d,0x6f,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x65,0x6d,0x70,0x61,0x74,0x65,0, - 0x65,0x6d,0x70,0x65,0x6e,0xcc,0x83,0x6f,0, - 0x65,0x6d,0x70,0x6c,0x65,0x6f,0, - 0x65,0x6d,0x70,0x72,0x65,0x73,0x61,0, - 0x65,0x6e,0x61,0x6e,0x6f,0, - 0x65,0x6e,0x63,0x61,0x72,0x67,0x6f,0, - 0x65,0x6e,0x63,0x68,0x75,0x66,0x65,0, - 0x65,0x6e,0x63,0x69,0xcc,0x81,0x61,0, - 0x65,0x6e,0x65,0x6d,0x69,0x67,0x6f,0, - 0x65,0x6e,0x65,0x72,0x6f,0, - 0x65,0x6e,0x66,0x61,0x64,0x6f,0, - 0x65,0x6e,0x66,0x65,0x72,0x6d,0x6f,0, - 0x65,0x6e,0x67,0x61,0x6e,0xcc,0x83,0x6f,0, - 0x65,0x6e,0x69,0x67,0x6d,0x61,0, - 0x65,0x6e,0x6c,0x61,0x63,0x65,0, - 0x65,0x6e,0x6f,0x72,0x6d,0x65,0, - 0x65,0x6e,0x72,0x65,0x64,0x6f,0, - 0x65,0x6e,0x73,0x61,0x79,0x6f,0, - 0x65,0x6e,0x73,0x65,0x6e,0xcc,0x83,0x61,0x72,0, - 0x65,0x6e,0x74,0x65,0x72,0x6f,0, - 0x65,0x6e,0x74,0x72,0x61,0x72,0, - 0x65,0x6e,0x76,0x61,0x73,0x65,0, - 0x65,0x6e,0x76,0x69,0xcc,0x81,0x6f,0, - 0x65,0xcc,0x81,0x70,0x6f,0x63,0x61,0, - 0x65,0x71,0x75,0x69,0x70,0x6f,0, - 0x65,0x72,0x69,0x7a,0x6f,0, - 0x65,0x73,0x63,0x61,0x6c,0x61,0, - 0x65,0x73,0x63,0x65,0x6e,0x61,0, - 0x65,0x73,0x63,0x6f,0x6c,0x61,0x72,0, - 0x65,0x73,0x63,0x72,0x69,0x62,0x69,0x72,0, - 0x65,0x73,0x63,0x75,0x64,0x6f,0, - 0x65,0x73,0x65,0x6e,0x63,0x69,0x61,0, - 0x65,0x73,0x66,0x65,0x72,0x61,0, - 0x65,0x73,0x66,0x75,0x65,0x72,0x7a,0x6f,0, - 0x65,0x73,0x70,0x61,0x64,0x61,0, - 0x65,0x73,0x70,0x65,0x6a,0x6f,0, - 0x65,0x73,0x70,0x69,0xcc,0x81,0x61,0, - 0x65,0x73,0x70,0x6f,0x73,0x61,0, - 0x65,0x73,0x70,0x75,0x6d,0x61,0, - 0x65,0x73,0x71,0x75,0x69,0xcc,0x81,0, - 0x65,0x73,0x74,0x61,0x72,0, - 0x65,0x73,0x74,0x65,0, - 0x65,0x73,0x74,0x69,0x6c,0x6f,0, - 0x65,0x73,0x74,0x75,0x66,0x61,0, - 0x65,0x74,0x61,0x70,0x61,0, - 0x65,0x74,0x65,0x72,0x6e,0x6f,0, - 0x65,0xcc,0x81,0x74,0x69,0x63,0x61,0, - 0x65,0x74,0x6e,0x69,0x61,0, - 0x65,0x76,0x61,0x64,0x69,0x72,0, - 0x65,0x76,0x61,0x6c,0x75,0x61,0x72,0, - 0x65,0x76,0x65,0x6e,0x74,0x6f,0, - 0x65,0x76,0x69,0x74,0x61,0x72,0, - 0x65,0x78,0x61,0x63,0x74,0x6f,0, - 0x65,0x78,0x61,0x6d,0x65,0x6e,0, - 0x65,0x78,0x63,0x65,0x73,0x6f,0, - 0x65,0x78,0x63,0x75,0x73,0x61,0, - 0x65,0x78,0x65,0x6e,0x74,0x6f,0, - 0x65,0x78,0x69,0x67,0x69,0x72,0, - 0x65,0x78,0x69,0x6c,0x69,0x6f,0, - 0x65,0x78,0x69,0x73,0x74,0x69,0x72,0, - 0x65,0xcc,0x81,0x78,0x69,0x74,0x6f,0, - 0x65,0x78,0x70,0x65,0x72,0x74,0x6f,0, - 0x65,0x78,0x70,0x6c,0x69,0x63,0x61,0x72,0, - 0x65,0x78,0x70,0x6f,0x6e,0x65,0x72,0, - 0x65,0x78,0x74,0x72,0x65,0x6d,0x6f,0, - 0x66,0x61,0xcc,0x81,0x62,0x72,0x69,0x63,0x61,0, - 0x66,0x61,0xcc,0x81,0x62,0x75,0x6c,0x61,0, - 0x66,0x61,0x63,0x68,0x61,0x64,0x61,0, - 0x66,0x61,0xcc,0x81,0x63,0x69,0x6c,0, - 0x66,0x61,0x63,0x74,0x6f,0x72,0, - 0x66,0x61,0x65,0x6e,0x61,0, - 0x66,0x61,0x6a,0x61,0, - 0x66,0x61,0x6c,0x64,0x61,0, - 0x66,0x61,0x6c,0x6c,0x6f,0, - 0x66,0x61,0x6c,0x73,0x6f,0, - 0x66,0x61,0x6c,0x74,0x61,0x72,0, - 0x66,0x61,0x6d,0x61,0, - 0x66,0x61,0x6d,0x69,0x6c,0x69,0x61,0, - 0x66,0x61,0x6d,0x6f,0x73,0x6f,0, - 0x66,0x61,0x72,0x61,0x6f,0xcc,0x81,0x6e,0, - 0x66,0x61,0x72,0x6d,0x61,0x63,0x69,0x61,0, - 0x66,0x61,0x72,0x6f,0x6c,0, - 0x66,0x61,0x72,0x73,0x61,0, - 0x66,0x61,0x73,0x65,0, - 0x66,0x61,0x74,0x69,0x67,0x61,0, - 0x66,0x61,0x75,0x6e,0x61,0, - 0x66,0x61,0x76,0x6f,0x72,0, - 0x66,0x61,0x78,0, - 0x66,0x65,0x62,0x72,0x65,0x72,0x6f,0, - 0x66,0x65,0x63,0x68,0x61,0, - 0x66,0x65,0x6c,0x69,0x7a,0, - 0x66,0x65,0x6f,0, - 0x66,0x65,0x72,0x69,0x61,0, - 0x66,0x65,0x72,0x6f,0x7a,0, - 0x66,0x65,0xcc,0x81,0x72,0x74,0x69,0x6c,0, - 0x66,0x65,0x72,0x76,0x6f,0x72,0, - 0x66,0x65,0x73,0x74,0x69,0xcc,0x81,0x6e,0, - 0x66,0x69,0x61,0x62,0x6c,0x65,0, - 0x66,0x69,0x61,0x6e,0x7a,0x61,0, - 0x66,0x69,0x61,0x72,0, - 0x66,0x69,0x62,0x72,0x61,0, - 0x66,0x69,0x63,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x66,0x69,0x63,0x68,0x61,0, - 0x66,0x69,0x64,0x65,0x6f,0, - 0x66,0x69,0x65,0x62,0x72,0x65,0, - 0x66,0x69,0x65,0x6c,0, - 0x66,0x69,0x65,0x72,0x61,0, - 0x66,0x69,0x65,0x73,0x74,0x61,0, - 0x66,0x69,0x67,0x75,0x72,0x61,0, - 0x66,0x69,0x6a,0x61,0x72,0, - 0x66,0x69,0x6a,0x6f,0, - 0x66,0x69,0x6c,0x61,0, - 0x66,0x69,0x6c,0x65,0x74,0x65,0, - 0x66,0x69,0x6c,0x69,0x61,0x6c,0, - 0x66,0x69,0x6c,0x74,0x72,0x6f,0, - 0x66,0x69,0x6e,0, - 0x66,0x69,0x6e,0x63,0x61,0, - 0x66,0x69,0x6e,0x67,0x69,0x72,0, - 0x66,0x69,0x6e,0x69,0x74,0x6f,0, - 0x66,0x69,0x72,0x6d,0x61,0, - 0x66,0x6c,0x61,0x63,0x6f,0, - 0x66,0x6c,0x61,0x75,0x74,0x61,0, - 0x66,0x6c,0x65,0x63,0x68,0x61,0, - 0x66,0x6c,0x6f,0x72,0, - 0x66,0x6c,0x6f,0x74,0x61,0, - 0x66,0x6c,0x75,0x69,0x72,0, - 0x66,0x6c,0x75,0x6a,0x6f,0, - 0x66,0x6c,0x75,0xcc,0x81,0x6f,0x72,0, - 0x66,0x6f,0x62,0x69,0x61,0, - 0x66,0x6f,0x63,0x61,0, - 0x66,0x6f,0x67,0x61,0x74,0x61,0, - 0x66,0x6f,0x67,0x6f,0xcc,0x81,0x6e,0, - 0x66,0x6f,0x6c,0x69,0x6f,0, - 0x66,0x6f,0x6c,0x6c,0x65,0x74,0x6f,0, - 0x66,0x6f,0x6e,0x64,0x6f,0, - 0x66,0x6f,0x72,0x6d,0x61,0, - 0x66,0x6f,0x72,0x72,0x6f,0, - 0x66,0x6f,0x72,0x74,0x75,0x6e,0x61,0, - 0x66,0x6f,0x72,0x7a,0x61,0x72,0, - 0x66,0x6f,0x73,0x61,0, - 0x66,0x6f,0x74,0x6f,0, - 0x66,0x72,0x61,0x63,0x61,0x73,0x6f,0, - 0x66,0x72,0x61,0xcc,0x81,0x67,0x69,0x6c,0, - 0x66,0x72,0x61,0x6e,0x6a,0x61,0, - 0x66,0x72,0x61,0x73,0x65,0, - 0x66,0x72,0x61,0x75,0x64,0x65,0, - 0x66,0x72,0x65,0x69,0xcc,0x81,0x72,0, - 0x66,0x72,0x65,0x6e,0x6f,0, - 0x66,0x72,0x65,0x73,0x61,0, - 0x66,0x72,0x69,0xcc,0x81,0x6f,0, - 0x66,0x72,0x69,0x74,0x6f,0, - 0x66,0x72,0x75,0x74,0x61,0, - 0x66,0x75,0x65,0x67,0x6f,0, - 0x66,0x75,0x65,0x6e,0x74,0x65,0, - 0x66,0x75,0x65,0x72,0x7a,0x61,0, - 0x66,0x75,0x67,0x61,0, - 0x66,0x75,0x6d,0x61,0x72,0, - 0x66,0x75,0x6e,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x66,0x75,0x6e,0x64,0x61,0, - 0x66,0x75,0x72,0x67,0x6f,0xcc,0x81,0x6e,0, - 0x66,0x75,0x72,0x69,0x61,0, - 0x66,0x75,0x73,0x69,0x6c,0, - 0x66,0x75,0xcc,0x81,0x74,0x62,0x6f,0x6c,0, - 0x66,0x75,0x74,0x75,0x72,0x6f,0, - 0x67,0x61,0x63,0x65,0x6c,0x61,0, - 0x67,0x61,0x66,0x61,0x73,0, - 0x67,0x61,0x69,0x74,0x61,0, - 0x67,0x61,0x6a,0x6f,0, - 0x67,0x61,0x6c,0x61,0, - 0x67,0x61,0x6c,0x65,0x72,0x69,0xcc,0x81,0x61,0, - 0x67,0x61,0x6c,0x6c,0x6f,0, - 0x67,0x61,0x6d,0x62,0x61,0, - 0x67,0x61,0x6e,0x61,0x72,0, - 0x67,0x61,0x6e,0x63,0x68,0x6f,0, - 0x67,0x61,0x6e,0x67,0x61,0, - 0x67,0x61,0x6e,0x73,0x6f,0, - 0x67,0x61,0x72,0x61,0x6a,0x65,0, - 0x67,0x61,0x72,0x7a,0x61,0, - 0x67,0x61,0x73,0x6f,0x6c,0x69,0x6e,0x61,0, - 0x67,0x61,0x73,0x74,0x61,0x72,0, - 0x67,0x61,0x74,0x6f,0, - 0x67,0x61,0x76,0x69,0x6c,0x61,0xcc,0x81,0x6e,0, - 0x67,0x65,0x6d,0x65,0x6c,0x6f,0, - 0x67,0x65,0x6d,0x69,0x72,0, - 0x67,0x65,0x6e,0, - 0x67,0x65,0xcc,0x81,0x6e,0x65,0x72,0x6f,0, - 0x67,0x65,0x6e,0x69,0x6f,0, - 0x67,0x65,0x6e,0x74,0x65,0, - 0x67,0x65,0x72,0x61,0x6e,0x69,0x6f,0, - 0x67,0x65,0x72,0x65,0x6e,0x74,0x65,0, - 0x67,0x65,0x72,0x6d,0x65,0x6e,0, - 0x67,0x65,0x73,0x74,0x6f,0, - 0x67,0x69,0x67,0x61,0x6e,0x74,0x65,0, - 0x67,0x69,0x6d,0x6e,0x61,0x73,0x69,0x6f,0, - 0x67,0x69,0x72,0x61,0x72,0, - 0x67,0x69,0x72,0x6f,0, - 0x67,0x6c,0x61,0x63,0x69,0x61,0x72,0, - 0x67,0x6c,0x6f,0x62,0x6f,0, - 0x67,0x6c,0x6f,0x72,0x69,0x61,0, - 0x67,0x6f,0x6c,0, - 0x67,0x6f,0x6c,0x66,0x6f,0, - 0x67,0x6f,0x6c,0x6f,0x73,0x6f,0, - 0x67,0x6f,0x6c,0x70,0x65,0, - 0x67,0x6f,0x6d,0x61,0, - 0x67,0x6f,0x72,0x64,0x6f,0, - 0x67,0x6f,0x72,0x69,0x6c,0x61,0, - 0x67,0x6f,0x72,0x72,0x61,0, - 0x67,0x6f,0x74,0x61,0, - 0x67,0x6f,0x74,0x65,0x6f,0, - 0x67,0x6f,0x7a,0x61,0x72,0, - 0x67,0x72,0x61,0x64,0x61,0, - 0x67,0x72,0x61,0xcc,0x81,0x66,0x69,0x63,0x6f,0, - 0x67,0x72,0x61,0x6e,0x6f,0, - 0x67,0x72,0x61,0x73,0x61,0, - 0x67,0x72,0x61,0x74,0x69,0x73,0, - 0x67,0x72,0x61,0x76,0x65,0, - 0x67,0x72,0x69,0x65,0x74,0x61,0, - 0x67,0x72,0x69,0x6c,0x6c,0x6f,0, - 0x67,0x72,0x69,0x70,0x65,0, - 0x67,0x72,0x69,0x73,0, - 0x67,0x72,0x69,0x74,0x6f,0, - 0x67,0x72,0x6f,0x73,0x6f,0x72,0, - 0x67,0x72,0x75,0xcc,0x81,0x61,0, - 0x67,0x72,0x75,0x65,0x73,0x6f,0, - 0x67,0x72,0x75,0x6d,0x6f,0, - 0x67,0x72,0x75,0x70,0x6f,0, - 0x67,0x75,0x61,0x6e,0x74,0x65,0, - 0x67,0x75,0x61,0x70,0x6f,0, - 0x67,0x75,0x61,0x72,0x64,0x69,0x61,0, - 0x67,0x75,0x65,0x72,0x72,0x61,0, - 0x67,0x75,0x69,0xcc,0x81,0x61,0, - 0x67,0x75,0x69,0x6e,0xcc,0x83,0x6f,0, - 0x67,0x75,0x69,0x6f,0x6e,0, - 0x67,0x75,0x69,0x73,0x6f,0, - 0x67,0x75,0x69,0x74,0x61,0x72,0x72,0x61,0, - 0x67,0x75,0x73,0x61,0x6e,0x6f,0, - 0x67,0x75,0x73,0x74,0x61,0x72,0, - 0x68,0x61,0x62,0x65,0x72,0, - 0x68,0x61,0xcc,0x81,0x62,0x69,0x6c,0, - 0x68,0x61,0x62,0x6c,0x61,0x72,0, - 0x68,0x61,0x63,0x65,0x72,0, - 0x68,0x61,0x63,0x68,0x61,0, - 0x68,0x61,0x64,0x61,0, - 0x68,0x61,0x6c,0x6c,0x61,0x72,0, - 0x68,0x61,0x6d,0x61,0x63,0x61,0, - 0x68,0x61,0x72,0x69,0x6e,0x61,0, - 0x68,0x61,0x7a,0, - 0x68,0x61,0x7a,0x61,0x6e,0xcc,0x83,0x61,0, - 0x68,0x65,0x62,0x69,0x6c,0x6c,0x61,0, - 0x68,0x65,0x62,0x72,0x61,0, - 0x68,0x65,0x63,0x68,0x6f,0, - 0x68,0x65,0x6c,0x61,0x64,0x6f,0, - 0x68,0x65,0x6c,0x69,0x6f,0, - 0x68,0x65,0x6d,0x62,0x72,0x61,0, - 0x68,0x65,0x72,0x69,0x72,0, - 0x68,0x65,0x72,0x6d,0x61,0x6e,0x6f,0, - 0x68,0x65,0xcc,0x81,0x72,0x6f,0x65,0, - 0x68,0x65,0x72,0x76,0x69,0x72,0, - 0x68,0x69,0x65,0x6c,0x6f,0, - 0x68,0x69,0x65,0x72,0x72,0x6f,0, - 0x68,0x69,0xcc,0x81,0x67,0x61,0x64,0x6f,0, - 0x68,0x69,0x67,0x69,0x65,0x6e,0x65,0, - 0x68,0x69,0x6a,0x6f,0, - 0x68,0x69,0x6d,0x6e,0x6f,0, - 0x68,0x69,0x73,0x74,0x6f,0x72,0x69,0x61,0, - 0x68,0x6f,0x63,0x69,0x63,0x6f,0, - 0x68,0x6f,0x67,0x61,0x72,0, - 0x68,0x6f,0x67,0x75,0x65,0x72,0x61,0, - 0x68,0x6f,0x6a,0x61,0, - 0x68,0x6f,0x6d,0x62,0x72,0x65,0, - 0x68,0x6f,0x6e,0x67,0x6f,0, - 0x68,0x6f,0x6e,0x6f,0x72,0, - 0x68,0x6f,0x6e,0x72,0x61,0, - 0x68,0x6f,0x72,0x61,0, - 0x68,0x6f,0x72,0x6d,0x69,0x67,0x61,0, - 0x68,0x6f,0x72,0x6e,0x6f,0, - 0x68,0x6f,0x73,0x74,0x69,0x6c,0, - 0x68,0x6f,0x79,0x6f,0, - 0x68,0x75,0x65,0x63,0x6f,0, - 0x68,0x75,0x65,0x6c,0x67,0x61,0, - 0x68,0x75,0x65,0x72,0x74,0x61,0, - 0x68,0x75,0x65,0x73,0x6f,0, - 0x68,0x75,0x65,0x76,0x6f,0, - 0x68,0x75,0x69,0x64,0x61,0, - 0x68,0x75,0x69,0x72,0, - 0x68,0x75,0x6d,0x61,0x6e,0x6f,0, - 0x68,0x75,0xcc,0x81,0x6d,0x65,0x64,0x6f,0, - 0x68,0x75,0x6d,0x69,0x6c,0x64,0x65,0, - 0x68,0x75,0x6d,0x6f,0, - 0x68,0x75,0x6e,0x64,0x69,0x72,0, - 0x68,0x75,0x72,0x61,0x63,0x61,0xcc,0x81,0x6e,0, - 0x68,0x75,0x72,0x74,0x6f,0, - 0x69,0x63,0x6f,0x6e,0x6f,0, - 0x69,0x64,0x65,0x61,0x6c,0, - 0x69,0x64,0x69,0x6f,0x6d,0x61,0, - 0x69,0xcc,0x81,0x64,0x6f,0x6c,0x6f,0, - 0x69,0x67,0x6c,0x65,0x73,0x69,0x61,0, - 0x69,0x67,0x6c,0x75,0xcc,0x81,0, - 0x69,0x67,0x75,0x61,0x6c,0, - 0x69,0x6c,0x65,0x67,0x61,0x6c,0, - 0x69,0x6c,0x75,0x73,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x69,0x6d,0x61,0x67,0x65,0x6e,0, - 0x69,0x6d,0x61,0xcc,0x81,0x6e,0, - 0x69,0x6d,0x69,0x74,0x61,0x72,0, - 0x69,0x6d,0x70,0x61,0x72,0, - 0x69,0x6d,0x70,0x65,0x72,0x69,0x6f,0, - 0x69,0x6d,0x70,0x6f,0x6e,0x65,0x72,0, - 0x69,0x6d,0x70,0x75,0x6c,0x73,0x6f,0, - 0x69,0x6e,0x63,0x61,0x70,0x61,0x7a,0, - 0x69,0xcc,0x81,0x6e,0x64,0x69,0x63,0x65,0, - 0x69,0x6e,0x65,0x72,0x74,0x65,0, - 0x69,0x6e,0x66,0x69,0x65,0x6c,0, - 0x69,0x6e,0x66,0x6f,0x72,0x6d,0x65,0, - 0x69,0x6e,0x67,0x65,0x6e,0x69,0x6f,0, - 0x69,0x6e,0x69,0x63,0x69,0x6f,0, - 0x69,0x6e,0x6d,0x65,0x6e,0x73,0x6f,0, - 0x69,0x6e,0x6d,0x75,0x6e,0x65,0, - 0x69,0x6e,0x6e,0x61,0x74,0x6f,0, - 0x69,0x6e,0x73,0x65,0x63,0x74,0x6f,0, - 0x69,0x6e,0x73,0x74,0x61,0x6e,0x74,0x65,0, - 0x69,0x6e,0x74,0x65,0x72,0x65,0xcc,0x81,0x73,0, - 0x69,0xcc,0x81,0x6e,0x74,0x69,0x6d,0x6f,0, - 0x69,0x6e,0x74,0x75,0x69,0x72,0, - 0x69,0x6e,0x75,0xcc,0x81,0x74,0x69,0x6c,0, - 0x69,0x6e,0x76,0x69,0x65,0x72,0x6e,0x6f,0, - 0x69,0x72,0x61,0, - 0x69,0x72,0x69,0x73,0, - 0x69,0x72,0x6f,0x6e,0x69,0xcc,0x81,0x61,0, - 0x69,0x73,0x6c,0x61,0, - 0x69,0x73,0x6c,0x6f,0x74,0x65,0, - 0x6a,0x61,0x62,0x61,0x6c,0x69,0xcc,0x81,0, - 0x6a,0x61,0x62,0x6f,0xcc,0x81,0x6e,0, - 0x6a,0x61,0x6d,0x6f,0xcc,0x81,0x6e,0, - 0x6a,0x61,0x72,0x61,0x62,0x65,0, - 0x6a,0x61,0x72,0x64,0x69,0xcc,0x81,0x6e,0, - 0x6a,0x61,0x72,0x72,0x61,0, - 0x6a,0x61,0x75,0x6c,0x61,0, - 0x6a,0x61,0x7a,0x6d,0x69,0xcc,0x81,0x6e,0, - 0x6a,0x65,0x66,0x65,0, - 0x6a,0x65,0x72,0x69,0x6e,0x67,0x61,0, - 0x6a,0x69,0x6e,0x65,0x74,0x65,0, - 0x6a,0x6f,0x72,0x6e,0x61,0x64,0x61,0, - 0x6a,0x6f,0x72,0x6f,0x62,0x61,0, - 0x6a,0x6f,0x76,0x65,0x6e,0, - 0x6a,0x6f,0x79,0x61,0, - 0x6a,0x75,0x65,0x72,0x67,0x61,0, - 0x6a,0x75,0x65,0x76,0x65,0x73,0, - 0x6a,0x75,0x65,0x7a,0, - 0x6a,0x75,0x67,0x61,0x64,0x6f,0x72,0, - 0x6a,0x75,0x67,0x6f,0, - 0x6a,0x75,0x67,0x75,0x65,0x74,0x65,0, - 0x6a,0x75,0x69,0x63,0x69,0x6f,0, - 0x6a,0x75,0x6e,0x63,0x6f,0, - 0x6a,0x75,0x6e,0x67,0x6c,0x61,0, - 0x6a,0x75,0x6e,0x69,0x6f,0, - 0x6a,0x75,0x6e,0x74,0x61,0x72,0, - 0x6a,0x75,0xcc,0x81,0x70,0x69,0x74,0x65,0x72,0, - 0x6a,0x75,0x72,0x61,0x72,0, - 0x6a,0x75,0x73,0x74,0x6f,0, - 0x6a,0x75,0x76,0x65,0x6e,0x69,0x6c,0, - 0x6a,0x75,0x7a,0x67,0x61,0x72,0, - 0x6b,0x69,0x6c,0x6f,0, - 0x6b,0x6f,0x61,0x6c,0x61,0, - 0x6c,0x61,0x62,0x69,0x6f,0, - 0x6c,0x61,0x63,0x69,0x6f,0, - 0x6c,0x61,0x63,0x72,0x61,0, - 0x6c,0x61,0x64,0x6f,0, - 0x6c,0x61,0x64,0x72,0x6f,0xcc,0x81,0x6e,0, - 0x6c,0x61,0x67,0x61,0x72,0x74,0x6f,0, - 0x6c,0x61,0xcc,0x81,0x67,0x72,0x69,0x6d,0x61,0, - 0x6c,0x61,0x67,0x75,0x6e,0x61,0, - 0x6c,0x61,0x69,0x63,0x6f,0, - 0x6c,0x61,0x6d,0x65,0x72,0, - 0x6c,0x61,0xcc,0x81,0x6d,0x69,0x6e,0x61,0, - 0x6c,0x61,0xcc,0x81,0x6d,0x70,0x61,0x72,0x61,0, - 0x6c,0x61,0x6e,0x61,0, - 0x6c,0x61,0x6e,0x63,0x68,0x61,0, - 0x6c,0x61,0x6e,0x67,0x6f,0x73,0x74,0x61,0, - 0x6c,0x61,0x6e,0x7a,0x61,0, - 0x6c,0x61,0xcc,0x81,0x70,0x69,0x7a,0, - 0x6c,0x61,0x72,0x67,0x6f,0, - 0x6c,0x61,0x72,0x76,0x61,0, - 0x6c,0x61,0xcc,0x81,0x73,0x74,0x69,0x6d,0x61,0, - 0x6c,0x61,0x74,0x61,0, - 0x6c,0x61,0xcc,0x81,0x74,0x65,0x78,0, - 0x6c,0x61,0x74,0x69,0x72,0, - 0x6c,0x61,0x75,0x72,0x65,0x6c,0, - 0x6c,0x61,0x76,0x61,0x72,0, - 0x6c,0x61,0x7a,0x6f,0, - 0x6c,0x65,0x61,0x6c,0, - 0x6c,0x65,0x63,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x6c,0x65,0x63,0x68,0x65,0, - 0x6c,0x65,0x63,0x74,0x6f,0x72,0, - 0x6c,0x65,0x65,0x72,0, - 0x6c,0x65,0x67,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x6c,0x65,0x67,0x75,0x6d,0x62,0x72,0x65,0, - 0x6c,0x65,0x6a,0x61,0x6e,0x6f,0, - 0x6c,0x65,0x6e,0x67,0x75,0x61,0, - 0x6c,0x65,0x6e,0x74,0x6f,0, - 0x6c,0x65,0x6e,0xcc,0x83,0x61,0, - 0x6c,0x65,0x6f,0xcc,0x81,0x6e,0, - 0x6c,0x65,0x6f,0x70,0x61,0x72,0x64,0x6f,0, - 0x6c,0x65,0x73,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x6c,0x65,0x74,0x61,0x6c,0, - 0x6c,0x65,0x74,0x72,0x61,0, - 0x6c,0x65,0x76,0x65,0, - 0x6c,0x65,0x79,0x65,0x6e,0x64,0x61,0, - 0x6c,0x69,0x62,0x65,0x72,0x74,0x61,0x64,0, - 0x6c,0x69,0x62,0x72,0x6f,0, - 0x6c,0x69,0x63,0x6f,0x72,0, - 0x6c,0x69,0xcc,0x81,0x64,0x65,0x72,0, - 0x6c,0x69,0x64,0x69,0x61,0x72,0, - 0x6c,0x69,0x65,0x6e,0x7a,0x6f,0, - 0x6c,0x69,0x67,0x61,0, - 0x6c,0x69,0x67,0x65,0x72,0x6f,0, - 0x6c,0x69,0x6d,0x61,0, - 0x6c,0x69,0xcc,0x81,0x6d,0x69,0x74,0x65,0, - 0x6c,0x69,0x6d,0x6f,0xcc,0x81,0x6e,0, - 0x6c,0x69,0x6d,0x70,0x69,0x6f,0, - 0x6c,0x69,0x6e,0x63,0x65,0, - 0x6c,0x69,0x6e,0x64,0x6f,0, - 0x6c,0x69,0xcc,0x81,0x6e,0x65,0x61,0, - 0x6c,0x69,0x6e,0x67,0x6f,0x74,0x65,0, - 0x6c,0x69,0x6e,0x6f,0, - 0x6c,0x69,0x6e,0x74,0x65,0x72,0x6e,0x61,0, - 0x6c,0x69,0xcc,0x81,0x71,0x75,0x69,0x64,0x6f,0, - 0x6c,0x69,0x73,0x6f,0, - 0x6c,0x69,0x73,0x74,0x61,0, - 0x6c,0x69,0x74,0x65,0x72,0x61,0, - 0x6c,0x69,0x74,0x69,0x6f,0, - 0x6c,0x69,0x74,0x72,0x6f,0, - 0x6c,0x6c,0x61,0x67,0x61,0, - 0x6c,0x6c,0x61,0x6d,0x61,0, - 0x6c,0x6c,0x61,0x6e,0x74,0x6f,0, - 0x6c,0x6c,0x61,0x76,0x65,0, - 0x6c,0x6c,0x65,0x67,0x61,0x72,0, - 0x6c,0x6c,0x65,0x6e,0x61,0x72,0, - 0x6c,0x6c,0x65,0x76,0x61,0x72,0, - 0x6c,0x6c,0x6f,0x72,0x61,0x72,0, - 0x6c,0x6c,0x6f,0x76,0x65,0x72,0, - 0x6c,0x6c,0x75,0x76,0x69,0x61,0, - 0x6c,0x6f,0x62,0x6f,0, - 0x6c,0x6f,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x6c,0x6f,0x63,0x6f,0, - 0x6c,0x6f,0x63,0x75,0x72,0x61,0, - 0x6c,0x6f,0xcc,0x81,0x67,0x69,0x63,0x61,0, - 0x6c,0x6f,0x67,0x72,0x6f,0, - 0x6c,0x6f,0x6d,0x62,0x72,0x69,0x7a,0, - 0x6c,0x6f,0x6d,0x6f,0, - 0x6c,0x6f,0x6e,0x6a,0x61,0, - 0x6c,0x6f,0x74,0x65,0, - 0x6c,0x75,0x63,0x68,0x61,0, - 0x6c,0x75,0x63,0x69,0x72,0, - 0x6c,0x75,0x67,0x61,0x72,0, - 0x6c,0x75,0x6a,0x6f,0, - 0x6c,0x75,0x6e,0x61,0, - 0x6c,0x75,0x6e,0x65,0x73,0, - 0x6c,0x75,0x70,0x61,0, - 0x6c,0x75,0x73,0x74,0x72,0x6f,0, - 0x6c,0x75,0x74,0x6f,0, - 0x6c,0x75,0x7a,0, - 0x6d,0x61,0x63,0x65,0x74,0x61,0, - 0x6d,0x61,0x63,0x68,0x6f,0, - 0x6d,0x61,0x64,0x65,0x72,0x61,0, - 0x6d,0x61,0x64,0x72,0x65,0, - 0x6d,0x61,0x64,0x75,0x72,0x6f,0, - 0x6d,0x61,0x65,0x73,0x74,0x72,0x6f,0, - 0x6d,0x61,0x66,0x69,0x61,0, - 0x6d,0x61,0x67,0x69,0x61,0, - 0x6d,0x61,0x67,0x6f,0, - 0x6d,0x61,0x69,0xcc,0x81,0x7a,0, - 0x6d,0x61,0x6c,0x64,0x61,0x64,0, - 0x6d,0x61,0x6c,0x65,0x74,0x61,0, - 0x6d,0x61,0x6c,0x6c,0x61,0, - 0x6d,0x61,0x6c,0x6f,0, - 0x6d,0x61,0x6d,0x61,0xcc,0x81,0, - 0x6d,0x61,0x6d,0x62,0x6f,0, - 0x6d,0x61,0x6d,0x75,0x74,0, - 0x6d,0x61,0x6e,0x63,0x6f,0, - 0x6d,0x61,0x6e,0x64,0x6f,0, - 0x6d,0x61,0x6e,0x65,0x6a,0x61,0x72,0, - 0x6d,0x61,0x6e,0x67,0x61,0, - 0x6d,0x61,0x6e,0x69,0x71,0x75,0x69,0xcc,0x81,0, - 0x6d,0x61,0x6e,0x6a,0x61,0x72,0, - 0x6d,0x61,0x6e,0x6f,0, - 0x6d,0x61,0x6e,0x73,0x6f,0, - 0x6d,0x61,0x6e,0x74,0x61,0, - 0x6d,0x61,0x6e,0xcc,0x83,0x61,0x6e,0x61,0, - 0x6d,0x61,0x70,0x61,0, - 0x6d,0x61,0xcc,0x81,0x71,0x75,0x69,0x6e,0x61,0, - 0x6d,0x61,0x72,0, - 0x6d,0x61,0x72,0x63,0x6f,0, - 0x6d,0x61,0x72,0x65,0x61,0, - 0x6d,0x61,0x72,0x66,0x69,0x6c,0, - 0x6d,0x61,0x72,0x67,0x65,0x6e,0, - 0x6d,0x61,0x72,0x69,0x64,0x6f,0, - 0x6d,0x61,0xcc,0x81,0x72,0x6d,0x6f,0x6c,0, - 0x6d,0x61,0x72,0x72,0x6f,0xcc,0x81,0x6e,0, - 0x6d,0x61,0x72,0x74,0x65,0x73,0, - 0x6d,0x61,0x72,0x7a,0x6f,0, - 0x6d,0x61,0x73,0x61,0, - 0x6d,0x61,0xcc,0x81,0x73,0x63,0x61,0x72,0x61,0, - 0x6d,0x61,0x73,0x69,0x76,0x6f,0, - 0x6d,0x61,0x74,0x61,0x72,0, - 0x6d,0x61,0x74,0x65,0x72,0x69,0x61,0, - 0x6d,0x61,0x74,0x69,0x7a,0, - 0x6d,0x61,0x74,0x72,0x69,0x7a,0, - 0x6d,0x61,0xcc,0x81,0x78,0x69,0x6d,0x6f,0, - 0x6d,0x61,0x79,0x6f,0x72,0, - 0x6d,0x61,0x7a,0x6f,0x72,0x63,0x61,0, - 0x6d,0x65,0x63,0x68,0x61,0, - 0x6d,0x65,0x64,0x61,0x6c,0x6c,0x61,0, - 0x6d,0x65,0x64,0x69,0x6f,0, - 0x6d,0x65,0xcc,0x81,0x64,0x75,0x6c,0x61,0, - 0x6d,0x65,0x6a,0x69,0x6c,0x6c,0x61,0, - 0x6d,0x65,0x6a,0x6f,0x72,0, - 0x6d,0x65,0x6c,0x65,0x6e,0x61,0, - 0x6d,0x65,0x6c,0x6f,0xcc,0x81,0x6e,0, - 0x6d,0x65,0x6d,0x6f,0x72,0x69,0x61,0, - 0x6d,0x65,0x6e,0x6f,0x72,0, - 0x6d,0x65,0x6e,0x73,0x61,0x6a,0x65,0, - 0x6d,0x65,0x6e,0x74,0x65,0, - 0x6d,0x65,0x6e,0x75,0xcc,0x81,0, - 0x6d,0x65,0x72,0x63,0x61,0x64,0x6f,0, - 0x6d,0x65,0x72,0x65,0x6e,0x67,0x75,0x65,0, - 0x6d,0x65,0xcc,0x81,0x72,0x69,0x74,0x6f,0, - 0x6d,0x65,0x73,0, - 0x6d,0x65,0x73,0x6f,0xcc,0x81,0x6e,0, - 0x6d,0x65,0x74,0x61,0, - 0x6d,0x65,0x74,0x65,0x72,0, - 0x6d,0x65,0xcc,0x81,0x74,0x6f,0x64,0x6f,0, - 0x6d,0x65,0x74,0x72,0x6f,0, - 0x6d,0x65,0x7a,0x63,0x6c,0x61,0, - 0x6d,0x69,0x65,0x64,0x6f,0, - 0x6d,0x69,0x65,0x6c,0, - 0x6d,0x69,0x65,0x6d,0x62,0x72,0x6f,0, - 0x6d,0x69,0x67,0x61,0, - 0x6d,0x69,0x6c,0, - 0x6d,0x69,0x6c,0x61,0x67,0x72,0x6f,0, - 0x6d,0x69,0x6c,0x69,0x74,0x61,0x72,0, - 0x6d,0x69,0x6c,0x6c,0x6f,0xcc,0x81,0x6e,0, - 0x6d,0x69,0x6d,0x6f,0, - 0x6d,0x69,0x6e,0x61,0, - 0x6d,0x69,0x6e,0x65,0x72,0x6f,0, - 0x6d,0x69,0xcc,0x81,0x6e,0x69,0x6d,0x6f,0, - 0x6d,0x69,0x6e,0x75,0x74,0x6f,0, - 0x6d,0x69,0x6f,0x70,0x65,0, - 0x6d,0x69,0x72,0x61,0x72,0, - 0x6d,0x69,0x73,0x61,0, - 0x6d,0x69,0x73,0x65,0x72,0x69,0x61,0, - 0x6d,0x69,0x73,0x69,0x6c,0, - 0x6d,0x69,0x73,0x6d,0x6f,0, - 0x6d,0x69,0x74,0x61,0x64,0, - 0x6d,0x69,0x74,0x6f,0, - 0x6d,0x6f,0x63,0x68,0x69,0x6c,0x61,0, - 0x6d,0x6f,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x6d,0x6f,0x64,0x61,0, - 0x6d,0x6f,0x64,0x65,0x6c,0x6f,0, - 0x6d,0x6f,0x68,0x6f,0, - 0x6d,0x6f,0x6a,0x61,0x72,0, - 0x6d,0x6f,0x6c,0x64,0x65,0, - 0x6d,0x6f,0x6c,0x65,0x72,0, - 0x6d,0x6f,0x6c,0x69,0x6e,0x6f,0, - 0x6d,0x6f,0x6d,0x65,0x6e,0x74,0x6f,0, - 0x6d,0x6f,0x6d,0x69,0x61,0, - 0x6d,0x6f,0x6e,0x61,0x72,0x63,0x61,0, - 0x6d,0x6f,0x6e,0x65,0x64,0x61,0, - 0x6d,0x6f,0x6e,0x6a,0x61,0, - 0x6d,0x6f,0x6e,0x74,0x6f,0, - 0x6d,0x6f,0x6e,0xcc,0x83,0x6f,0, - 0x6d,0x6f,0x72,0x61,0x64,0x61,0, - 0x6d,0x6f,0x72,0x64,0x65,0x72,0, - 0x6d,0x6f,0x72,0x65,0x6e,0x6f,0, - 0x6d,0x6f,0x72,0x69,0x72,0, - 0x6d,0x6f,0x72,0x72,0x6f,0, - 0x6d,0x6f,0x72,0x73,0x61,0, - 0x6d,0x6f,0x72,0x74,0x61,0x6c,0, - 0x6d,0x6f,0x73,0x63,0x61,0, - 0x6d,0x6f,0x73,0x74,0x72,0x61,0x72,0, - 0x6d,0x6f,0x74,0x69,0x76,0x6f,0, - 0x6d,0x6f,0x76,0x65,0x72,0, - 0x6d,0x6f,0xcc,0x81,0x76,0x69,0x6c,0, - 0x6d,0x6f,0x7a,0x6f,0, - 0x6d,0x75,0x63,0x68,0x6f,0, - 0x6d,0x75,0x64,0x61,0x72,0, - 0x6d,0x75,0x65,0x62,0x6c,0x65,0, - 0x6d,0x75,0x65,0x6c,0x61,0, - 0x6d,0x75,0x65,0x72,0x74,0x65,0, - 0x6d,0x75,0x65,0x73,0x74,0x72,0x61,0, - 0x6d,0x75,0x67,0x72,0x65,0, - 0x6d,0x75,0x6a,0x65,0x72,0, - 0x6d,0x75,0x6c,0x61,0, - 0x6d,0x75,0x6c,0x65,0x74,0x61,0, - 0x6d,0x75,0x6c,0x74,0x61,0, - 0x6d,0x75,0x6e,0x64,0x6f,0, - 0x6d,0x75,0x6e,0xcc,0x83,0x65,0x63,0x61,0, - 0x6d,0x75,0x72,0x61,0x6c,0, - 0x6d,0x75,0x72,0x6f,0, - 0x6d,0x75,0xcc,0x81,0x73,0x63,0x75,0x6c,0x6f,0, - 0x6d,0x75,0x73,0x65,0x6f,0, - 0x6d,0x75,0x73,0x67,0x6f,0, - 0x6d,0x75,0xcc,0x81,0x73,0x69,0x63,0x61,0, - 0x6d,0x75,0x73,0x6c,0x6f,0, - 0x6e,0x61,0xcc,0x81,0x63,0x61,0x72,0, - 0x6e,0x61,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x6e,0x61,0x64,0x61,0x72,0, - 0x6e,0x61,0x69,0x70,0x65,0, - 0x6e,0x61,0x72,0x61,0x6e,0x6a,0x61,0, - 0x6e,0x61,0x72,0x69,0x7a,0, - 0x6e,0x61,0x72,0x72,0x61,0x72,0, - 0x6e,0x61,0x73,0x61,0x6c,0, - 0x6e,0x61,0x74,0x61,0x6c,0, - 0x6e,0x61,0x74,0x69,0x76,0x6f,0, - 0x6e,0x61,0x74,0x75,0x72,0x61,0x6c,0, - 0x6e,0x61,0xcc,0x81,0x75,0x73,0x65,0x61,0, - 0x6e,0x61,0x76,0x61,0x6c,0, - 0x6e,0x61,0x76,0x65,0, - 0x6e,0x61,0x76,0x69,0x64,0x61,0x64,0, - 0x6e,0x65,0x63,0x69,0x6f,0, - 0x6e,0x65,0xcc,0x81,0x63,0x74,0x61,0x72,0, - 0x6e,0x65,0x67,0x61,0x72,0, - 0x6e,0x65,0x67,0x6f,0x63,0x69,0x6f,0, - 0x6e,0x65,0x67,0x72,0x6f,0, - 0x6e,0x65,0x6f,0xcc,0x81,0x6e,0, - 0x6e,0x65,0x72,0x76,0x69,0x6f,0, - 0x6e,0x65,0x74,0x6f,0, - 0x6e,0x65,0x75,0x74,0x72,0x6f,0, - 0x6e,0x65,0x76,0x61,0x72,0, - 0x6e,0x65,0x76,0x65,0x72,0x61,0, - 0x6e,0x69,0x63,0x68,0x6f,0, - 0x6e,0x69,0x64,0x6f,0, - 0x6e,0x69,0x65,0x62,0x6c,0x61,0, - 0x6e,0x69,0x65,0x74,0x6f,0, - 0x6e,0x69,0x6e,0xcc,0x83,0x65,0x7a,0, - 0x6e,0x69,0x6e,0xcc,0x83,0x6f,0, - 0x6e,0x69,0xcc,0x81,0x74,0x69,0x64,0x6f,0, - 0x6e,0x69,0x76,0x65,0x6c,0, - 0x6e,0x6f,0x62,0x6c,0x65,0x7a,0x61,0, - 0x6e,0x6f,0x63,0x68,0x65,0, - 0x6e,0x6f,0xcc,0x81,0x6d,0x69,0x6e,0x61,0, - 0x6e,0x6f,0x72,0x69,0x61,0, - 0x6e,0x6f,0x72,0x6d,0x61,0, - 0x6e,0x6f,0x72,0x74,0x65,0, - 0x6e,0x6f,0x74,0x61,0, - 0x6e,0x6f,0x74,0x69,0x63,0x69,0x61,0, - 0x6e,0x6f,0x76,0x61,0x74,0x6f,0, - 0x6e,0x6f,0x76,0x65,0x6c,0x61,0, - 0x6e,0x6f,0x76,0x69,0x6f,0, - 0x6e,0x75,0x62,0x65,0, - 0x6e,0x75,0x63,0x61,0, - 0x6e,0x75,0xcc,0x81,0x63,0x6c,0x65,0x6f,0, - 0x6e,0x75,0x64,0x69,0x6c,0x6c,0x6f,0, - 0x6e,0x75,0x64,0x6f,0, - 0x6e,0x75,0x65,0x72,0x61,0, - 0x6e,0x75,0x65,0x76,0x65,0, - 0x6e,0x75,0x65,0x7a,0, - 0x6e,0x75,0x6c,0x6f,0, - 0x6e,0x75,0xcc,0x81,0x6d,0x65,0x72,0x6f,0, - 0x6e,0x75,0x74,0x72,0x69,0x61,0, - 0x6f,0x61,0x73,0x69,0x73,0, - 0x6f,0x62,0x65,0x73,0x6f,0, - 0x6f,0x62,0x69,0x73,0x70,0x6f,0, - 0x6f,0x62,0x6a,0x65,0x74,0x6f,0, - 0x6f,0x62,0x72,0x61,0, - 0x6f,0x62,0x72,0x65,0x72,0x6f,0, - 0x6f,0x62,0x73,0x65,0x72,0x76,0x61,0x72,0, - 0x6f,0x62,0x74,0x65,0x6e,0x65,0x72,0, - 0x6f,0x62,0x76,0x69,0x6f,0, - 0x6f,0x63,0x61,0, - 0x6f,0x63,0x61,0x73,0x6f,0, - 0x6f,0x63,0x65,0xcc,0x81,0x61,0x6e,0x6f,0, - 0x6f,0x63,0x68,0x65,0x6e,0x74,0x61,0, - 0x6f,0x63,0x68,0x6f,0, - 0x6f,0x63,0x69,0x6f,0, - 0x6f,0x63,0x72,0x65,0, - 0x6f,0x63,0x74,0x61,0x76,0x6f,0, - 0x6f,0x63,0x74,0x75,0x62,0x72,0x65,0, - 0x6f,0x63,0x75,0x6c,0x74,0x6f,0, - 0x6f,0x63,0x75,0x70,0x61,0x72,0, - 0x6f,0x63,0x75,0x72,0x72,0x69,0x72,0, - 0x6f,0x64,0x69,0x61,0x72,0, - 0x6f,0x64,0x69,0x6f,0, - 0x6f,0x64,0x69,0x73,0x65,0x61,0, - 0x6f,0x65,0x73,0x74,0x65,0, - 0x6f,0x66,0x65,0x6e,0x73,0x61,0, - 0x6f,0x66,0x65,0x72,0x74,0x61,0, - 0x6f,0x66,0x69,0x63,0x69,0x6f,0, - 0x6f,0x66,0x72,0x65,0x63,0x65,0x72,0, - 0x6f,0x67,0x72,0x6f,0, - 0x6f,0x69,0xcc,0x81,0x64,0x6f,0, - 0x6f,0x69,0xcc,0x81,0x72,0, - 0x6f,0x6a,0x6f,0, - 0x6f,0x6c,0x61,0, - 0x6f,0x6c,0x65,0x61,0x64,0x61,0, - 0x6f,0x6c,0x66,0x61,0x74,0x6f,0, - 0x6f,0x6c,0x69,0x76,0x6f,0, - 0x6f,0x6c,0x6c,0x61,0, - 0x6f,0x6c,0x6d,0x6f,0, - 0x6f,0x6c,0x6f,0x72,0, - 0x6f,0x6c,0x76,0x69,0x64,0x6f,0, - 0x6f,0x6d,0x62,0x6c,0x69,0x67,0x6f,0, - 0x6f,0x6e,0x64,0x61,0, - 0x6f,0x6e,0x7a,0x61,0, - 0x6f,0x70,0x61,0x63,0x6f,0, - 0x6f,0x70,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x6f,0xcc,0x81,0x70,0x65,0x72,0x61,0, - 0x6f,0x70,0x69,0x6e,0x61,0x72,0, - 0x6f,0x70,0x6f,0x6e,0x65,0x72,0, - 0x6f,0x70,0x74,0x61,0x72,0, - 0x6f,0xcc,0x81,0x70,0x74,0x69,0x63,0x61,0, - 0x6f,0x70,0x75,0x65,0x73,0x74,0x6f,0, - 0x6f,0x72,0x61,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x6f,0x72,0x61,0x64,0x6f,0x72,0, - 0x6f,0x72,0x61,0x6c,0, - 0x6f,0xcc,0x81,0x72,0x62,0x69,0x74,0x61,0, - 0x6f,0x72,0x63,0x61,0, - 0x6f,0x72,0x64,0x65,0x6e,0, - 0x6f,0x72,0x65,0x6a,0x61,0, - 0x6f,0xcc,0x81,0x72,0x67,0x61,0x6e,0x6f,0, - 0x6f,0x72,0x67,0x69,0xcc,0x81,0x61,0, - 0x6f,0x72,0x67,0x75,0x6c,0x6c,0x6f,0, - 0x6f,0x72,0x69,0x65,0x6e,0x74,0x65,0, - 0x6f,0x72,0x69,0x67,0x65,0x6e,0, - 0x6f,0x72,0x69,0x6c,0x6c,0x61,0, - 0x6f,0x72,0x6f,0, - 0x6f,0x72,0x71,0x75,0x65,0x73,0x74,0x61,0, - 0x6f,0x72,0x75,0x67,0x61,0, - 0x6f,0x73,0x61,0x64,0x69,0xcc,0x81,0x61,0, - 0x6f,0x73,0x63,0x75,0x72,0x6f,0, - 0x6f,0x73,0x65,0x7a,0x6e,0x6f,0, - 0x6f,0x73,0x6f,0, - 0x6f,0x73,0x74,0x72,0x61,0, - 0x6f,0x74,0x6f,0x6e,0xcc,0x83,0x6f,0, - 0x6f,0x74,0x72,0x6f,0, - 0x6f,0x76,0x65,0x6a,0x61,0, - 0x6f,0xcc,0x81,0x76,0x75,0x6c,0x6f,0, - 0x6f,0xcc,0x81,0x78,0x69,0x64,0x6f,0, - 0x6f,0x78,0x69,0xcc,0x81,0x67,0x65,0x6e,0x6f,0, - 0x6f,0x79,0x65,0x6e,0x74,0x65,0, - 0x6f,0x7a,0x6f,0x6e,0x6f,0, - 0x70,0x61,0x63,0x74,0x6f,0, - 0x70,0x61,0x64,0x72,0x65,0, - 0x70,0x61,0x65,0x6c,0x6c,0x61,0, - 0x70,0x61,0xcc,0x81,0x67,0x69,0x6e,0x61,0, - 0x70,0x61,0x67,0x6f,0, - 0x70,0x61,0x69,0xcc,0x81,0x73,0, - 0x70,0x61,0xcc,0x81,0x6a,0x61,0x72,0x6f,0, - 0x70,0x61,0x6c,0x61,0x62,0x72,0x61,0, - 0x70,0x61,0x6c,0x63,0x6f,0, - 0x70,0x61,0x6c,0x65,0x74,0x61,0, - 0x70,0x61,0xcc,0x81,0x6c,0x69,0x64,0x6f,0, - 0x70,0x61,0x6c,0x6d,0x61,0, - 0x70,0x61,0x6c,0x6f,0x6d,0x61,0, - 0x70,0x61,0x6c,0x70,0x61,0x72,0, - 0x70,0x61,0x6e,0, - 0x70,0x61,0x6e,0x61,0x6c,0, - 0x70,0x61,0xcc,0x81,0x6e,0x69,0x63,0x6f,0, - 0x70,0x61,0x6e,0x74,0x65,0x72,0x61,0, - 0x70,0x61,0x6e,0xcc,0x83,0x75,0x65,0x6c,0x6f,0, - 0x70,0x61,0x70,0x61,0xcc,0x81,0, - 0x70,0x61,0x70,0x65,0x6c,0, - 0x70,0x61,0x70,0x69,0x6c,0x6c,0x61,0, - 0x70,0x61,0x71,0x75,0x65,0x74,0x65,0, - 0x70,0x61,0x72,0x61,0x72,0, - 0x70,0x61,0x72,0x63,0x65,0x6c,0x61,0, - 0x70,0x61,0x72,0x65,0x64,0, - 0x70,0x61,0x72,0x69,0x72,0, - 0x70,0x61,0x72,0x6f,0, - 0x70,0x61,0xcc,0x81,0x72,0x70,0x61,0x64,0x6f,0, - 0x70,0x61,0x72,0x71,0x75,0x65,0, - 0x70,0x61,0xcc,0x81,0x72,0x72,0x61,0x66,0x6f,0, - 0x70,0x61,0x72,0x74,0x65,0, - 0x70,0x61,0x73,0x61,0x72,0, - 0x70,0x61,0x73,0x65,0x6f,0, - 0x70,0x61,0x73,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x61,0x73,0x6f,0, - 0x70,0x61,0x73,0x74,0x61,0, - 0x70,0x61,0x74,0x61,0, - 0x70,0x61,0x74,0x69,0x6f,0, - 0x70,0x61,0x74,0x72,0x69,0x61,0, - 0x70,0x61,0x75,0x73,0x61,0, - 0x70,0x61,0x75,0x74,0x61,0, - 0x70,0x61,0x76,0x6f,0, - 0x70,0x61,0x79,0x61,0x73,0x6f,0, - 0x70,0x65,0x61,0x74,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x65,0x63,0x61,0x64,0x6f,0, - 0x70,0x65,0x63,0x65,0x72,0x61,0, - 0x70,0x65,0x63,0x68,0x6f,0, - 0x70,0x65,0x64,0x61,0x6c,0, - 0x70,0x65,0x64,0x69,0x72,0, - 0x70,0x65,0x67,0x61,0x72,0, - 0x70,0x65,0x69,0x6e,0x65,0, - 0x70,0x65,0x6c,0x61,0x72,0, - 0x70,0x65,0x6c,0x64,0x61,0x6e,0xcc,0x83,0x6f,0, - 0x70,0x65,0x6c,0x65,0x61,0, - 0x70,0x65,0x6c,0x69,0x67,0x72,0x6f,0, - 0x70,0x65,0x6c,0x6c,0x65,0x6a,0x6f,0, - 0x70,0x65,0x6c,0x6f,0, - 0x70,0x65,0x6c,0x75,0x63,0x61,0, - 0x70,0x65,0x6e,0x61,0, - 0x70,0x65,0x6e,0x73,0x61,0x72,0, - 0x70,0x65,0x6e,0xcc,0x83,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x65,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x65,0x6f,0x72,0, - 0x70,0x65,0x70,0x69,0x6e,0x6f,0, - 0x70,0x65,0x71,0x75,0x65,0x6e,0xcc,0x83,0x6f,0, - 0x70,0x65,0x72,0x61,0, - 0x70,0x65,0x72,0x63,0x68,0x61,0, - 0x70,0x65,0x72,0x64,0x65,0x72,0, - 0x70,0x65,0x72,0x65,0x7a,0x61,0, - 0x70,0x65,0x72,0x66,0x69,0x6c,0, - 0x70,0x65,0x72,0x69,0x63,0x6f,0, - 0x70,0x65,0x72,0x6c,0x61,0, - 0x70,0x65,0x72,0x6d,0x69,0x73,0x6f,0, - 0x70,0x65,0x72,0x72,0x6f,0, - 0x70,0x65,0x72,0x73,0x6f,0x6e,0x61,0, - 0x70,0x65,0x73,0x61,0, - 0x70,0x65,0x73,0x63,0x61,0, - 0x70,0x65,0xcc,0x81,0x73,0x69,0x6d,0x6f,0, - 0x70,0x65,0x73,0x74,0x61,0x6e,0xcc,0x83,0x61,0, - 0x70,0x65,0xcc,0x81,0x74,0x61,0x6c,0x6f,0, - 0x70,0x65,0x74,0x72,0x6f,0xcc,0x81,0x6c,0x65,0x6f,0, - 0x70,0x65,0x7a,0, - 0x70,0x65,0x7a,0x75,0x6e,0xcc,0x83,0x61,0, - 0x70,0x69,0x63,0x61,0x72,0, - 0x70,0x69,0x63,0x68,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x69,0x65,0, - 0x70,0x69,0x65,0x64,0x72,0x61,0, - 0x70,0x69,0x65,0x72,0x6e,0x61,0, - 0x70,0x69,0x65,0x7a,0x61,0, - 0x70,0x69,0x6a,0x61,0x6d,0x61,0, - 0x70,0x69,0x6c,0x61,0x72,0, - 0x70,0x69,0x6c,0x6f,0x74,0x6f,0, - 0x70,0x69,0x6d,0x69,0x65,0x6e,0x74,0x61,0, - 0x70,0x69,0x6e,0x6f,0, - 0x70,0x69,0x6e,0x74,0x6f,0x72,0, - 0x70,0x69,0x6e,0x7a,0x61,0, - 0x70,0x69,0x6e,0xcc,0x83,0x61,0, - 0x70,0x69,0x6f,0x6a,0x6f,0, - 0x70,0x69,0x70,0x61,0, - 0x70,0x69,0x72,0x61,0x74,0x61,0, - 0x70,0x69,0x73,0x61,0x72,0, - 0x70,0x69,0x73,0x63,0x69,0x6e,0x61,0, - 0x70,0x69,0x73,0x6f,0, - 0x70,0x69,0x73,0x74,0x61,0, - 0x70,0x69,0x74,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x69,0x7a,0x63,0x61,0, - 0x70,0x6c,0x61,0x63,0x61,0, - 0x70,0x6c,0x61,0x6e,0, - 0x70,0x6c,0x61,0x74,0x61,0, - 0x70,0x6c,0x61,0x79,0x61,0, - 0x70,0x6c,0x61,0x7a,0x61,0, - 0x70,0x6c,0x65,0x69,0x74,0x6f,0, - 0x70,0x6c,0x65,0x6e,0x6f,0, - 0x70,0x6c,0x6f,0x6d,0x6f,0, - 0x70,0x6c,0x75,0x6d,0x61,0, - 0x70,0x6c,0x75,0x72,0x61,0x6c,0, - 0x70,0x6f,0x62,0x72,0x65,0, - 0x70,0x6f,0x63,0x6f,0, - 0x70,0x6f,0x64,0x65,0x72,0, - 0x70,0x6f,0x64,0x69,0x6f,0, - 0x70,0x6f,0x65,0x6d,0x61,0, - 0x70,0x6f,0x65,0x73,0x69,0xcc,0x81,0x61,0, - 0x70,0x6f,0x65,0x74,0x61,0, - 0x70,0x6f,0x6c,0x65,0x6e,0, - 0x70,0x6f,0x6c,0x69,0x63,0x69,0xcc,0x81,0x61,0, - 0x70,0x6f,0x6c,0x6c,0x6f,0, - 0x70,0x6f,0x6c,0x76,0x6f,0, - 0x70,0x6f,0x6d,0x61,0x64,0x61,0, - 0x70,0x6f,0x6d,0x65,0x6c,0x6f,0, - 0x70,0x6f,0x6d,0x6f,0, - 0x70,0x6f,0x6d,0x70,0x61,0, - 0x70,0x6f,0x6e,0x65,0x72,0, - 0x70,0x6f,0x72,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x6f,0x72,0x74,0x61,0x6c,0, - 0x70,0x6f,0x73,0x61,0x64,0x61,0, - 0x70,0x6f,0x73,0x65,0x65,0x72,0, - 0x70,0x6f,0x73,0x69,0x62,0x6c,0x65,0, - 0x70,0x6f,0x73,0x74,0x65,0, - 0x70,0x6f,0x74,0x65,0x6e,0x63,0x69,0x61,0, - 0x70,0x6f,0x74,0x72,0x6f,0, - 0x70,0x6f,0x7a,0x6f,0, - 0x70,0x72,0x61,0x64,0x6f,0, - 0x70,0x72,0x65,0x63,0x6f,0x7a,0, - 0x70,0x72,0x65,0x67,0x75,0x6e,0x74,0x61,0, - 0x70,0x72,0x65,0x6d,0x69,0x6f,0, - 0x70,0x72,0x65,0x6e,0x73,0x61,0, - 0x70,0x72,0x65,0x73,0x6f,0, - 0x70,0x72,0x65,0x76,0x69,0x6f,0, - 0x70,0x72,0x69,0x6d,0x6f,0, - 0x70,0x72,0x69,0xcc,0x81,0x6e,0x63,0x69,0x70,0x65,0, - 0x70,0x72,0x69,0x73,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x72,0x69,0x76,0x61,0x72,0, - 0x70,0x72,0x6f,0x61,0, - 0x70,0x72,0x6f,0x62,0x61,0x72,0, - 0x70,0x72,0x6f,0x63,0x65,0x73,0x6f,0, - 0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x6f,0, - 0x70,0x72,0x6f,0x65,0x7a,0x61,0, - 0x70,0x72,0x6f,0x66,0x65,0x73,0x6f,0x72,0, - 0x70,0x72,0x6f,0x67,0x72,0x61,0x6d,0x61,0, - 0x70,0x72,0x6f,0x6c,0x65,0, - 0x70,0x72,0x6f,0x6d,0x65,0x73,0x61,0, - 0x70,0x72,0x6f,0x6e,0x74,0x6f,0, - 0x70,0x72,0x6f,0x70,0x69,0x6f,0, - 0x70,0x72,0x6f,0xcc,0x81,0x78,0x69,0x6d,0x6f,0, - 0x70,0x72,0x75,0x65,0x62,0x61,0, - 0x70,0x75,0xcc,0x81,0x62,0x6c,0x69,0x63,0x6f,0, - 0x70,0x75,0x63,0x68,0x65,0x72,0x6f,0, - 0x70,0x75,0x64,0x6f,0x72,0, - 0x70,0x75,0x65,0x62,0x6c,0x6f,0, - 0x70,0x75,0x65,0x72,0x74,0x61,0, - 0x70,0x75,0x65,0x73,0x74,0x6f,0, - 0x70,0x75,0x6c,0x67,0x61,0, - 0x70,0x75,0x6c,0x69,0x72,0, - 0x70,0x75,0x6c,0x6d,0x6f,0xcc,0x81,0x6e,0, - 0x70,0x75,0x6c,0x70,0x6f,0, - 0x70,0x75,0x6c,0x73,0x6f,0, - 0x70,0x75,0x6d,0x61,0, - 0x70,0x75,0x6e,0x74,0x6f,0, - 0x70,0x75,0x6e,0xcc,0x83,0x61,0x6c,0, - 0x70,0x75,0x6e,0xcc,0x83,0x6f,0, - 0x70,0x75,0x70,0x61,0, - 0x70,0x75,0x70,0x69,0x6c,0x61,0, - 0x70,0x75,0x72,0x65,0xcc,0x81,0, - 0x71,0x75,0x65,0x64,0x61,0x72,0, - 0x71,0x75,0x65,0x6a,0x61,0, - 0x71,0x75,0x65,0x6d,0x61,0x72,0, - 0x71,0x75,0x65,0x72,0x65,0x72,0, - 0x71,0x75,0x65,0x73,0x6f,0, - 0x71,0x75,0x69,0x65,0x74,0x6f,0, - 0x71,0x75,0x69,0xcc,0x81,0x6d,0x69,0x63,0x61,0, - 0x71,0x75,0x69,0x6e,0x63,0x65,0, - 0x71,0x75,0x69,0x74,0x61,0x72,0, - 0x72,0x61,0xcc,0x81,0x62,0x61,0x6e,0x6f,0, - 0x72,0x61,0x62,0x69,0x61,0, - 0x72,0x61,0x62,0x6f,0, - 0x72,0x61,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x72,0x61,0x64,0x69,0x63,0x61,0x6c,0, - 0x72,0x61,0x69,0xcc,0x81,0x7a,0, - 0x72,0x61,0x6d,0x61,0, - 0x72,0x61,0x6d,0x70,0x61,0, - 0x72,0x61,0x6e,0x63,0x68,0x6f,0, - 0x72,0x61,0x6e,0x67,0x6f,0, - 0x72,0x61,0x70,0x61,0x7a,0, - 0x72,0x61,0xcc,0x81,0x70,0x69,0x64,0x6f,0, - 0x72,0x61,0x70,0x74,0x6f,0, - 0x72,0x61,0x73,0x67,0x6f,0, - 0x72,0x61,0x73,0x70,0x61,0, - 0x72,0x61,0x74,0x6f,0, - 0x72,0x61,0x79,0x6f,0, - 0x72,0x61,0x7a,0x61,0, - 0x72,0x61,0x7a,0x6f,0xcc,0x81,0x6e,0, - 0x72,0x65,0x61,0x63,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x72,0x65,0x61,0x6c,0x69,0x64,0x61,0x64,0, - 0x72,0x65,0x62,0x61,0x6e,0xcc,0x83,0x6f,0, - 0x72,0x65,0x62,0x6f,0x74,0x65,0, - 0x72,0x65,0x63,0x61,0x65,0x72,0, - 0x72,0x65,0x63,0x65,0x74,0x61,0, - 0x72,0x65,0x63,0x68,0x61,0x7a,0x6f,0, - 0x72,0x65,0x63,0x6f,0x67,0x65,0x72,0, - 0x72,0x65,0x63,0x72,0x65,0x6f,0, - 0x72,0x65,0x63,0x74,0x6f,0, - 0x72,0x65,0x63,0x75,0x72,0x73,0x6f,0, - 0x72,0x65,0x64,0, - 0x72,0x65,0x64,0x6f,0x6e,0x64,0x6f,0, - 0x72,0x65,0x64,0x75,0x63,0x69,0x72,0, - 0x72,0x65,0x66,0x6c,0x65,0x6a,0x6f,0, - 0x72,0x65,0x66,0x6f,0x72,0x6d,0x61,0, - 0x72,0x65,0x66,0x72,0x61,0xcc,0x81,0x6e,0, - 0x72,0x65,0x66,0x75,0x67,0x69,0x6f,0, - 0x72,0x65,0x67,0x61,0x6c,0x6f,0, - 0x72,0x65,0x67,0x69,0x72,0, - 0x72,0x65,0x67,0x6c,0x61,0, - 0x72,0x65,0x67,0x72,0x65,0x73,0x6f,0, - 0x72,0x65,0x68,0x65,0xcc,0x81,0x6e,0, - 0x72,0x65,0x69,0x6e,0x6f,0, - 0x72,0x65,0x69,0xcc,0x81,0x72,0, - 0x72,0x65,0x6a,0x61,0, - 0x72,0x65,0x6c,0x61,0x74,0x6f,0, - 0x72,0x65,0x6c,0x65,0x76,0x6f,0, - 0x72,0x65,0x6c,0x69,0x65,0x76,0x65,0, - 0x72,0x65,0x6c,0x6c,0x65,0x6e,0x6f,0, - 0x72,0x65,0x6c,0x6f,0x6a,0, - 0x72,0x65,0x6d,0x61,0x72,0, - 0x72,0x65,0x6d,0x65,0x64,0x69,0x6f,0, - 0x72,0x65,0x6d,0x6f,0, - 0x72,0x65,0x6e,0x63,0x6f,0x72,0, - 0x72,0x65,0x6e,0x64,0x69,0x72,0, - 0x72,0x65,0x6e,0x74,0x61,0, - 0x72,0x65,0x70,0x61,0x72,0x74,0x6f,0, - 0x72,0x65,0x70,0x65,0x74,0x69,0x72,0, - 0x72,0x65,0x70,0x6f,0x73,0x6f,0, - 0x72,0x65,0x70,0x74,0x69,0x6c,0, - 0x72,0x65,0x73,0, - 0x72,0x65,0x73,0x63,0x61,0x74,0x65,0, - 0x72,0x65,0x73,0x69,0x6e,0x61,0, - 0x72,0x65,0x73,0x70,0x65,0x74,0x6f,0, - 0x72,0x65,0x73,0x74,0x6f,0, - 0x72,0x65,0x73,0x75,0x6d,0x65,0x6e,0, - 0x72,0x65,0x74,0x69,0x72,0x6f,0, - 0x72,0x65,0x74,0x6f,0x72,0x6e,0x6f,0, - 0x72,0x65,0x74,0x72,0x61,0x74,0x6f,0, - 0x72,0x65,0x75,0x6e,0x69,0x72,0, - 0x72,0x65,0x76,0x65,0xcc,0x81,0x73,0, - 0x72,0x65,0x76,0x69,0x73,0x74,0x61,0, - 0x72,0x65,0x79,0, - 0x72,0x65,0x7a,0x61,0x72,0, - 0x72,0x69,0x63,0x6f,0, - 0x72,0x69,0x65,0x67,0x6f,0, - 0x72,0x69,0x65,0x6e,0x64,0x61,0, - 0x72,0x69,0x65,0x73,0x67,0x6f,0, - 0x72,0x69,0x66,0x61,0, - 0x72,0x69,0xcc,0x81,0x67,0x69,0x64,0x6f,0, - 0x72,0x69,0x67,0x6f,0x72,0, - 0x72,0x69,0x6e,0x63,0x6f,0xcc,0x81,0x6e,0, - 0x72,0x69,0x6e,0xcc,0x83,0x6f,0xcc,0x81,0x6e,0, - 0x72,0x69,0xcc,0x81,0x6f,0, - 0x72,0x69,0x71,0x75,0x65,0x7a,0x61,0, - 0x72,0x69,0x73,0x61,0, - 0x72,0x69,0x74,0x6d,0x6f,0, - 0x72,0x69,0x74,0x6f,0, - 0x72,0x69,0x7a,0x6f,0, - 0x72,0x6f,0x62,0x6c,0x65,0, - 0x72,0x6f,0x63,0x65,0, - 0x72,0x6f,0x63,0x69,0x61,0x72,0, - 0x72,0x6f,0x64,0x61,0x72,0, - 0x72,0x6f,0x64,0x65,0x6f,0, - 0x72,0x6f,0x64,0x69,0x6c,0x6c,0x61,0, - 0x72,0x6f,0x65,0x72,0, - 0x72,0x6f,0x6a,0x69,0x7a,0x6f,0, - 0x72,0x6f,0x6a,0x6f,0, - 0x72,0x6f,0x6d,0x65,0x72,0x6f,0, - 0x72,0x6f,0x6d,0x70,0x65,0x72,0, - 0x72,0x6f,0x6e,0, - 0x72,0x6f,0x6e,0x63,0x6f,0, - 0x72,0x6f,0x6e,0x64,0x61,0, - 0x72,0x6f,0x70,0x61,0, - 0x72,0x6f,0x70,0x65,0x72,0x6f,0, - 0x72,0x6f,0x73,0x61,0, - 0x72,0x6f,0x73,0x63,0x61,0, - 0x72,0x6f,0x73,0x74,0x72,0x6f,0, - 0x72,0x6f,0x74,0x61,0x72,0, - 0x72,0x75,0x62,0x69,0xcc,0x81,0, - 0x72,0x75,0x62,0x6f,0x72,0, - 0x72,0x75,0x64,0x6f,0, - 0x72,0x75,0x65,0x64,0x61,0, - 0x72,0x75,0x67,0x69,0x72,0, - 0x72,0x75,0x69,0x64,0x6f,0, - 0x72,0x75,0x69,0x6e,0x61,0, - 0x72,0x75,0x6c,0x65,0x74,0x61,0, - 0x72,0x75,0x6c,0x6f,0, - 0x72,0x75,0x6d,0x62,0x6f,0, - 0x72,0x75,0x6d,0x6f,0x72,0, - 0x72,0x75,0x70,0x74,0x75,0x72,0x61,0, - 0x72,0x75,0x74,0x61,0, - 0x72,0x75,0x74,0x69,0x6e,0x61,0, - 0x73,0x61,0xcc,0x81,0x62,0x61,0x64,0x6f,0, - 0x73,0x61,0x62,0x65,0x72,0, - 0x73,0x61,0x62,0x69,0x6f,0, - 0x73,0x61,0x62,0x6c,0x65,0, - 0x73,0x61,0x63,0x61,0x72,0, - 0x73,0x61,0x67,0x61,0x7a,0, - 0x73,0x61,0x67,0x72,0x61,0x64,0x6f,0, - 0x73,0x61,0x6c,0x61,0, - 0x73,0x61,0x6c,0x64,0x6f,0, - 0x73,0x61,0x6c,0x65,0x72,0x6f,0, - 0x73,0x61,0x6c,0x69,0x72,0, - 0x73,0x61,0x6c,0x6d,0x6f,0xcc,0x81,0x6e,0, - 0x73,0x61,0x6c,0x6f,0xcc,0x81,0x6e,0, - 0x73,0x61,0x6c,0x73,0x61,0, - 0x73,0x61,0x6c,0x74,0x6f,0, - 0x73,0x61,0x6c,0x75,0x64,0, - 0x73,0x61,0x6c,0x76,0x61,0x72,0, - 0x73,0x61,0x6d,0x62,0x61,0, - 0x73,0x61,0x6e,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x73,0x61,0x6e,0x64,0x69,0xcc,0x81,0x61,0, - 0x73,0x61,0x6e,0x65,0x61,0x72,0, - 0x73,0x61,0x6e,0x67,0x72,0x65,0, - 0x73,0x61,0x6e,0x69,0x64,0x61,0x64,0, - 0x73,0x61,0x6e,0x6f,0, - 0x73,0x61,0x6e,0x74,0x6f,0, - 0x73,0x61,0x70,0x6f,0, - 0x73,0x61,0x71,0x75,0x65,0, - 0x73,0x61,0x72,0x64,0x69,0x6e,0x61,0, - 0x73,0x61,0x72,0x74,0x65,0xcc,0x81,0x6e,0, - 0x73,0x61,0x73,0x74,0x72,0x65,0, - 0x73,0x61,0x74,0x61,0xcc,0x81,0x6e,0, - 0x73,0x61,0x75,0x6e,0x61,0, - 0x73,0x61,0x78,0x6f,0x66,0x6f,0xcc,0x81,0x6e,0, - 0x73,0x65,0x63,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x73,0x65,0x63,0x6f,0, - 0x73,0x65,0x63,0x72,0x65,0x74,0x6f,0, - 0x73,0x65,0x63,0x74,0x61,0, - 0x73,0x65,0x64,0, - 0x73,0x65,0x67,0x75,0x69,0x72,0, - 0x73,0x65,0x69,0x73,0, - 0x73,0x65,0x6c,0x6c,0x6f,0, - 0x73,0x65,0x6c,0x76,0x61,0, - 0x73,0x65,0x6d,0x61,0x6e,0x61,0, - 0x73,0x65,0x6d,0x69,0x6c,0x6c,0x61,0, - 0x73,0x65,0x6e,0x64,0x61,0, - 0x73,0x65,0x6e,0x73,0x6f,0x72,0, - 0x73,0x65,0x6e,0xcc,0x83,0x61,0x6c,0, - 0x73,0x65,0x6e,0xcc,0x83,0x6f,0x72,0, - 0x73,0x65,0x70,0x61,0x72,0x61,0x72,0, - 0x73,0x65,0x70,0x69,0x61,0, - 0x73,0x65,0x71,0x75,0x69,0xcc,0x81,0x61,0, - 0x73,0x65,0x72,0, - 0x73,0x65,0x72,0x69,0x65,0, - 0x73,0x65,0x72,0x6d,0x6f,0xcc,0x81,0x6e,0, - 0x73,0x65,0x72,0x76,0x69,0x72,0, - 0x73,0x65,0x73,0x65,0x6e,0x74,0x61,0, - 0x73,0x65,0x73,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x73,0x65,0x74,0x61,0, - 0x73,0x65,0x74,0x65,0x6e,0x74,0x61,0, - 0x73,0x65,0x76,0x65,0x72,0x6f,0, - 0x73,0x65,0x78,0x6f,0, - 0x73,0x65,0x78,0x74,0x6f,0, - 0x73,0x69,0x64,0x72,0x61,0, - 0x73,0x69,0x65,0x73,0x74,0x61,0, - 0x73,0x69,0x65,0x74,0x65,0, - 0x73,0x69,0x67,0x6c,0x6f,0, - 0x73,0x69,0x67,0x6e,0x6f,0, - 0x73,0x69,0xcc,0x81,0x6c,0x61,0x62,0x61,0, - 0x73,0x69,0x6c,0x62,0x61,0x72,0, - 0x73,0x69,0x6c,0x65,0x6e,0x63,0x69,0x6f,0, - 0x73,0x69,0x6c,0x6c,0x61,0, - 0x73,0x69,0xcc,0x81,0x6d,0x62,0x6f,0x6c,0x6f,0, - 0x73,0x69,0x6d,0x69,0x6f,0, - 0x73,0x69,0x72,0x65,0x6e,0x61,0, - 0x73,0x69,0x73,0x74,0x65,0x6d,0x61,0, - 0x73,0x69,0x74,0x69,0x6f,0, - 0x73,0x69,0x74,0x75,0x61,0x72,0, - 0x73,0x6f,0x62,0x72,0x65,0, - 0x73,0x6f,0x63,0x69,0x6f,0, - 0x73,0x6f,0x64,0x69,0x6f,0, - 0x73,0x6f,0x6c,0, - 0x73,0x6f,0x6c,0x61,0x70,0x61,0, - 0x73,0x6f,0x6c,0x64,0x61,0x64,0x6f,0, - 0x73,0x6f,0x6c,0x65,0x64,0x61,0x64,0, - 0x73,0x6f,0xcc,0x81,0x6c,0x69,0x64,0x6f,0, - 0x73,0x6f,0x6c,0x74,0x61,0x72,0, - 0x73,0x6f,0x6c,0x75,0x63,0x69,0x6f,0xcc,0x81,0x6e,0, - 0x73,0x6f,0x6d,0x62,0x72,0x61,0, - 0x73,0x6f,0x6e,0x64,0x65,0x6f,0, - 0x73,0x6f,0x6e,0x69,0x64,0x6f,0, - 0x73,0x6f,0x6e,0x6f,0x72,0x6f,0, - 0x73,0x6f,0x6e,0x72,0x69,0x73,0x61,0, - 0x73,0x6f,0x70,0x61,0, - 0x73,0x6f,0x70,0x6c,0x61,0x72,0, - 0x73,0x6f,0x70,0x6f,0x72,0x74,0x65,0, - 0x73,0x6f,0x72,0x64,0x6f,0, - 0x73,0x6f,0x72,0x70,0x72,0x65,0x73,0x61,0, - 0x73,0x6f,0x72,0x74,0x65,0x6f,0, - 0x73,0x6f,0x73,0x74,0x65,0xcc,0x81,0x6e,0, - 0x73,0x6f,0xcc,0x81,0x74,0x61,0x6e,0x6f,0, - 0x73,0x75,0x61,0x76,0x65,0, - 0x73,0x75,0x62,0x69,0x72,0, - 0x73,0x75,0x63,0x65,0x73,0x6f,0, - 0x73,0x75,0x64,0x6f,0x72,0, - 0x73,0x75,0x65,0x67,0x72,0x61,0, - 0x73,0x75,0x65,0x6c,0x6f,0, - 0x73,0x75,0x65,0x6e,0xcc,0x83,0x6f,0, - 0x73,0x75,0x65,0x72,0x74,0x65,0, - 0x73,0x75,0x66,0x72,0x69,0x72,0, - 0x73,0x75,0x6a,0x65,0x74,0x6f,0, - 0x73,0x75,0x6c,0x74,0x61,0xcc,0x81,0x6e,0, - 0x73,0x75,0x6d,0x61,0x72,0, - 0x73,0x75,0x70,0x65,0x72,0x61,0x72,0, - 0x73,0x75,0x70,0x6c,0x69,0x72,0, - 0x73,0x75,0x70,0x6f,0x6e,0x65,0x72,0, - 0x73,0x75,0x70,0x72,0x65,0x6d,0x6f,0, - 0x73,0x75,0x72,0, - 0x73,0x75,0x72,0x63,0x6f,0, - 0x73,0x75,0x72,0x65,0x6e,0xcc,0x83,0x6f,0, - 0x73,0x75,0x72,0x67,0x69,0x72,0, - 0x73,0x75,0x73,0x74,0x6f,0, - 0x73,0x75,0x74,0x69,0x6c,0, - 0x74,0x61,0x62,0x61,0x63,0x6f,0, - 0x74,0x61,0x62,0x69,0x71,0x75,0x65,0, - 0x74,0x61,0x62,0x6c,0x61,0, - 0x74,0x61,0x62,0x75,0xcc,0x81,0, - 0x74,0x61,0x63,0x6f,0, - 0x74,0x61,0x63,0x74,0x6f,0, - 0x74,0x61,0x6a,0x6f,0, - 0x74,0x61,0x6c,0x61,0x72,0, - 0x74,0x61,0x6c,0x63,0x6f,0, - 0x74,0x61,0x6c,0x65,0x6e,0x74,0x6f,0, - 0x74,0x61,0x6c,0x6c,0x61,0, - 0x74,0x61,0x6c,0x6f,0xcc,0x81,0x6e,0, - 0x74,0x61,0x6d,0x61,0x6e,0xcc,0x83,0x6f,0, - 0x74,0x61,0x6d,0x62,0x6f,0x72,0, - 0x74,0x61,0x6e,0x67,0x6f,0, - 0x74,0x61,0x6e,0x71,0x75,0x65,0, - 0x74,0x61,0x70,0x61,0, - 0x74,0x61,0x70,0x65,0x74,0x65,0, - 0x74,0x61,0x70,0x69,0x61,0, - 0x74,0x61,0x70,0x6f,0xcc,0x81,0x6e,0, - 0x74,0x61,0x71,0x75,0x69,0x6c,0x6c,0x61,0, - 0x74,0x61,0x72,0x64,0x65,0, - 0x74,0x61,0x72,0x65,0x61,0, - 0x74,0x61,0x72,0x69,0x66,0x61,0, - 0x74,0x61,0x72,0x6a,0x65,0x74,0x61,0, - 0x74,0x61,0x72,0x6f,0x74,0, - 0x74,0x61,0x72,0x72,0x6f,0, - 0x74,0x61,0x72,0x74,0x61,0, - 0x74,0x61,0x74,0x75,0x61,0x6a,0x65,0, - 0x74,0x61,0x75,0x72,0x6f,0, - 0x74,0x61,0x7a,0x61,0, - 0x74,0x61,0x7a,0x6f,0xcc,0x81,0x6e,0, - 0x74,0x65,0x61,0x74,0x72,0x6f,0, - 0x74,0x65,0x63,0x68,0x6f,0, - 0x74,0x65,0x63,0x6c,0x61,0, - 0x74,0x65,0xcc,0x81,0x63,0x6e,0x69,0x63,0x61,0, - 0x74,0x65,0x6a,0x61,0x64,0x6f,0, - 0x74,0x65,0x6a,0x65,0x72,0, - 0x74,0x65,0x6a,0x69,0x64,0x6f,0, - 0x74,0x65,0x6c,0x61,0, - 0x74,0x65,0x6c,0x65,0xcc,0x81,0x66,0x6f,0x6e,0x6f,0, - 0x74,0x65,0x6d,0x61,0, - 0x74,0x65,0x6d,0x6f,0x72,0, - 0x74,0x65,0x6d,0x70,0x6c,0x6f,0, - 0x74,0x65,0x6e,0x61,0x7a,0, - 0x74,0x65,0x6e,0x64,0x65,0x72,0, - 0x74,0x65,0x6e,0x65,0x72,0, - 0x74,0x65,0x6e,0x69,0x73,0, - 0x74,0x65,0x6e,0x73,0x6f,0, - 0x74,0x65,0x6f,0x72,0x69,0xcc,0x81,0x61,0, - 0x74,0x65,0x72,0x61,0x70,0x69,0x61,0, - 0x74,0x65,0x72,0x63,0x6f,0, - 0x74,0x65,0xcc,0x81,0x72,0x6d,0x69,0x6e,0x6f,0, - 0x74,0x65,0x72,0x6e,0x75,0x72,0x61,0, - 0x74,0x65,0x72,0x72,0x6f,0x72,0, - 0x74,0x65,0x73,0x69,0x73,0, - 0x74,0x65,0x73,0x6f,0x72,0x6f,0, - 0x74,0x65,0x73,0x74,0x69,0x67,0x6f,0, - 0x74,0x65,0x74,0x65,0x72,0x61,0, - 0x74,0x65,0x78,0x74,0x6f,0, - 0x74,0x65,0x7a,0, - 0x74,0x69,0x62,0x69,0x6f,0, - 0x74,0x69,0x62,0x75,0x72,0x6f,0xcc,0x81,0x6e,0, - 0x74,0x69,0x65,0x6d,0x70,0x6f,0, - 0x74,0x69,0x65,0x6e,0x64,0x61,0, - 0x74,0x69,0x65,0x72,0x72,0x61,0, - 0x74,0x69,0x65,0x73,0x6f,0, - 0x74,0x69,0x67,0x72,0x65,0, - 0x74,0x69,0x6a,0x65,0x72,0x61,0, - 0x74,0x69,0x6c,0x64,0x65,0, - 0x74,0x69,0x6d,0x62,0x72,0x65,0, - 0x74,0x69,0xcc,0x81,0x6d,0x69,0x64,0x6f,0, - 0x74,0x69,0x6d,0x6f,0, - 0x74,0x69,0x6e,0x74,0x61,0, - 0x74,0x69,0xcc,0x81,0x6f,0, - 0x74,0x69,0xcc,0x81,0x70,0x69,0x63,0x6f,0, - 0x74,0x69,0x70,0x6f,0, - 0x74,0x69,0x72,0x61,0, - 0x74,0x69,0x72,0x6f,0xcc,0x81,0x6e,0, - 0x74,0x69,0x74,0x61,0xcc,0x81,0x6e,0, - 0x74,0x69,0xcc,0x81,0x74,0x65,0x72,0x65,0, - 0x74,0x69,0xcc,0x81,0x74,0x75,0x6c,0x6f,0, - 0x74,0x69,0x7a,0x61,0, - 0x74,0x6f,0x61,0x6c,0x6c,0x61,0, - 0x74,0x6f,0x62,0x69,0x6c,0x6c,0x6f,0, - 0x74,0x6f,0x63,0x61,0x72,0, - 0x74,0x6f,0x63,0x69,0x6e,0x6f,0, - 0x74,0x6f,0x64,0x6f,0, - 0x74,0x6f,0x67,0x61,0, - 0x74,0x6f,0x6c,0x64,0x6f,0, - 0x74,0x6f,0x6d,0x61,0x72,0, - 0x74,0x6f,0x6e,0x6f,0, - 0x74,0x6f,0x6e,0x74,0x6f,0, - 0x74,0x6f,0x70,0x61,0x72,0, - 0x74,0x6f,0x70,0x65,0, - 0x74,0x6f,0x71,0x75,0x65,0, - 0x74,0x6f,0xcc,0x81,0x72,0x61,0x78,0, - 0x74,0x6f,0x72,0x65,0x72,0x6f,0, - 0x74,0x6f,0x72,0x6d,0x65,0x6e,0x74,0x61,0, - 0x74,0x6f,0x72,0x6e,0x65,0x6f,0, - 0x74,0x6f,0x72,0x6f,0, - 0x74,0x6f,0x72,0x70,0x65,0x64,0x6f,0, - 0x74,0x6f,0x72,0x72,0x65,0, - 0x74,0x6f,0x72,0x73,0x6f,0, - 0x74,0x6f,0x72,0x74,0x75,0x67,0x61,0, - 0x74,0x6f,0x73,0, - 0x74,0x6f,0x73,0x63,0x6f,0, - 0x74,0x6f,0x73,0x65,0x72,0, - 0x74,0x6f,0xcc,0x81,0x78,0x69,0x63,0x6f,0, - 0x74,0x72,0x61,0x62,0x61,0x6a,0x6f,0, - 0x74,0x72,0x61,0x63,0x74,0x6f,0x72,0, - 0x74,0x72,0x61,0x65,0x72,0, - 0x74,0x72,0x61,0xcc,0x81,0x66,0x69,0x63,0x6f,0, - 0x74,0x72,0x61,0x67,0x6f,0, - 0x74,0x72,0x61,0x6a,0x65,0, - 0x74,0x72,0x61,0x6d,0x6f,0, - 0x74,0x72,0x61,0x6e,0x63,0x65,0, - 0x74,0x72,0x61,0x74,0x6f,0, - 0x74,0x72,0x61,0x75,0x6d,0x61,0, - 0x74,0x72,0x61,0x7a,0x61,0x72,0, - 0x74,0x72,0x65,0xcc,0x81,0x62,0x6f,0x6c,0, - 0x74,0x72,0x65,0x67,0x75,0x61,0, - 0x74,0x72,0x65,0x69,0x6e,0x74,0x61,0, - 0x74,0x72,0x65,0x6e,0, - 0x74,0x72,0x65,0x70,0x61,0x72,0, - 0x74,0x72,0x65,0x73,0, - 0x74,0x72,0x69,0x62,0x75,0, - 0x74,0x72,0x69,0x67,0x6f,0, - 0x74,0x72,0x69,0x70,0x61,0, - 0x74,0x72,0x69,0x73,0x74,0x65,0, - 0x74,0x72,0x69,0x75,0x6e,0x66,0x6f,0, - 0x74,0x72,0x6f,0x66,0x65,0x6f,0, - 0x74,0x72,0x6f,0x6d,0x70,0x61,0, - 0x74,0x72,0x6f,0x6e,0x63,0x6f,0, - 0x74,0x72,0x6f,0x70,0x61,0, - 0x74,0x72,0x6f,0x74,0x65,0, - 0x74,0x72,0x6f,0x7a,0x6f,0, - 0x74,0x72,0x75,0x63,0x6f,0, - 0x74,0x72,0x75,0x65,0x6e,0x6f,0, - 0x74,0x72,0x75,0x66,0x61,0, - 0x74,0x75,0x62,0x65,0x72,0x69,0xcc,0x81,0x61,0, - 0x74,0x75,0x62,0x6f,0, - 0x74,0x75,0x65,0x72,0x74,0x6f,0, - 0x74,0x75,0x6d,0x62,0x61,0, - 0x74,0x75,0x6d,0x6f,0x72,0, - 0x74,0x75,0xcc,0x81,0x6e,0x65,0x6c,0, - 0x74,0x75,0xcc,0x81,0x6e,0x69,0x63,0x61,0, - 0x74,0x75,0x72,0x62,0x69,0x6e,0x61,0, - 0x74,0x75,0x72,0x69,0x73,0x6d,0x6f,0, - 0x74,0x75,0x72,0x6e,0x6f,0, - 0x74,0x75,0x74,0x6f,0x72,0, - 0x75,0x62,0x69,0x63,0x61,0x72,0, - 0x75,0xcc,0x81,0x6c,0x63,0x65,0x72,0x61,0, - 0x75,0x6d,0x62,0x72,0x61,0x6c,0, - 0x75,0x6e,0x69,0x64,0x61,0x64,0, - 0x75,0x6e,0x69,0x72,0, - 0x75,0x6e,0x69,0x76,0x65,0x72,0x73,0x6f,0, - 0x75,0x6e,0x6f,0, - 0x75,0x6e,0x74,0x61,0x72,0, - 0x75,0x6e,0xcc,0x83,0x61,0, - 0x75,0x72,0x62,0x61,0x6e,0x6f,0, - 0x75,0x72,0x62,0x65,0, - 0x75,0x72,0x67,0x65,0x6e,0x74,0x65,0, - 0x75,0x72,0x6e,0x61,0, - 0x75,0x73,0x61,0x72,0, - 0x75,0x73,0x75,0x61,0x72,0x69,0x6f,0, - 0x75,0xcc,0x81,0x74,0x69,0x6c,0, - 0x75,0x74,0x6f,0x70,0x69,0xcc,0x81,0x61,0, - 0x75,0x76,0x61,0, - 0x76,0x61,0x63,0x61,0, - 0x76,0x61,0x63,0x69,0xcc,0x81,0x6f,0, - 0x76,0x61,0x63,0x75,0x6e,0x61,0, - 0x76,0x61,0x67,0x61,0x72,0, - 0x76,0x61,0x67,0x6f,0, - 0x76,0x61,0x69,0x6e,0x61,0, - 0x76,0x61,0x6a,0x69,0x6c,0x6c,0x61,0, - 0x76,0x61,0x6c,0x65,0, - 0x76,0x61,0xcc,0x81,0x6c,0x69,0x64,0x6f,0, - 0x76,0x61,0x6c,0x6c,0x65,0, - 0x76,0x61,0x6c,0x6f,0x72,0, - 0x76,0x61,0xcc,0x81,0x6c,0x76,0x75,0x6c,0x61,0, - 0x76,0x61,0x6d,0x70,0x69,0x72,0x6f,0, - 0x76,0x61,0x72,0x61,0, - 0x76,0x61,0x72,0x69,0x61,0x72,0, - 0x76,0x61,0x72,0x6f,0xcc,0x81,0x6e,0, - 0x76,0x61,0x73,0x6f,0, - 0x76,0x65,0x63,0x69,0x6e,0x6f,0, - 0x76,0x65,0x63,0x74,0x6f,0x72,0, - 0x76,0x65,0x68,0x69,0xcc,0x81,0x63,0x75,0x6c,0x6f,0, - 0x76,0x65,0x69,0x6e,0x74,0x65,0, - 0x76,0x65,0x6a,0x65,0x7a,0, - 0x76,0x65,0x6c,0x61,0, - 0x76,0x65,0x6c,0x65,0x72,0x6f,0, - 0x76,0x65,0x6c,0x6f,0x7a,0, - 0x76,0x65,0x6e,0x61,0, - 0x76,0x65,0x6e,0x63,0x65,0x72,0, - 0x76,0x65,0x6e,0x64,0x61,0, - 0x76,0x65,0x6e,0x65,0x6e,0x6f,0, - 0x76,0x65,0x6e,0x67,0x61,0x72,0, - 0x76,0x65,0x6e,0x69,0x72,0, - 0x76,0x65,0x6e,0x74,0x61,0, - 0x76,0x65,0x6e,0x75,0x73,0, - 0x76,0x65,0x72,0, - 0x76,0x65,0x72,0x61,0x6e,0x6f,0, - 0x76,0x65,0x72,0x62,0x6f,0, - 0x76,0x65,0x72,0x64,0x65,0, - 0x76,0x65,0x72,0x65,0x64,0x61,0, - 0x76,0x65,0x72,0x6a,0x61,0, - 0x76,0x65,0x72,0x73,0x6f,0, - 0x76,0x65,0x72,0x74,0x65,0x72,0, - 0x76,0x69,0xcc,0x81,0x61,0, - 0x76,0x69,0x61,0x6a,0x65,0, - 0x76,0x69,0x62,0x72,0x61,0x72,0, - 0x76,0x69,0x63,0x69,0x6f,0, - 0x76,0x69,0xcc,0x81,0x63,0x74,0x69,0x6d,0x61,0, - 0x76,0x69,0x64,0x61,0, - 0x76,0x69,0xcc,0x81,0x64,0x65,0x6f,0, - 0x76,0x69,0x64,0x72,0x69,0x6f,0, - 0x76,0x69,0x65,0x6a,0x6f,0, - 0x76,0x69,0x65,0x72,0x6e,0x65,0x73,0, - 0x76,0x69,0x67,0x6f,0x72,0, - 0x76,0x69,0x6c,0, - 0x76,0x69,0x6c,0x6c,0x61,0, - 0x76,0x69,0x6e,0x61,0x67,0x72,0x65,0, - 0x76,0x69,0x6e,0x6f,0, - 0x76,0x69,0x6e,0xcc,0x83,0x65,0x64,0x6f,0, - 0x76,0x69,0x6f,0x6c,0x69,0xcc,0x81,0x6e,0, - 0x76,0x69,0x72,0x61,0x6c,0, - 0x76,0x69,0x72,0x67,0x6f,0, - 0x76,0x69,0x72,0x74,0x75,0x64,0, - 0x76,0x69,0x73,0x6f,0x72,0, - 0x76,0x69,0xcc,0x81,0x73,0x70,0x65,0x72,0x61,0, - 0x76,0x69,0x73,0x74,0x61,0, - 0x76,0x69,0x74,0x61,0x6d,0x69,0x6e,0x61,0, - 0x76,0x69,0x75,0x64,0x6f,0, - 0x76,0x69,0x76,0x61,0x7a,0, - 0x76,0x69,0x76,0x65,0x72,0x6f,0, - 0x76,0x69,0x76,0x69,0x72,0, - 0x76,0x69,0x76,0x6f,0, - 0x76,0x6f,0x6c,0x63,0x61,0xcc,0x81,0x6e,0, - 0x76,0x6f,0x6c,0x75,0x6d,0x65,0x6e,0, - 0x76,0x6f,0x6c,0x76,0x65,0x72,0, - 0x76,0x6f,0x72,0x61,0x7a,0, - 0x76,0x6f,0x74,0x61,0x72,0, - 0x76,0x6f,0x74,0x6f,0, - 0x76,0x6f,0x7a,0, - 0x76,0x75,0x65,0x6c,0x6f,0, - 0x76,0x75,0x6c,0x67,0x61,0x72,0, - 0x79,0x61,0x63,0x65,0x72,0, - 0x79,0x61,0x74,0x65,0, - 0x79,0x65,0x67,0x75,0x61,0, - 0x79,0x65,0x6d,0x61,0, - 0x79,0x65,0x72,0x6e,0x6f,0, - 0x79,0x65,0x73,0x6f,0, - 0x79,0x6f,0x64,0x6f,0, - 0x79,0x6f,0x67,0x61,0, - 0x79,0x6f,0x67,0x75,0x72,0, - 0x7a,0x61,0x66,0x69,0x72,0x6f,0, - 0x7a,0x61,0x6e,0x6a,0x61,0, - 0x7a,0x61,0x70,0x61,0x74,0x6f,0, - 0x7a,0x61,0x72,0x7a,0x61,0, - 0x7a,0x6f,0x6e,0x61,0, - 0x7a,0x6f,0x72,0x72,0x6f,0, - 0x7a,0x75,0x6d,0x6f,0, - 0x7a,0x75,0x72,0x64,0x6f,0, -}; -#define es ((const char*)es_) -static const char *es_i[] = { - es+0, es+8, es+16, es+22, es+30, es+38, - es+44, es+51, es+58, es+64, es+71, es+77, - es+84, es+93, es+100, es+109, es+116, es+123, - es+130, es+138, es+146, es+154, es+161, es+168, - es+174, es+181, es+186, es+193, es+200, es+207, - es+215, es+222, es+229, es+237, es+245, es+252, - es+259, es+266, es+274, es+282, es+292, es+299, - es+307, es+314, es+321, es+330, es+337, es+344, - es+352, es+358, es+363, es+369, es+378, es+384, - es+390, es+397, es+402, es+409, es+417, es+423, - es+430, es+440, es+448, es+455, es+460, es+468, - es+476, es+482, es+489, es+496, es+503, es+509, - es+517, es+522, es+532, es+539, es+547, es+554, - es+559, es+566, es+576, es+582, es+589, es+596, - es+601, es+608, es+615, es+621, es+628, es+635, - es+643, es+650, es+657, es+665, es+674, es+680, - es+686, es+694, es+699, es+706, es+713, es+719, - es+727, es+733, es+739, es+747, es+754, es+763, - es+770, es+778, es+785, es+792, es+799, es+807, - es+814, es+820, es+827, es+835, es+844, es+852, - es+858, es+865, es+873, es+881, es+886, es+894, - es+900, es+907, es+913, es+922, es+930, es+938, - es+944, es+950, es+958, es+963, es+973, es+981, - es+989, es+997, es+1002, es+1008, es+1016, es+1022, - es+1029, es+1037, es+1043, es+1053, es+1061, es+1067, - es+1072, es+1080, es+1088, es+1094, es+1101, es+1106, - es+1114, es+1118, es+1124, es+1131, es+1139, es+1148, - es+1153, es+1160, es+1168, es+1174, es+1182, es+1187, - es+1195, es+1204, es+1212, es+1218, es+1225, es+1232, - es+1239, es+1245, es+1252, es+1257, es+1264, es+1269, - es+1277, es+1284, es+1292, es+1299, es+1305, es+1312, - es+1318, es+1324, es+1329, es+1334, es+1342, es+1350, - es+1356, es+1361, es+1368, es+1374, es+1378, es+1387, - es+1393, es+1402, es+1410, es+1416, es+1421, es+1427, - es+1433, es+1443, es+1448, es+1454, es+1463, es+1470, - es+1475, es+1480, es+1486, es+1492, es+1500, es+1506, - es+1512, es+1520, es+1529, es+1535, es+1543, es+1549, - es+1555, es+1562, es+1568, es+1574, es+1581, es+1587, - es+1597, es+1606, es+1613, es+1621, es+1631, es+1637, - es+1644, es+1651, es+1657, es+1664, es+1671, es+1677, - es+1683, es+1688, es+1695, es+1701, es+1706, es+1712, - es+1719, es+1726, es+1732, es+1736, es+1743, es+1748, - es+1753, es+1760, es+1765, es+1772, es+1778, es+1783, - es+1790, es+1796, es+1802, es+1809, es+1816, es+1821, - es+1830, es+1836, es+1843, es+1850, es+1855, es+1863, - es+1872, es+1878, es+1884, es+1890, es+1897, es+1903, - es+1910, es+1917, es+1923, es+1929, es+1935, es+1942, - es+1948, es+1954, es+1961, es+1967, es+1973, es+1979, - es+1985, es+1990, es+1998, es+2006, es+2013, es+2020, - es+2026, es+2034, es+2040, es+2046, es+2053, es+2060, - es+2068, es+2076, es+2083, es+2090, es+2096, es+2102, - es+2112, es+2119, es+2124, es+2131, es+2139, es+2148, - es+2153, es+2161, es+2165, es+2173, es+2180, es+2186, - es+2194, es+2200, es+2206, es+2212, es+2218, es+2223, - es+2230, es+2238, es+2245, es+2251, es+2260, es+2267, - es+2274, es+2282, es+2289, es+2295, es+2302, es+2312, - es+2318, es+2323, es+2329, es+2339, es+2346, es+2353, - es+2361, es+2366, es+2375, es+2384, es+2391, es+2397, - es+2406, es+2412, es+2420, es+2426, es+2432, es+2437, - es+2443, es+2450, es+2456, es+2463, es+2471, es+2477, - es+2484, es+2490, es+2495, es+2503, es+2509, es+2515, - es+2521, es+2531, es+2538, es+2547, es+2555, es+2562, - es+2569, es+2575, es+2581, es+2588, es+2593, es+2600, - es+2608, es+2617, es+2623, es+2630, es+2638, es+2647, - es+2655, es+2661, es+2668, es+2674, es+2681, es+2687, - es+2694, es+2700, es+2708, es+2715, es+2724, es+2730, - es+2736, es+2741, es+2748, es+2754, es+2762, es+2767, - es+2773, es+2778, es+2784, es+2793, es+2799, es+2807, - es+2813, es+2818, es+2825, es+2832, es+2837, es+2843, - es+2849, es+2855, es+2863, es+2869, es+2879, es+2885, - es+2895, es+2903, es+2910, es+2915, es+2924, es+2929, - es+2935, es+2941, es+2948, es+2956, es+2961, es+2966, - es+2973, es+2981, es+2988, es+2995, es+3002, es+3008, - es+3016, es+3024, es+3030, es+3037, es+3046, es+3053, - es+3059, es+3066, es+3072, es+3080, es+3088, es+3095, - es+3100, es+3106, es+3116, es+3124, es+3131, es+3140, - es+3147, es+3154, es+3160, es+3167, es+3173, es+3182, - es+3191, es+3197, es+3204, es+3213, es+3219, es+3226, - es+3233, es+3240, es+3247, es+3253, es+3263, es+3272, - es+3278, es+3283, es+3290, es+3297, es+3304, es+3309, - es+3316, es+3324, es+3331, es+3338, es+3345, es+3352, - es+3358, es+3365, es+3373, es+3379, es+3385, es+3392, - es+3400, es+3405, es+3412, es+3418, es+3426, es+3435, - es+3441, es+3449, es+3455, es+3461, es+3467, es+3472, - es+3478, es+3482, es+3488, es+3496, es+3502, es+3510, - es+3519, es+3525, es+3530, es+3538, es+3546, es+3552, - es+3561, es+3569, es+3576, es+3583, es+3589, es+3596, - es+3604, es+3612, es+3620, es+3629, es+3635, es+3643, - es+3651, es+3659, es+3668, es+3676, es+3684, es+3690, - es+3696, es+3703, es+3711, es+3720, es+3726, es+3733, - es+3740, es+3747, es+3754, es+3760, es+3765, es+3775, - es+3781, es+3788, es+3795, es+3802, es+3810, es+3818, - es+3824, es+3833, es+3841, es+3846, es+3853, es+3859, - es+3864, es+3870, es+3878, es+3882, es+3888, es+3895, - es+3902, es+3908, es+3912, es+3918, es+3927, es+3933, - es+3939, es+3944, es+3950, es+3958, es+3964, es+3970, - es+3976, es+3982, es+3989, es+3994, es+4002, es+4008, - es+4014, es+4018, es+4026, es+4031, es+4041, es+4050, - es+4057, es+4064, es+4071, es+4078, es+4082, es+4090, - es+4099, es+4106, es+4115, es+4122, es+4129, es+4137, - es+4144, es+4151, es+4158, es+4165, es+4172, es+4182, - es+4189, es+4198, es+4205, es+4213, es+4219, es+4227, - es+4235, es+4243, es+4251, es+4257, es+4264, es+4272, - es+4281, es+4288, es+4295, es+4302, es+4309, es+4316, - es+4326, es+4333, es+4340, es+4347, es+4355, es+4363, - es+4370, es+4376, es+4383, es+4390, es+4398, es+4407, - es+4414, es+4422, es+4429, es+4438, es+4445, es+4452, - es+4460, es+4467, es+4474, es+4482, es+4488, es+4493, - es+4500, es+4507, es+4513, es+4520, es+4528, es+4534, - es+4541, es+4549, es+4556, es+4563, es+4570, es+4577, - es+4584, es+4591, es+4598, es+4605, es+4612, es+4620, - es+4628, es+4636, es+4645, es+4653, es+4661, es+4671, - es+4680, es+4688, es+4696, es+4703, es+4709, es+4714, - es+4720, es+4726, es+4732, es+4739, es+4744, es+4752, - es+4759, es+4768, es+4777, es+4783, es+4789, es+4794, - es+4801, es+4807, es+4813, es+4817, es+4825, es+4831, - es+4837, es+4841, es+4847, es+4853, es+4862, es+4869, - es+4878, es+4885, es+4892, es+4897, es+4903, es+4913, - es+4919, es+4925, es+4932, es+4937, es+4943, es+4950, - es+4957, es+4963, es+4968, es+4973, es+4980, es+4987, - es+4994, es+4998, es+5004, es+5011, es+5018, es+5024, - es+5030, es+5037, es+5044, es+5049, es+5055, es+5061, - es+5067, es+5075, es+5081, es+5086, es+5093, es+5101, - es+5107, es+5115, es+5121, es+5127, es+5133, es+5141, - es+5148, es+5153, es+5158, es+5166, es+5175, es+5182, - es+5188, es+5195, es+5203, es+5209, es+5215, es+5222, - es+5228, es+5234, es+5240, es+5247, es+5254, es+5259, - es+5265, es+5275, es+5281, es+5290, es+5296, es+5302, - es+5311, es+5318, es+5325, es+5331, es+5337, es+5342, - es+5347, es+5357, es+5363, es+5369, es+5375, es+5382, - es+5388, es+5394, es+5401, es+5407, es+5416, es+5423, - es+5428, es+5438, es+5445, es+5451, es+5455, es+5464, - es+5470, es+5476, es+5484, es+5492, es+5499, es+5505, - es+5513, es+5522, es+5528, es+5533, es+5541, es+5547, - es+5554, es+5558, es+5564, es+5571, es+5577, es+5582, - es+5588, es+5595, es+5601, es+5606, es+5612, es+5618, - es+5624, es+5634, es+5640, es+5646, es+5653, es+5659, - es+5666, es+5673, es+5679, es+5684, es+5690, es+5697, - es+5704, es+5711, es+5717, es+5723, es+5730, es+5736, - es+5744, es+5751, es+5758, es+5766, es+5772, es+5778, - es+5787, es+5794, es+5801, es+5807, es+5815, es+5822, - es+5828, es+5834, es+5839, es+5846, es+5853, es+5860, - es+5864, es+5873, es+5881, es+5887, es+5893, es+5900, - es+5906, es+5913, es+5919, es+5927, es+5935, es+5942, - es+5948, es+5955, es+5964, es+5972, es+5977, es+5983, - es+5992, es+5999, es+6005, es+6013, es+6018, es+6025, - es+6031, es+6037, es+6043, es+6048, es+6056, es+6062, - es+6069, es+6074, es+6080, es+6087, es+6094, es+6100, - es+6106, es+6112, es+6117, es+6124, es+6133, es+6141, - es+6146, es+6153, es+6163, es+6169, es+6175, es+6181, - es+6188, es+6196, es+6204, es+6211, es+6217, es+6224, - es+6234, es+6241, es+6248, es+6255, es+6261, es+6269, - es+6277, es+6285, es+6293, es+6302, es+6309, es+6316, - es+6324, es+6332, es+6339, es+6347, es+6354, es+6361, - es+6369, es+6378, es+6388, es+6397, es+6404, es+6413, - es+6422, es+6426, es+6431, es+6440, es+6445, es+6452, - es+6461, es+6469, es+6477, es+6484, es+6493, es+6499, - es+6505, es+6514, es+6519, es+6527, es+6534, es+6542, - es+6549, es+6555, es+6560, es+6567, es+6574, es+6579, - es+6587, es+6592, es+6600, es+6607, es+6613, es+6620, - es+6626, es+6633, es+6643, es+6649, es+6655, es+6663, - es+6670, es+6675, es+6681, es+6687, es+6693, es+6699, - es+6704, es+6713, es+6721, es+6731, es+6738, es+6744, - es+6750, es+6759, es+6769, es+6774, es+6781, es+6790, - es+6796, es+6804, es+6810, es+6816, es+6826, es+6831, - es+6839, es+6845, es+6852, es+6858, es+6863, es+6868, - es+6878, es+6884, es+6891, es+6896, es+6905, es+6914, - es+6921, es+6928, es+6934, es+6941, es+6948, es+6957, - es+6966, es+6972, es+6978, es+6983, es+6991, es+7000, - es+7006, es+7012, es+7020, es+7027, es+7034, es+7039, - es+7046, es+7051, es+7060, es+7068, es+7075, es+7081, - es+7087, es+7095, es+7103, es+7108, es+7117, es+7127, - es+7132, es+7138, es+7145, es+7151, es+7157, es+7163, - es+7169, es+7176, es+7182, es+7189, es+7196, es+7203, - es+7210, es+7217, es+7224, es+7229, es+7238, es+7243, - es+7250, es+7259, es+7265, es+7273, es+7278, es+7284, - es+7289, es+7295, es+7301, es+7307, es+7312, es+7317, - es+7323, es+7328, es+7335, es+7340, es+7344, es+7351, - es+7357, es+7364, es+7370, es+7377, es+7385, es+7391, - es+7397, es+7402, es+7409, es+7416, es+7423, es+7429, - es+7434, es+7441, es+7447, es+7453, es+7459, es+7465, - es+7473, es+7479, es+7489, es+7496, es+7501, es+7507, - es+7513, es+7522, es+7527, es+7537, es+7541, es+7547, - es+7553, es+7560, es+7567, es+7574, es+7583, es+7592, - es+7599, es+7605, es+7610, es+7620, es+7627, es+7633, - es+7641, es+7647, es+7654, es+7663, es+7669, es+7677, - es+7683, es+7691, es+7697, es+7706, es+7714, es+7720, - es+7727, es+7735, es+7743, es+7749, es+7757, es+7763, - es+7770, es+7778, es+7787, es+7796, es+7800, es+7808, - es+7813, es+7819, es+7828, es+7834, es+7841, es+7847, - es+7852, es+7860, es+7865, es+7869, es+7877, es+7885, - es+7894, es+7899, es+7904, es+7911, es+7920, es+7927, - es+7933, es+7939, es+7944, es+7952, es+7958, es+7964, - es+7970, es+7975, es+7983, es+7992, es+7997, es+8004, - es+8009, es+8015, es+8021, es+8027, es+8034, es+8042, - es+8048, es+8056, es+8063, es+8069, es+8075, es+8082, - es+8089, es+8096, es+8103, es+8109, es+8115, es+8121, - es+8128, es+8134, es+8142, es+8149, es+8155, es+8163, - es+8168, es+8174, es+8180, es+8187, es+8193, es+8200, - es+8208, es+8214, es+8220, es+8225, es+8232, es+8238, - es+8244, es+8253, es+8259, es+8264, es+8274, es+8280, - es+8286, es+8295, es+8301, es+8309, es+8318, es+8324, - es+8330, es+8338, es+8344, es+8351, es+8357, es+8363, - es+8370, es+8378, es+8387, es+8393, es+8398, es+8406, - es+8412, es+8421, es+8427, es+8435, es+8441, es+8448, - es+8455, es+8460, es+8467, es+8473, es+8480, es+8486, - es+8491, es+8498, es+8504, es+8512, es+8519, es+8528, - es+8534, es+8542, es+8548, es+8557, es+8563, es+8569, - es+8575, es+8580, es+8588, es+8595, es+8602, es+8608, - es+8613, es+8618, es+8627, es+8635, es+8640, es+8646, - es+8652, es+8657, es+8662, es+8671, es+8678, es+8684, - es+8690, es+8697, es+8704, es+8709, es+8716, es+8725, - es+8733, es+8739, es+8743, es+8749, es+8758, es+8766, - es+8771, es+8776, es+8781, es+8788, es+8796, es+8803, - es+8810, es+8818, es+8824, es+8829, es+8836, es+8842, - es+8849, es+8856, es+8863, es+8871, es+8876, es+8883, - es+8889, es+8893, es+8897, es+8904, es+8911, es+8917, - es+8922, es+8927, es+8932, es+8939, es+8947, es+8952, - es+8957, es+8963, es+8972, es+8980, es+8987, es+8994, - es+9000, es+9009, es+9017, es+9027, es+9034, es+9039, - es+9048, es+9053, es+9059, es+9065, es+9074, es+9082, - es+9090, es+9098, es+9105, es+9112, es+9116, es+9125, - es+9131, es+9140, es+9147, es+9154, es+9158, es+9164, - es+9172, es+9177, es+9183, es+9191, es+9199, es+9209, - es+9216, es+9222, es+9228, es+9234, es+9241, es+9250, - es+9255, es+9262, es+9271, es+9279, es+9285, es+9292, - es+9301, es+9307, es+9314, es+9321, es+9325, es+9331, - es+9340, es+9348, es+9358, es+9365, es+9371, es+9379, - es+9387, es+9393, es+9401, es+9407, es+9413, es+9418, - es+9428, es+9435, es+9445, es+9451, es+9457, es+9463, - es+9472, es+9477, es+9483, es+9488, es+9494, es+9501, - es+9507, es+9513, es+9518, es+9525, es+9534, es+9541, - es+9548, es+9554, es+9560, es+9566, es+9572, es+9578, - es+9584, es+9594, es+9600, es+9608, es+9616, es+9621, - es+9628, es+9633, es+9640, es+9650, es+9657, es+9662, - es+9669, es+9679, es+9684, es+9691, es+9698, es+9705, - es+9712, es+9719, es+9725, es+9733, es+9739, es+9747, - es+9752, es+9758, es+9767, es+9777, es+9786, es+9797, - es+9801, es+9810, es+9816, es+9825, es+9829, es+9836, - es+9843, es+9849, es+9856, es+9862, es+9869, es+9878, - es+9883, es+9890, es+9896, es+9903, es+9909, es+9914, - es+9921, es+9927, es+9935, es+9940, es+9946, es+9954, - es+9960, es+9966, es+9971, es+9977, es+9983, es+9989, - es+9996, es+10002, es+10008, es+10014, es+10021, es+10027, - es+10032, es+10038, es+10044, es+10050, es+10059, es+10065, - es+10071, es+10081, es+10087, es+10093, es+10100, es+10107, - es+10112, es+10118, es+10124, es+10134, es+10141, es+10148, - es+10155, es+10163, es+10169, es+10178, es+10184, es+10189, - es+10195, es+10202, es+10211, es+10218, es+10225, es+10231, - es+10238, es+10244, es+10255, es+10265, es+10272, es+10277, - es+10284, es+10292, es+10301, es+10308, es+10317, es+10326, - es+10332, es+10340, es+10347, es+10354, es+10364, es+10371, - es+10381, es+10389, es+10395, es+10402, es+10409, es+10416, - es+10422, es+10428, es+10437, es+10443, es+10449, es+10454, - es+10460, es+10468, es+10475, es+10480, es+10487, es+10494, - es+10501, es+10507, es+10514, es+10521, es+10527, es+10534, - es+10544, es+10551, es+10558, es+10567, es+10573, es+10578, - es+10587, es+10595, es+10602, es+10607, es+10613, es+10620, - es+10626, es+10632, es+10641, es+10647, es+10653, es+10659, - es+10664, es+10669, es+10674, es+10682, es+10693, es+10702, - es+10711, es+10718, es+10725, es+10732, es+10740, es+10748, - es+10755, es+10761, es+10769, es+10773, es+10781, es+10789, - es+10797, es+10805, es+10814, es+10822, es+10829, es+10835, - es+10841, es+10849, es+10857, es+10863, es+10870, es+10875, - es+10882, es+10889, es+10897, es+10905, es+10911, es+10917, - es+10925, es+10930, es+10937, es+10944, es+10950, es+10958, - es+10966, es+10973, es+10980, es+10984, es+10992, es+10999, - es+11007, es+11013, es+11021, es+11028, es+11036, es+11044, - es+11051, es+11059, es+11067, es+11071, es+11077, es+11082, - es+11088, es+11095, es+11102, es+11107, es+11116, es+11122, - es+11131, es+11141, es+11147, es+11155, es+11160, es+11166, - es+11171, es+11176, es+11182, es+11187, es+11194, es+11200, - es+11206, es+11214, es+11219, es+11226, es+11231, es+11238, - es+11245, es+11249, es+11255, es+11261, es+11266, es+11273, - es+11278, es+11284, es+11291, es+11297, es+11304, es+11310, - es+11315, es+11321, es+11327, es+11333, es+11339, es+11346, - es+11351, es+11357, es+11363, es+11371, es+11376, es+11383, - es+11392, es+11398, es+11404, es+11410, es+11416, es+11422, - es+11430, es+11435, es+11441, es+11448, es+11454, es+11463, - es+11471, es+11477, es+11483, es+11489, es+11496, es+11502, - es+11512, es+11521, es+11528, es+11535, es+11543, es+11548, - es+11554, es+11559, es+11565, es+11573, es+11582, es+11589, - es+11597, es+11603, es+11613, es+11623, es+11628, es+11636, - es+11642, es+11646, es+11653, es+11658, es+11664, es+11670, - es+11677, es+11685, es+11691, es+11698, es+11706, es+11714, - es+11722, es+11728, es+11737, es+11741, es+11747, es+11756, - es+11763, es+11771, es+11780, es+11785, es+11793, es+11800, - es+11805, es+11811, es+11817, es+11824, es+11830, es+11836, - es+11842, es+11851, es+11858, es+11867, es+11873, es+11883, - es+11889, es+11896, es+11904, es+11910, es+11917, es+11923, - es+11929, es+11935, es+11939, es+11946, es+11954, es+11962, - es+11971, es+11978, es+11989, es+11996, es+12003, es+12010, - es+12017, es+12025, es+12030, es+12037, es+12045, es+12051, - es+12060, es+12067, es+12076, es+12085, es+12091, es+12097, - es+12104, es+12110, es+12117, es+12123, es+12131, es+12138, - es+12145, es+12152, es+12161, es+12167, es+12175, es+12182, - es+12190, es+12198, es+12202, es+12208, es+12217, es+12224, - es+12230, es+12236, es+12243, es+12251, es+12257, es+12264, - es+12269, es+12275, es+12280, es+12286, es+12292, es+12300, - es+12306, es+12314, es+12323, es+12330, es+12336, es+12343, - es+12348, es+12355, es+12361, es+12369, es+12378, es+12384, - es+12390, es+12397, es+12405, es+12411, es+12417, es+12423, - es+12431, es+12437, es+12442, es+12450, es+12457, es+12463, - es+12469, es+12479, es+12486, es+12492, es+12499, es+12504, - es+12515, es+12520, es+12526, es+12533, es+12539, es+12546, - es+12552, es+12558, es+12564, es+12573, es+12581, es+12587, - es+12597, es+12605, es+12612, es+12618, es+12625, es+12633, - es+12640, es+12646, es+12650, es+12656, es+12666, es+12673, - es+12680, es+12687, es+12693, es+12699, es+12706, es+12712, - es+12719, es+12728, es+12733, es+12739, es+12745, es+12754, - es+12759, es+12764, es+12772, es+12780, es+12789, es+12798, - es+12803, es+12810, es+12818, es+12824, es+12831, es+12836, - es+12841, es+12847, es+12853, es+12858, es+12864, es+12870, - es+12875, es+12881, es+12889, es+12896, es+12905, es+12912, - es+12917, es+12925, es+12931, es+12937, es+12945, es+12949, - es+12955, es+12961, es+12970, es+12978, es+12986, es+12992, - es+13002, es+13008, es+13014, es+13020, es+13027, es+13033, - es+13040, es+13047, es+13056, es+13063, es+13071, es+13076, - es+13083, es+13088, es+13094, es+13100, es+13106, es+13113, - es+13121, es+13128, es+13135, es+13142, es+13148, es+13154, - es+13160, es+13166, es+13173, es+13179, es+13189, es+13194, - es+13201, es+13207, es+13213, es+13221, es+13230, es+13238, - es+13246, es+13252, es+13258, es+13265, es+13274, es+13281, - es+13288, es+13293, es+13302, es+13306, es+13312, es+13318, - es+13325, es+13330, es+13338, es+13343, es+13348, es+13356, - es+13363, es+13372, es+13376, es+13381, es+13389, es+13396, - es+13402, es+13407, es+13413, es+13421, es+13426, es+13435, - es+13441, es+13447, es+13457, es+13465, es+13470, es+13477, - es+13485, es+13490, es+13497, es+13504, es+13515, es+13522, - es+13528, es+13533, es+13540, es+13546, es+13551, es+13558, - es+13564, es+13571, es+13578, es+13584, es+13590, es+13596, - es+13600, es+13607, es+13613, es+13619, es+13626, es+13632, - es+13638, es+13645, es+13651, es+13657, es+13664, es+13670, - es+13680, es+13685, es+13693, es+13700, es+13706, es+13714, - es+13720, es+13724, es+13730, es+13738, es+13743, es+13752, - es+13761, es+13767, es+13773, es+13780, es+13786, es+13796, - es+13802, es+13811, es+13817, es+13823, es+13830, es+13836, - es+13841, es+13850, es+13858, es+13865, es+13871, es+13877, - es+13882, es+13886, es+13892, es+13899, es+13905, es+13910, - es+13916, es+13921, es+13927, es+13932, es+13937, es+13942, - es+13948, es+13955, es+13961, es+13968, es+13974, es+13979, - es+13985, es+13990, es+13996, - }; -#undef es - -static const struct words es_words = { - 2048, - 11, - false, - (const char *)es_, - 0, /* Constant string */ - es_i -}; diff --git a/external/libwally-core/src/data/wordlists/spanish.txt b/external/libwally-core/src/data/wordlists/spanish.txt deleted file mode 100644 index fdbc23c73..000000000 --- a/external/libwally-core/src/data/wordlists/spanish.txt +++ /dev/null @@ -1,2048 +0,0 @@ -ábaco -abdomen -abeja -abierto -abogado -abono -aborto -abrazo -abrir -abuelo -abuso -acabar -academia -acceso -acción -aceite -acelga -acento -aceptar -ácido -aclarar -acné -acoger -acoso -activo -acto -actriz -actuar -acudir -acuerdo -acusar -adicto -admitir -adoptar -adorno -aduana -adulto -aéreo -afectar -afición -afinar -afirmar -ágil -agitar -agonía -agosto -agotar -agregar -agrio -agua -agudo -águila -aguja -ahogo -ahorro -aire -aislar -ajedrez -ajeno -ajuste -alacrán -alambre -alarma -alba -álbum -alcalde -aldea -alegre -alejar -alerta -aleta -alfiler -alga -algodón -aliado -aliento -alivio -alma -almeja -almíbar -altar -alteza -altivo -alto -altura -alumno -alzar -amable -amante -amapola -amargo -amasar -ámbar -ámbito -ameno -amigo -amistad -amor -amparo -amplio -ancho -anciano -ancla -andar -andén -anemia -ángulo -anillo -ánimo -anís -anotar -antena -antiguo -antojo -anual -anular -anuncio -añadir -añejo -año -apagar -aparato -apetito -apio -aplicar -apodo -aporte -apoyo -aprender -aprobar -apuesta -apuro -arado -araña -arar -árbitro -árbol -arbusto -archivo -arco -arder -ardilla -arduo -área -árido -aries -armonía -arnés -aroma -arpa -arpón -arreglo -arroz -arruga -arte -artista -asa -asado -asalto -ascenso -asegurar -aseo -asesor -asiento -asilo -asistir -asno -asombro -áspero -astilla -astro -astuto -asumir -asunto -atajo -ataque -atar -atento -ateo -ático -atleta -átomo -atraer -atroz -atún -audaz -audio -auge -aula -aumento -ausente -autor -aval -avance -avaro -ave -avellana -avena -avestruz -avión -aviso -ayer -ayuda -ayuno -azafrán -azar -azote -azúcar -azufre -azul -baba -babor -bache -bahía -baile -bajar -balanza -balcón -balde -bambú -banco -banda -baño -barba -barco -barniz -barro -báscula -bastón -basura -batalla -batería -batir -batuta -baúl -bazar -bebé -bebida -bello -besar -beso -bestia -bicho -bien -bingo -blanco -bloque -blusa -boa -bobina -bobo -boca -bocina -boda -bodega -boina -bola -bolero -bolsa -bomba -bondad -bonito -bono -bonsái -borde -borrar -bosque -bote -botín -bóveda -bozal -bravo -brazo -brecha -breve -brillo -brinco -brisa -broca -broma -bronce -brote -bruja -brusco -bruto -buceo -bucle -bueno -buey -bufanda -bufón -búho -buitre -bulto -burbuja -burla -burro -buscar -butaca -buzón -caballo -cabeza -cabina -cabra -cacao -cadáver -cadena -caer -café -caída -caimán -caja -cajón -cal -calamar -calcio -caldo -calidad -calle -calma -calor -calvo -cama -cambio -camello -camino -campo -cáncer -candil -canela -canguro -canica -canto -caña -cañón -caoba -caos -capaz -capitán -capote -captar -capucha -cara -carbón -cárcel -careta -carga -cariño -carne -carpeta -carro -carta -casa -casco -casero -caspa -castor -catorce -catre -caudal -causa -cazo -cebolla -ceder -cedro -celda -célebre -celoso -célula -cemento -ceniza -centro -cerca -cerdo -cereza -cero -cerrar -certeza -césped -cetro -chacal -chaleco -champú -chancla -chapa -charla -chico -chiste -chivo -choque -choza -chuleta -chupar -ciclón -ciego -cielo -cien -cierto -cifra -cigarro -cima -cinco -cine -cinta -ciprés -circo -ciruela -cisne -cita -ciudad -clamor -clan -claro -clase -clave -cliente -clima -clínica -cobre -cocción -cochino -cocina -coco -código -codo -cofre -coger -cohete -cojín -cojo -cola -colcha -colegio -colgar -colina -collar -colmo -columna -combate -comer -comida -cómodo -compra -conde -conejo -conga -conocer -consejo -contar -copa -copia -corazón -corbata -corcho -cordón -corona -correr -coser -cosmos -costa -cráneo -cráter -crear -crecer -creído -crema -cría -crimen -cripta -crisis -cromo -crónica -croqueta -crudo -cruz -cuadro -cuarto -cuatro -cubo -cubrir -cuchara -cuello -cuento -cuerda -cuesta -cueva -cuidar -culebra -culpa -culto -cumbre -cumplir -cuna -cuneta -cuota -cupón -cúpula -curar -curioso -curso -curva -cutis -dama -danza -dar -dardo -dátil -deber -débil -década -decir -dedo -defensa -definir -dejar -delfín -delgado -delito -demora -denso -dental -deporte -derecho -derrota -desayuno -deseo -desfile -desnudo -destino -desvío -detalle -detener -deuda -día -diablo -diadema -diamante -diana -diario -dibujo -dictar -diente -dieta -diez -difícil -digno -dilema -diluir -dinero -directo -dirigir -disco -diseño -disfraz -diva -divino -doble -doce -dolor -domingo -don -donar -dorado -dormir -dorso -dos -dosis -dragón -droga -ducha -duda -duelo -dueño -dulce -dúo -duque -durar -dureza -duro -ébano -ebrio -echar -eco -ecuador -edad -edición -edificio -editor -educar -efecto -eficaz -eje -ejemplo -elefante -elegir -elemento -elevar -elipse -élite -elixir -elogio -eludir -embudo -emitir -emoción -empate -empeño -empleo -empresa -enano -encargo -enchufe -encía -enemigo -enero -enfado -enfermo -engaño -enigma -enlace -enorme -enredo -ensayo -enseñar -entero -entrar -envase -envío -época -equipo -erizo -escala -escena -escolar -escribir -escudo -esencia -esfera -esfuerzo -espada -espejo -espía -esposa -espuma -esquí -estar -este -estilo -estufa -etapa -eterno -ética -etnia -evadir -evaluar -evento -evitar -exacto -examen -exceso -excusa -exento -exigir -exilio -existir -éxito -experto -explicar -exponer -extremo -fábrica -fábula -fachada -fácil -factor -faena -faja -falda -fallo -falso -faltar -fama -familia -famoso -faraón -farmacia -farol -farsa -fase -fatiga -fauna -favor -fax -febrero -fecha -feliz -feo -feria -feroz -fértil -fervor -festín -fiable -fianza -fiar -fibra -ficción -ficha -fideo -fiebre -fiel -fiera -fiesta -figura -fijar -fijo -fila -filete -filial -filtro -fin -finca -fingir -finito -firma -flaco -flauta -flecha -flor -flota -fluir -flujo -flúor -fobia -foca -fogata -fogón -folio -folleto -fondo -forma -forro -fortuna -forzar -fosa -foto -fracaso -frágil -franja -frase -fraude -freír -freno -fresa -frío -frito -fruta -fuego -fuente -fuerza -fuga -fumar -función -funda -furgón -furia -fusil -fútbol -futuro -gacela -gafas -gaita -gajo -gala -galería -gallo -gamba -ganar -gancho -ganga -ganso -garaje -garza -gasolina -gastar -gato -gavilán -gemelo -gemir -gen -género -genio -gente -geranio -gerente -germen -gesto -gigante -gimnasio -girar -giro -glaciar -globo -gloria -gol -golfo -goloso -golpe -goma -gordo -gorila -gorra -gota -goteo -gozar -grada -gráfico -grano -grasa -gratis -grave -grieta -grillo -gripe -gris -grito -grosor -grúa -grueso -grumo -grupo -guante -guapo -guardia -guerra -guía -guiño -guion -guiso -guitarra -gusano -gustar -haber -hábil -hablar -hacer -hacha -hada -hallar -hamaca -harina -haz -hazaña -hebilla -hebra -hecho -helado -helio -hembra -herir -hermano -héroe -hervir -hielo -hierro -hígado -higiene -hijo -himno -historia -hocico -hogar -hoguera -hoja -hombre -hongo -honor -honra -hora -hormiga -horno -hostil -hoyo -hueco -huelga -huerta -hueso -huevo -huida -huir -humano -húmedo -humilde -humo -hundir -huracán -hurto -icono -ideal -idioma -ídolo -iglesia -iglú -igual -ilegal -ilusión -imagen -imán -imitar -impar -imperio -imponer -impulso -incapaz -índice -inerte -infiel -informe -ingenio -inicio -inmenso -inmune -innato -insecto -instante -interés -íntimo -intuir -inútil -invierno -ira -iris -ironía -isla -islote -jabalí -jabón -jamón -jarabe -jardín -jarra -jaula -jazmín -jefe -jeringa -jinete -jornada -joroba -joven -joya -juerga -jueves -juez -jugador -jugo -juguete -juicio -junco -jungla -junio -juntar -júpiter -jurar -justo -juvenil -juzgar -kilo -koala -labio -lacio -lacra -lado -ladrón -lagarto -lágrima -laguna -laico -lamer -lámina -lámpara -lana -lancha -langosta -lanza -lápiz -largo -larva -lástima -lata -látex -latir -laurel -lavar -lazo -leal -lección -leche -lector -leer -legión -legumbre -lejano -lengua -lento -leña -león -leopardo -lesión -letal -letra -leve -leyenda -libertad -libro -licor -líder -lidiar -lienzo -liga -ligero -lima -límite -limón -limpio -lince -lindo -línea -lingote -lino -linterna -líquido -liso -lista -litera -litio -litro -llaga -llama -llanto -llave -llegar -llenar -llevar -llorar -llover -lluvia -lobo -loción -loco -locura -lógica -logro -lombriz -lomo -lonja -lote -lucha -lucir -lugar -lujo -luna -lunes -lupa -lustro -luto -luz -maceta -macho -madera -madre -maduro -maestro -mafia -magia -mago -maíz -maldad -maleta -malla -malo -mamá -mambo -mamut -manco -mando -manejar -manga -maniquí -manjar -mano -manso -manta -mañana -mapa -máquina -mar -marco -marea -marfil -margen -marido -mármol -marrón -martes -marzo -masa -máscara -masivo -matar -materia -matiz -matriz -máximo -mayor -mazorca -mecha -medalla -medio -médula -mejilla -mejor -melena -melón -memoria -menor -mensaje -mente -menú -mercado -merengue -mérito -mes -mesón -meta -meter -método -metro -mezcla -miedo -miel -miembro -miga -mil -milagro -militar -millón -mimo -mina -minero -mínimo -minuto -miope -mirar -misa -miseria -misil -mismo -mitad -mito -mochila -moción -moda -modelo -moho -mojar -molde -moler -molino -momento -momia -monarca -moneda -monja -monto -moño -morada -morder -moreno -morir -morro -morsa -mortal -mosca -mostrar -motivo -mover -móvil -mozo -mucho -mudar -mueble -muela -muerte -muestra -mugre -mujer -mula -muleta -multa -mundo -muñeca -mural -muro -músculo -museo -musgo -música -muslo -nácar -nación -nadar -naipe -naranja -nariz -narrar -nasal -natal -nativo -natural -náusea -naval -nave -navidad -necio -néctar -negar -negocio -negro -neón -nervio -neto -neutro -nevar -nevera -nicho -nido -niebla -nieto -niñez -niño -nítido -nivel -nobleza -noche -nómina -noria -norma -norte -nota -noticia -novato -novela -novio -nube -nuca -núcleo -nudillo -nudo -nuera -nueve -nuez -nulo -número -nutria -oasis -obeso -obispo -objeto -obra -obrero -observar -obtener -obvio -oca -ocaso -océano -ochenta -ocho -ocio -ocre -octavo -octubre -oculto -ocupar -ocurrir -odiar -odio -odisea -oeste -ofensa -oferta -oficio -ofrecer -ogro -oído -oír -ojo -ola -oleada -olfato -olivo -olla -olmo -olor -olvido -ombligo -onda -onza -opaco -opción -ópera -opinar -oponer -optar -óptica -opuesto -oración -orador -oral -órbita -orca -orden -oreja -órgano -orgía -orgullo -oriente -origen -orilla -oro -orquesta -oruga -osadía -oscuro -osezno -oso -ostra -otoño -otro -oveja -óvulo -óxido -oxígeno -oyente -ozono -pacto -padre -paella -página -pago -país -pájaro -palabra -palco -paleta -pálido -palma -paloma -palpar -pan -panal -pánico -pantera -pañuelo -papá -papel -papilla -paquete -parar -parcela -pared -parir -paro -párpado -parque -párrafo -parte -pasar -paseo -pasión -paso -pasta -pata -patio -patria -pausa -pauta -pavo -payaso -peatón -pecado -pecera -pecho -pedal -pedir -pegar -peine -pelar -peldaño -pelea -peligro -pellejo -pelo -peluca -pena -pensar -peñón -peón -peor -pepino -pequeño -pera -percha -perder -pereza -perfil -perico -perla -permiso -perro -persona -pesa -pesca -pésimo -pestaña -pétalo -petróleo -pez -pezuña -picar -pichón -pie -piedra -pierna -pieza -pijama -pilar -piloto -pimienta -pino -pintor -pinza -piña -piojo -pipa -pirata -pisar -piscina -piso -pista -pitón -pizca -placa -plan -plata -playa -plaza -pleito -pleno -plomo -pluma -plural -pobre -poco -poder -podio -poema -poesía -poeta -polen -policía -pollo -polvo -pomada -pomelo -pomo -pompa -poner -porción -portal -posada -poseer -posible -poste -potencia -potro -pozo -prado -precoz -pregunta -premio -prensa -preso -previo -primo -príncipe -prisión -privar -proa -probar -proceso -producto -proeza -profesor -programa -prole -promesa -pronto -propio -próximo -prueba -público -puchero -pudor -pueblo -puerta -puesto -pulga -pulir -pulmón -pulpo -pulso -puma -punto -puñal -puño -pupa -pupila -puré -quedar -queja -quemar -querer -queso -quieto -química -quince -quitar -rábano -rabia -rabo -ración -radical -raíz -rama -rampa -rancho -rango -rapaz -rápido -rapto -rasgo -raspa -rato -rayo -raza -razón -reacción -realidad -rebaño -rebote -recaer -receta -rechazo -recoger -recreo -recto -recurso -red -redondo -reducir -reflejo -reforma -refrán -refugio -regalo -regir -regla -regreso -rehén -reino -reír -reja -relato -relevo -relieve -relleno -reloj -remar -remedio -remo -rencor -rendir -renta -reparto -repetir -reposo -reptil -res -rescate -resina -respeto -resto -resumen -retiro -retorno -retrato -reunir -revés -revista -rey -rezar -rico -riego -rienda -riesgo -rifa -rígido -rigor -rincón -riñón -río -riqueza -risa -ritmo -rito -rizo -roble -roce -rociar -rodar -rodeo -rodilla -roer -rojizo -rojo -romero -romper -ron -ronco -ronda -ropa -ropero -rosa -rosca -rostro -rotar -rubí -rubor -rudo -rueda -rugir -ruido -ruina -ruleta -rulo -rumbo -rumor -ruptura -ruta -rutina -sábado -saber -sabio -sable -sacar -sagaz -sagrado -sala -saldo -salero -salir -salmón -salón -salsa -salto -salud -salvar -samba -sanción -sandía -sanear -sangre -sanidad -sano -santo -sapo -saque -sardina -sartén -sastre -satán -sauna -saxofón -sección -seco -secreto -secta -sed -seguir -seis -sello -selva -semana -semilla -senda -sensor -señal -señor -separar -sepia -sequía -ser -serie -sermón -servir -sesenta -sesión -seta -setenta -severo -sexo -sexto -sidra -siesta -siete -siglo -signo -sílaba -silbar -silencio -silla -símbolo -simio -sirena -sistema -sitio -situar -sobre -socio -sodio -sol -solapa -soldado -soledad -sólido -soltar -solución -sombra -sondeo -sonido -sonoro -sonrisa -sopa -soplar -soporte -sordo -sorpresa -sorteo -sostén -sótano -suave -subir -suceso -sudor -suegra -suelo -sueño -suerte -sufrir -sujeto -sultán -sumar -superar -suplir -suponer -supremo -sur -surco -sureño -surgir -susto -sutil -tabaco -tabique -tabla -tabú -taco -tacto -tajo -talar -talco -talento -talla -talón -tamaño -tambor -tango -tanque -tapa -tapete -tapia -tapón -taquilla -tarde -tarea -tarifa -tarjeta -tarot -tarro -tarta -tatuaje -tauro -taza -tazón -teatro -techo -tecla -técnica -tejado -tejer -tejido -tela -teléfono -tema -temor -templo -tenaz -tender -tener -tenis -tenso -teoría -terapia -terco -término -ternura -terror -tesis -tesoro -testigo -tetera -texto -tez -tibio -tiburón -tiempo -tienda -tierra -tieso -tigre -tijera -tilde -timbre -tímido -timo -tinta -tío -típico -tipo -tira -tirón -titán -títere -título -tiza -toalla -tobillo -tocar -tocino -todo -toga -toldo -tomar -tono -tonto -topar -tope -toque -tórax -torero -tormenta -torneo -toro -torpedo -torre -torso -tortuga -tos -tosco -toser -tóxico -trabajo -tractor -traer -tráfico -trago -traje -tramo -trance -trato -trauma -trazar -trébol -tregua -treinta -tren -trepar -tres -tribu -trigo -tripa -triste -triunfo -trofeo -trompa -tronco -tropa -trote -trozo -truco -trueno -trufa -tubería -tubo -tuerto -tumba -tumor -túnel -túnica -turbina -turismo -turno -tutor -ubicar -úlcera -umbral -unidad -unir -universo -uno -untar -uña -urbano -urbe -urgente -urna -usar -usuario -útil -utopía -uva -vaca -vacío -vacuna -vagar -vago -vaina -vajilla -vale -válido -valle -valor -válvula -vampiro -vara -variar -varón -vaso -vecino -vector -vehículo -veinte -vejez -vela -velero -veloz -vena -vencer -venda -veneno -vengar -venir -venta -venus -ver -verano -verbo -verde -vereda -verja -verso -verter -vía -viaje -vibrar -vicio -víctima -vida -vídeo -vidrio -viejo -viernes -vigor -vil -villa -vinagre -vino -viñedo -violín -viral -virgo -virtud -visor -víspera -vista -vitamina -viudo -vivaz -vivero -vivir -vivo -volcán -volumen -volver -voraz -votar -voto -voz -vuelo -vulgar -yacer -yate -yegua -yema -yerno -yeso -yodo -yoga -yogur -zafiro -zanja -zapato -zarza -zona -zorro -zumo -zurdo diff --git a/external/libwally-core/src/data/wordlists/vectors.json b/external/libwally-core/src/data/wordlists/vectors.json deleted file mode 100644 index 285d6a064..000000000 --- a/external/libwally-core/src/data/wordlists/vectors.json +++ /dev/null @@ -1,150 +0,0 @@ -{ - "_comment" : "taken from https://raw.githubusercontent.com/trezor/python-mnemonic/master/vectors.json", - - "english": [ - [ - "00000000000000000000000000000000", - "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", - "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04", - "xprv9s21ZrQH143K3h3fDYiay8mocZ3afhfULfb5GX8kCBdno77K4HiA15Tg23wpbeF1pLfs1c5SPmYHrEpTuuRhxMwvKDwqdKiGJS9XFKzUsAF" - ], - [ - "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", - "legal winner thank year wave sausage worth useful legal winner thank yellow", - "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607", - "xprv9s21ZrQH143K2gA81bYFHqU68xz1cX2APaSq5tt6MFSLeXnCKV1RVUJt9FWNTbrrryem4ZckN8k4Ls1H6nwdvDTvnV7zEXs2HgPezuVccsq" - ], - [ - "80808080808080808080808080808080", - "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", - "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8", - "xprv9s21ZrQH143K2shfP28KM3nr5Ap1SXjz8gc2rAqqMEynmjt6o1qboCDpxckqXavCwdnYds6yBHZGKHv7ef2eTXy461PXUjBFQg6PrwY4Gzq" - ], - [ - "ffffffffffffffffffffffffffffffff", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", - "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069", - "xprv9s21ZrQH143K2V4oox4M8Zmhi2Fjx5XK4Lf7GKRvPSgydU3mjZuKGCTg7UPiBUD7ydVPvSLtg9hjp7MQTYsW67rZHAXeccqYqrsx8LcXnyd" - ], - [ - "000000000000000000000000000000000000000000000000", - "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", - "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa", - "xprv9s21ZrQH143K3mEDrypcZ2usWqFgzKB6jBBx9B6GfC7fu26X6hPRzVjzkqkPvDqp6g5eypdk6cyhGnBngbjeHTe4LsuLG1cCmKJka5SMkmU" - ], - [ - "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", - "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", - "f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd", - "xprv9s21ZrQH143K3Lv9MZLj16np5GzLe7tDKQfVusBni7toqJGcnKRtHSxUwbKUyUWiwpK55g1DUSsw76TF1T93VT4gz4wt5RM23pkaQLnvBh7" - ], - [ - "808080808080808080808080808080808080808080808080", - "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", - "107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65", - "xprv9s21ZrQH143K3VPCbxbUtpkh9pRG371UCLDz3BjceqP1jz7XZsQ5EnNkYAEkfeZp62cDNj13ZTEVG1TEro9sZ9grfRmcYWLBhCocViKEJae" - ], - [ - "ffffffffffffffffffffffffffffffffffffffffffffffff", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", - "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528", - "xprv9s21ZrQH143K36Ao5jHRVhFGDbLP6FCx8BEEmpru77ef3bmA928BxsqvVM27WnvvyfWywiFN8K6yToqMaGYfzS6Db1EHAXT5TuyCLBXUfdm" - ], - [ - "0000000000000000000000000000000000000000000000000000000000000000", - "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", - "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8", - "xprv9s21ZrQH143K32qBagUJAMU2LsHg3ka7jqMcV98Y7gVeVyNStwYS3U7yVVoDZ4btbRNf4h6ibWpY22iRmXq35qgLs79f312g2kj5539ebPM" - ], - [ - "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", - "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", - "bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87", - "xprv9s21ZrQH143K3Y1sd2XVu9wtqxJRvybCfAetjUrMMco6r3v9qZTBeXiBZkS8JxWbcGJZyio8TrZtm6pkbzG8SYt1sxwNLh3Wx7to5pgiVFU" - ], - [ - "8080808080808080808080808080808080808080808080808080808080808080", - "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", - "c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f", - "xprv9s21ZrQH143K3CSnQNYC3MqAAqHwxeTLhDbhF43A4ss4ciWNmCY9zQGvAKUSqVUf2vPHBTSE1rB2pg4avopqSiLVzXEU8KziNnVPauTqLRo" - ], - [ - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", - "dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad", - "xprv9s21ZrQH143K2WFF16X85T2QCpndrGwx6GueB72Zf3AHwHJaknRXNF37ZmDrtHrrLSHvbuRejXcnYxoZKvRquTPyp2JiNG3XcjQyzSEgqCB" - ], - [ - "9e885d952ad362caeb4efe34a8e91bd2", - "ozone drill grab fiber curtain grace pudding thank cruise elder eight picnic", - "274ddc525802f7c828d8ef7ddbcdc5304e87ac3535913611fbbfa986d0c9e5476c91689f9c8a54fd55bd38606aa6a8595ad213d4c9c9f9aca3fb217069a41028", - "xprv9s21ZrQH143K2oZ9stBYpoaZ2ktHj7jLz7iMqpgg1En8kKFTXJHsjxry1JbKH19YrDTicVwKPehFKTbmaxgVEc5TpHdS1aYhB2s9aFJBeJH" - ], - [ - "6610b25967cdcca9d59875f5cb50b0ea75433311869e930b", - "gravity machine north sort system female filter attitude volume fold club stay feature office ecology stable narrow fog", - "628c3827a8823298ee685db84f55caa34b5cc195a778e52d45f59bcf75aba68e4d7590e101dc414bc1bbd5737666fbbef35d1f1903953b66624f910feef245ac", - "xprv9s21ZrQH143K3uT8eQowUjsxrmsA9YUuQQK1RLqFufzybxD6DH6gPY7NjJ5G3EPHjsWDrs9iivSbmvjc9DQJbJGatfa9pv4MZ3wjr8qWPAK" - ], - [ - "68a79eaca2324873eacc50cb9c6eca8cc68ea5d936f98787c60c7ebc74e6ce7c", - "hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay length", - "64c87cde7e12ecf6704ab95bb1408bef047c22db4cc7491c4271d170a1b213d20b385bc1588d9c7b38f1b39d415665b8a9030c9ec653d75e65f847d8fc1fc440", - "xprv9s21ZrQH143K2XTAhys3pMNcGn261Fi5Ta2Pw8PwaVPhg3D8DWkzWQwjTJfskj8ofb81i9NP2cUNKxwjueJHHMQAnxtivTA75uUFqPFeWzk" - ], - [ - "c0ba5a8e914111210f2bd131f3d5e08d", - "scheme spot photo card baby mountain device kick cradle pact join borrow", - "ea725895aaae8d4c1cf682c1bfd2d358d52ed9f0f0591131b559e2724bb234fca05aa9c02c57407e04ee9dc3b454aa63fbff483a8b11de949624b9f1831a9612", - "xprv9s21ZrQH143K3FperxDp8vFsFycKCRcJGAFmcV7umQmcnMZaLtZRt13QJDsoS5F6oYT6BB4sS6zmTmyQAEkJKxJ7yByDNtRe5asP2jFGhT6" - ], - [ - "6d9be1ee6ebd27a258115aad99b7317b9c8d28b6d76431c3", - "horn tenant knee talent sponsor spell gate clip pulse soap slush warm silver nephew swap uncle crack brave", - "fd579828af3da1d32544ce4db5c73d53fc8acc4ddb1e3b251a31179cdb71e853c56d2fcb11aed39898ce6c34b10b5382772db8796e52837b54468aeb312cfc3d", - "xprv9s21ZrQH143K3R1SfVZZLtVbXEB9ryVxmVtVMsMwmEyEvgXN6Q84LKkLRmf4ST6QrLeBm3jQsb9gx1uo23TS7vo3vAkZGZz71uuLCcywUkt" - ], - [ - "9f6a2878b2520799a44ef18bc7df394e7061a224d2c33cd015b157d746869863", - "panda eyebrow bullet gorilla call smoke muffin taste mesh discover soft ostrich alcohol speed nation flash devote level hobby quick inner drive ghost inside", - "72be8e052fc4919d2adf28d5306b5474b0069df35b02303de8c1729c9538dbb6fc2d731d5f832193cd9fb6aeecbc469594a70e3dd50811b5067f3b88b28c3e8d", - "xprv9s21ZrQH143K2WNnKmssvZYM96VAr47iHUQUTUyUXH3sAGNjhJANddnhw3i3y3pBbRAVk5M5qUGFr4rHbEWwXgX4qrvrceifCYQJbbFDems" - ], - [ - "23db8160a31d3e0dca3688ed941adbf3", - "cat swing flag economy stadium alone churn speed unique patch report train", - "deb5f45449e615feff5640f2e49f933ff51895de3b4381832b3139941c57b59205a42480c52175b6efcffaa58a2503887c1e8b363a707256bdd2b587b46541f5", - "xprv9s21ZrQH143K4G28omGMogEoYgDQuigBo8AFHAGDaJdqQ99QKMQ5J6fYTMfANTJy6xBmhvsNZ1CJzRZ64PWbnTFUn6CDV2FxoMDLXdk95DQ" - ], - [ - "8197a4a47f0425faeaa69deebc05ca29c0a5b5cc76ceacc0", - "light rule cinnamon wrap drastic word pride squirrel upgrade then income fatal apart sustain crack supply proud access", - "4cbdff1ca2db800fd61cae72a57475fdc6bab03e441fd63f96dabd1f183ef5b782925f00105f318309a7e9c3ea6967c7801e46c8a58082674c860a37b93eda02", - "xprv9s21ZrQH143K3wtsvY8L2aZyxkiWULZH4vyQE5XkHTXkmx8gHo6RUEfH3Jyr6NwkJhvano7Xb2o6UqFKWHVo5scE31SGDCAUsgVhiUuUDyh" - ], - [ - "066dca1a2bb7e8a1db2832148ce9933eea0f3ac9548d793112d9a95c9407efad", - "all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform", - "26e975ec644423f4a4c4f4215ef09b4bd7ef924e85d1d17c4cf3f136c2863cf6df0a475045652c57eb5fb41513ca2a2d67722b77e954b4b3fc11f7590449191d", - "xprv9s21ZrQH143K3rEfqSM4QZRVmiMuSWY9wugscmaCjYja3SbUD3KPEB1a7QXJoajyR2T1SiXU7rFVRXMV9XdYVSZe7JoUXdP4SRHTxsT1nzm" - ], - [ - "f30f8c1da665478f49b001d94c5fc452", - "vessel ladder alter error federal sibling chat ability sun glass valve picture", - "2aaa9242daafcee6aa9d7269f17d4efe271e1b9a529178d7dc139cd18747090bf9d60295d0ce74309a78852a9caadf0af48aae1c6253839624076224374bc63f", - "xprv9s21ZrQH143K2QWV9Wn8Vvs6jbqfF1YbTCdURQW9dLFKDovpKaKrqS3SEWsXCu6ZNky9PSAENg6c9AQYHcg4PjopRGGKmdD313ZHszymnps" - ], - [ - "c10ec20dc3cd9f652c7fac2f1230f7a3c828389a14392f05", - "scissors invite lock maple supreme raw rapid void congress muscle digital elegant little brisk hair mango congress clump", - "7b4a10be9d98e6cba265566db7f136718e1398c71cb581e1b2f464cac1ceedf4f3e274dc270003c670ad8d02c4558b2f8e39edea2775c9e232c7cb798b069e88", - "xprv9s21ZrQH143K4aERa2bq7559eMCCEs2QmmqVjUuzfy5eAeDX4mqZffkYwpzGQRE2YEEeLVRoH4CSHxianrFaVnMN2RYaPUZJhJx8S5j6puX" - ], - [ - "f585c11aec520db57dd353c69554b21a89b20fb0650966fa0a9d6f74fd989d8f", - "void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold", - "01f5bced59dec48e362f2c45b5de68b9fd6c92c6634f44d6d40aab69056506f0e35524a518034ddc1192e1dacd32c1ed3eaa3c3b131c88ed8e7e54c49a5d0998", - "xprv9s21ZrQH143K39rnQJknpH1WEPFJrzmAqqasiDcVrNuk926oizzJDDQkdiTvNPr2FYDYzWgiMiC63YmfPAa2oPyNB23r2g7d1yiK6WpqaQS" - ] - ] -} diff --git a/external/libwally-core/src/hex.c b/external/libwally-core/src/hex.c deleted file mode 100644 index 95a50d267..000000000 --- a/external/libwally-core/src/hex.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "internal.h" -#include "ccan/ccan/str/hex/hex.h" - -int wally_hex_from_bytes(const unsigned char *bytes_in, size_t len_in, - char **output) -{ - if (output) - *output = NULL; - - if (!bytes_in || !output) - return WALLY_EINVAL; - - *output = wally_malloc(hex_str_size(len_in)); - if (!*output) - return WALLY_ENOMEM; - - /* Note we ignore the return value as this call cannot fail */ - hex_encode(bytes_in, len_in, *output, hex_str_size(len_in)); - return WALLY_OK; -} - -int wally_hex_to_bytes(const char *hex, - unsigned char *bytes_out, size_t len, size_t *written) -{ - size_t len_in = hex ? strlen(hex) : 0; - - if (written) - *written = 0; - - if (!hex || !bytes_out || !len || len_in & 0x1) - return WALLY_EINVAL; - - if (len < len_in / 2) { - *written = len_in / 2; - return WALLY_OK; /* Not enough room in bytes_out, or empty string */ - } - - len = len_in / 2; /* hex_decode expects exact length */ - if (!hex_decode(hex, len_in, bytes_out, len)) - return WALLY_EINVAL; - - if (written) - *written = len; - - return WALLY_OK; -} diff --git a/external/libwally-core/src/hmac.c b/external/libwally-core/src/hmac.c deleted file mode 100644 index 1983f3b23..000000000 --- a/external/libwally-core/src/hmac.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "internal.h" -#include "hmac.h" -#include -#include -#include -#include - -#define SHA_T sha256 -#define SHA_CTX_MEMBER u32 -#define SHA_PRE(name) sha256 ## name -#define HMAC_FUNCTION hmac_sha256_internal -#define WALLY_HMAC_FUNCTION wally_hmac_sha256 -#include "hmac.inl" - -#undef SHA_T -#define SHA_T sha512 -#undef SHA_CTX_MEMBER -#define SHA_CTX_MEMBER u64 -#undef SHA_PRE -#define SHA_PRE(name) sha512 ## name -#undef HMAC_FUNCTION -#define HMAC_FUNCTION hmac_sha512 -#undef WALLY_HMAC_FUNCTION -#define WALLY_HMAC_FUNCTION wally_hmac_sha512 -#include "hmac.inl" diff --git a/external/libwally-core/src/hmac.h b/external/libwally-core/src/hmac.h deleted file mode 100644 index 12ddb8641..000000000 --- a/external/libwally-core/src/hmac.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef LIBWALLY_HMAC_H -#define LIBWALLY_HMAC_H - -struct sha256; -struct sha512; - -/** - * hmac_sha256_internal - Compute an HMAC using SHA-256 - * - * @sha: Destination for the resulting HMAC. - * @key: The key for the hash - * @key_len: The length of @key in bytes. - * @msg: The message to hash - * @msg_len: The length of @msg in bytes. - */ -void hmac_sha256_internal(struct sha256 *sha, - const unsigned char *key, size_t key_len, - const unsigned char *msg, size_t msg_len); - -/** - * hmac_sha512 - Compute an HMAC using SHA-512 - * - * @sha: Destination for the resulting HMAC. - * @key: The key for the hash - * @key_len: The length of @key in bytes. - * @msg: The message to hash - * @msg_len: The length of @msg in bytes. - */ -void hmac_sha512(struct sha512 *sha, - const unsigned char *key, size_t key_len, - const unsigned char *msg, size_t msg_len); - -#endif /* LIBWALLY_HMAC_H */ diff --git a/external/libwally-core/src/hmac.inl b/external/libwally-core/src/hmac.inl deleted file mode 100644 index a8aad7e37..000000000 --- a/external/libwally-core/src/hmac.inl +++ /dev/null @@ -1,66 +0,0 @@ -/* MIT (BSD) license - see LICENSE file for details */ -/* HMAC code adapted from the Bitcoin project's C++: - * - * src/crypto/hmac_sha512.cpp f914f1a746d7f91951c1da262a4a749dd3ebfa71 - * Copyright (c) 2014 The Bitcoin Core developers - * Distributed under the MIT software license, see the accompanying - * file COPYING or http://www.opensource.org/licenses/mit-license.php. - * - * https://en.wikipedia.org/wiki/Hash-based_message_authentication_code - */ -static void SHA_PRE(_mix)(struct SHA_T *sha, const unsigned char *pad, - const unsigned char *data, size_t data_len) -{ - struct SHA_PRE(_ctx) ctx; - SHA_PRE(_init)(&ctx); - SHA_PRE(_update)(&ctx, pad, sizeof(ctx.buf)); - SHA_PRE(_update)(&ctx, data, data_len); - SHA_PRE(_done)(&ctx, sha); - clear(&ctx, sizeof(ctx)); -} - -void HMAC_FUNCTION(struct SHA_T *sha, - const unsigned char *key, size_t key_len, - const unsigned char *msg, size_t msg_len) -{ - struct SHA_PRE(_ctx) ctx; - unsigned char ipad[sizeof(ctx.buf)]; - unsigned char opad[sizeof(ctx.buf)]; - size_t i; - - clear(ctx.buf.u8, sizeof(ctx.buf)); - - if (key_len <= sizeof(ctx.buf)) - memcpy(ctx.buf.u8, key, key_len); - else - SHA_T((struct SHA_T *)ctx.buf.SHA_CTX_MEMBER, key, key_len); - - for (i = 0; i < sizeof(ctx.buf); ++i) { - opad[i] = ctx.buf.u8[i] ^ 0x5c; - ipad[i] = ctx.buf.u8[i] ^ 0x36; - } - - SHA_PRE(_mix)((struct SHA_T *)ctx.buf.SHA_CTX_MEMBER, ipad, msg, msg_len); - SHA_PRE(_mix)(sha, opad, ctx.buf.u8, sizeof(*sha)); - clear_n(3, &ctx, sizeof(ctx), ipad, sizeof(ipad), opad, sizeof(opad)); -} - -int WALLY_HMAC_FUNCTION(const unsigned char *key, size_t key_len, - const unsigned char *bytes_in, size_t len_in, - unsigned char *bytes_out, size_t len) -{ - struct SHA_T sha; - bool aligned = alignment_ok(bytes_out, sizeof(sha.u.SHA_CTX_MEMBER)); - struct SHA_T *sha_p = aligned ? (struct SHA_T *)bytes_out : &sha; - - if (!key || !key_len || !bytes_in || !len_in || - !bytes_out || len != sizeof(struct SHA_T)) - return WALLY_EINVAL; - - HMAC_FUNCTION(sha_p, key, key_len, bytes_in, len_in); - if (!aligned) { - memcpy(bytes_out, sha_p, sizeof(*sha_p)); - clear(sha_p, sizeof(*sha_p)); - } - return WALLY_OK; -} diff --git a/external/libwally-core/src/internal.c b/external/libwally-core/src/internal.c deleted file mode 100644 index 7fa12ff0f..000000000 --- a/external/libwally-core/src/internal.c +++ /dev/null @@ -1,252 +0,0 @@ -#include "internal.h" -#include -#include "ccan/ccan/build_assert/build_assert.h" -#include "ccan/ccan/crypto/ripemd160/ripemd160.h" -#include "ccan/ccan/crypto/sha256/sha256.h" -#include "ccan/ccan/crypto/sha512/sha512.h" -#include -#include - -#undef malloc -#undef free - -/* Caller is responsible for thread safety */ -static secp256k1_context *global_ctx = NULL; - -const secp256k1_context *secp_ctx(void) -{ - const uint32_t flags = SECP256K1_CONTEXT_VERIFY | SECP256K1_CONTEXT_SIGN; - - if (!global_ctx) - global_ctx = secp256k1_context_create(flags); - - return global_ctx; -} - - -int wally_secp_randomize(const unsigned char *bytes_in, size_t len_in) -{ - secp256k1_context *ctx; - - if (!bytes_in || len_in != WALLY_SECP_RANDOMISE_LEN) - return WALLY_EINVAL; - - if (!(ctx = (secp256k1_context *)secp_ctx())) - return WALLY_ENOMEM; - - if (!secp256k1_context_randomize(ctx, bytes_in)) - return WALLY_ERROR; - - return WALLY_OK; -} - -int wally_free_string(char *str) -{ - if (!str) - return WALLY_EINVAL; - clear(str, strlen(str)); - wally_free(str); - return WALLY_OK; -} - -int wally_bzero(void *bytes, size_t len) -{ - if (!bytes) - return WALLY_EINVAL; - clear(bytes, len); - return WALLY_OK; -} - -int wally_sha256(const unsigned char *bytes_in, size_t len_in, - unsigned char *bytes_out, size_t len) -{ - struct sha256 sha; - bool aligned = alignment_ok(bytes_out, sizeof(sha.u.u32)); - - if (!bytes_in || !bytes_out || len != SHA256_LEN) - return WALLY_EINVAL; - - sha256(aligned ? (struct sha256 *)bytes_out : &sha, bytes_in, len_in); - if (!aligned) { - memcpy(bytes_out, &sha, sizeof(sha)); - clear(&sha, sizeof(sha)); - } - return WALLY_OK; -} - -int wally_sha256d(const unsigned char *bytes_in, size_t len_in, - unsigned char *bytes_out, size_t len) -{ - struct sha256 sha_1, sha_2; - bool aligned = alignment_ok(bytes_out, sizeof(sha_1.u.u32)); - - if (!bytes_in || !bytes_out || len != SHA256_LEN) - return WALLY_EINVAL; - - sha256(&sha_1, bytes_in, len_in); - sha256(aligned ? (struct sha256 *)bytes_out : &sha_2, &sha_1, sizeof(sha_1)); - if (!aligned) { - memcpy(bytes_out, &sha_2, sizeof(sha_2)); - clear(&sha_2, sizeof(sha_2)); - } - clear(&sha_1, sizeof(sha_1)); - return WALLY_OK; -} - -int wally_sha512(const unsigned char *bytes_in, size_t len_in, - unsigned char *bytes_out, size_t len) -{ - struct sha512 sha; - bool aligned = alignment_ok(bytes_out, sizeof(sha.u.u64)); - - if (!bytes_in || !bytes_out || len != SHA512_LEN) - return WALLY_EINVAL; - - sha512(aligned ? (struct sha512 *)bytes_out : &sha, bytes_in, len_in); - if (!aligned) { - memcpy(bytes_out, &sha, sizeof(sha)); - clear(&sha, sizeof(sha)); - } - return WALLY_OK; -} - -int wally_hash160(const unsigned char *bytes_in, size_t len_in, - unsigned char *bytes_out, size_t len) -{ - struct sha256 sha; - struct ripemd160 ripemd; - bool aligned = alignment_ok(bytes_out, sizeof(ripemd.u.u32)); - - if (!bytes_in || !bytes_out || len != HASH160_LEN) - return WALLY_EINVAL; - - BUILD_ASSERT(sizeof(ripemd) == HASH160_LEN); - - sha256(&sha, bytes_in, len_in); - ripemd160(aligned ? (struct ripemd160 *)bytes_out : &ripemd, &sha, sizeof(sha)); - if (!aligned) { - memcpy(bytes_out, &ripemd, sizeof(ripemd)); - clear(&ripemd, sizeof(ripemd)); - } - clear(&sha, sizeof(sha)); - return WALLY_OK; -} - -#if 0 -/* This idea is taken from libressl's explicit_bzero. - * Use a weak symbol to force the compiler to consider dest as being read, - * since it can't know what any interposed function may read. Not ideal for - * us in case someone includes a __clear_fn symbol in a third party library, - * since it gets called with an address right in the middle of interesting - * things we are clearing out (even if the actual block is zeroed). - */ -__attribute__ ((visibility ("default"))) __attribute__((weak)) void __clear_fn(void *dest, size_t len); -#endif - -/* Our implementation of secure clearing uses a variadic function. - * This appears sufficient to prevent the compiler detecting that - * the memory is not read after being zeroed and eliminating the - * call. - */ -void clear_n(unsigned int count, ...) -{ - va_list args; - unsigned int i; - - va_start(args, count); - - for (i = 0; i < count; ++i) { - void *dest = va_arg(args, void *); - size_t len = va_arg(args, size_t); -#ifdef HAVE_MEMSET_S - memset_s(dest, len, 0, len); -#else - memset(dest, 0, len); -#endif -#if 0 - /* This is used by boringssl to prevent memset from being elided. It - * works by forcing a memory barrier and so can be slow. - */ - __asm__ __volatile__ ("" : : "r" (dest) : "memory"); -#endif -#if 0 - /* Continuing libressl's implementation. The check here allows the - * implementation to remain undefined and thus a buggy compiler - * cannot see that it does nothing and elide it erroneously. - */ - if (__clear_fn) - __clear_fn(dest, len); -#endif - } - - va_end(args); -} - -static void *wally_internal_malloc(size_t size) -{ - return malloc(size); -} - -static void wally_internal_free(void *ptr) -{ - free(ptr); -} - -static int wally_internal_ec_nonce_fn(unsigned char *nonce32, - const unsigned char *msg32, const unsigned char *key32, - const unsigned char *algo16, void *data, unsigned int attempt) -{ - return secp256k1_nonce_function_default(nonce32, msg32, key32, algo16, data, attempt); -} - -static struct wally_operations _ops = { - wally_internal_malloc, - wally_internal_free, - wally_internal_ec_nonce_fn -}; - -void *wally_malloc(size_t size) -{ - return _ops.malloc_fn(size); -} - -void wally_free(void *ptr) -{ - _ops.free_fn(ptr); -} - -char *wally_strdup(const char *str) -{ - size_t len = strlen(str) + 1; - char *new_str = (char *)wally_malloc(len); - if (new_str) - memcpy(new_str, str, len); /* Copies terminating nul */ - return new_str; -} - -const struct wally_operations *wally_ops(void) -{ - return &_ops; -} - -int wally_get_operations(struct wally_operations *output) -{ - if (!output) - return WALLY_EINVAL; - memcpy(output, &_ops, sizeof(_ops)); - return WALLY_OK; -} - -int wally_set_operations(const struct wally_operations *ops) -{ - if (!ops) - return WALLY_EINVAL; - memcpy(&_ops, ops, sizeof(_ops)); - return WALLY_OK; -} - -#ifdef __ANDROID__ -#define malloc(size) wally_malloc(size) -#define free(ptr) wally_free(ptr) -#include "cpufeatures/cpu-features.c" -#endif diff --git a/external/libwally-core/src/internal.h b/external/libwally-core/src/internal.h deleted file mode 100644 index 529c26cdb..000000000 --- a/external/libwally-core/src/internal.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef LIBWALLY_INTERNAL_H -#define LIBWALLY_INTERNAL_H - -#include -#include "secp256k1/include/secp256k1.h" -#include -#include - -/* Fetch an internal secp context */ -const secp256k1_context *secp_ctx(void); -#define secp256k1_context_destroy(c) _do_not_destroy_shared_ctx_pointers(c) - -#define pubkey_create secp256k1_ec_pubkey_create -#define pubkey_parse secp256k1_ec_pubkey_parse -#define pubkey_tweak_add secp256k1_ec_pubkey_tweak_add -#define pubkey_serialize secp256k1_ec_pubkey_serialize -#define privkey_tweak_add secp256k1_ec_privkey_tweak_add - -#define PUBKEY_COMPRESSED SECP256K1_EC_COMPRESSED -#define PUBKEY_UNCOMPRESSED SECP256K1_EC_UNCOMPRESSED - - -inline static void clear(void *p, size_t len) -{ - clear_n(1, p, len); -} - -/* Fetch our internal operations function pointers */ -const struct wally_operations *wally_ops(void); - -void *wally_malloc(size_t size); -void wally_free(void *ptr); -char *wally_strdup(const char *str); - -#define malloc(size) __use_wally_malloc_internally__ -#define free(ptr) __use_wally_free_internally__ -#ifdef strdup -#undef strdup -#endif -#define strdup(ptr) __use_wally_strdup_internally__ - -#endif /* LIBWALLY_INTERNAL_H */ - diff --git a/external/libwally-core/src/mnemonic.c b/external/libwally-core/src/mnemonic.c deleted file mode 100644 index 18ef77f70..000000000 --- a/external/libwally-core/src/mnemonic.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "internal.h" -#include "mnemonic.h" -#include "wordlist.h" - -#define U8_AT(bytes, pos) (bytes)[(pos) / 8u] -#define U8_MASK(pos) (1u << (7u - (pos) % 8u)) - -/* Get n'th value (of w->bits length) from bytes */ -static size_t extract_index(size_t bits, const unsigned char *bytes_in, size_t n) -{ - size_t pos, end, value; - for (pos = n * bits, end = pos + bits, value = 0; pos < end; ++pos) - value = (value << 1u) | !!(U8_AT(bytes_in, pos) & U8_MASK(pos)); - return value; -} - -/* Store n'th value (of w->bits length) to bytes - * Assumes: 1) the bits we are writing to are zero - * 2) value fits within w->bits - */ -static void store_index(size_t bits, unsigned char *bytes_out, size_t n, size_t value) -{ - size_t i, pos; - for (pos = n * bits, i = 0; i < bits; ++i, ++pos) - if (value & (1u << (bits - i - 1u))) - U8_AT(bytes_out, pos) |= U8_MASK(pos); -} - -char *mnemonic_from_bytes(const struct words *w, const unsigned char *bytes_in, size_t len_in) -{ - size_t total_bits = len_in * 8u; /* bits in 'bytes' */ - size_t total_mnemonics = total_bits / w->bits; /* Mnemonics in 'bytes' */ - size_t i, str_len = 0; - char *str = NULL; - - /* Compute length of result */ - for (i = 0; i < total_mnemonics; ++i) { - size_t idx = extract_index(w->bits, bytes_in, i); - size_t mnemonic_len = strlen(w->indices[idx]); - - str_len += mnemonic_len + 1; /* +1 for following separator or NUL */ - } - - /* Allocate and fill result */ - if (str_len && (str = wally_malloc(str_len))) { - char *out = str; - - for (i = 0; i < total_mnemonics; ++i) { - size_t idx = extract_index(w->bits, bytes_in, i); - size_t mnemonic_len = strlen(w->indices[idx]); - - memcpy(out, w->indices[idx], mnemonic_len); - out[mnemonic_len] = ' '; /* separator */ - out += mnemonic_len + 1; - } - str[str_len - 1] = '\0'; /* Overwrite the last separator with NUL */ - } - - return str; -} - -int mnemonic_to_bytes(const struct words *w, const char *mnemonic, - unsigned char *bytes_out, size_t len, size_t *written) -{ - struct words *mnemonic_w = wordlist_init(mnemonic); - size_t i; - - if (written) - *written = 0; - - if (!mnemonic_w) - return WALLY_ENOMEM; - - if (!w || !bytes_out || !len) - return WALLY_EINVAL; - - if ((mnemonic_w->len * w->bits + 7u) / 8u > len) - goto cleanup; /* Return the length we would have written */ - - clear(bytes_out, len); - - for (i = 0; i < mnemonic_w->len; ++i) { - size_t idx = wordlist_lookup_word(w, mnemonic_w->indices[i]); - if (!idx) { - wordlist_free(mnemonic_w); - clear(bytes_out, len); - return WALLY_EINVAL; - } - store_index(w->bits, bytes_out, i, idx - 1); - } - -cleanup: - if (written) - *written = (mnemonic_w->len * w->bits + 7u) / 8u; - wordlist_free(mnemonic_w); - return WALLY_OK; -} diff --git a/external/libwally-core/src/mnemonic.h b/external/libwally-core/src/mnemonic.h deleted file mode 100644 index 492823660..000000000 --- a/external/libwally-core/src/mnemonic.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef LIBWALLY_MNEMONIC_H -#define LIBWALLY_MNEMONIC_H - -struct words; - -/** - * Return a mnemonic representation of a block of bytes. - * - * @w: List of words. - * @bytes_in: Bytes to convert to a mnemonic sentence. - * @len: The length of @bytes_in in bytes. - * - * @bytes_in must be an even multiple of the number of bits in the wordlist used. - */ -char *mnemonic_from_bytes( - const struct words *w, - const unsigned char *bytes_in, - size_t len); - -/** - * Convert a mnemonic representation into a block of bytes. - * - * @w: List of words. - * @mnemonic: Mnemonic sentence to store. - * @bytes_out: Where to store the converted representation. - * @len: The length of @bytes_out in bytes. - * @written: Destination for the number of bytes written. - */ -int mnemonic_to_bytes( - const struct words *w, - const char *mnemonic, - unsigned char *bytes_out, - size_t len, - size_t *written); - -#endif /* LIBWALLY_MNEMONIC_H */ diff --git a/external/libwally-core/src/pbkdf2.c b/external/libwally-core/src/pbkdf2.c deleted file mode 100644 index 795d55766..000000000 --- a/external/libwally-core/src/pbkdf2.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "internal.h" -#include "hmac.h" -#include "ccan/ccan/endian/endian.h" -#include "ccan/ccan/crypto/sha256/sha256.h" -#include "ccan/ccan/crypto/sha512/sha512.h" -#include "ccan/ccan/build_assert/build_assert.h" -#include -#include - -#define SHA_T sha256 -#define SHA_ALIGN_T uint32_t -#define SHA_MEM u32 -#define SHA_POST(name) name ## sha256_internal -#define PBKDF2_HMAC_SHA_LEN PBKDF2_HMAC_SHA256_LEN -#include "pbkdf2.inl" - -#undef SHA_T -#define SHA_T sha512 -#undef SHA_ALIGN_T -#define SHA_ALIGN_T uint64_t -#undef SHA_MEM -#define SHA_MEM u64 -#undef SHA_POST -#define SHA_POST(name) name ## sha512 -#undef PBKDF2_HMAC_SHA_LEN -#define PBKDF2_HMAC_SHA_LEN PBKDF2_HMAC_SHA512_LEN -#include "pbkdf2.inl" - diff --git a/external/libwally-core/src/pbkdf2.inl b/external/libwally-core/src/pbkdf2.inl deleted file mode 100644 index 8b1e71720..000000000 --- a/external/libwally-core/src/pbkdf2.inl +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This is a heavily modified version of openBSDs pkcs5_pbkdf2 from - * libutil/pkcs5_pbkdf2.c, whose copyright appears here: - * - * Copyright (c) 2008 Damien Bergamini - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - */ - -int SHA_POST(wally_pbkdf2_hmac_)(const unsigned char *pass, size_t pass_len, - unsigned char *salt_in_out, size_t salt_len, - uint32_t flags, uint32_t cost, - unsigned char *bytes_out, size_t len) -{ - unsigned char *tmp_salt = NULL; - struct SHA_T d1, d2, *sha_cp = &d2; - size_t n, c, j; - - BUILD_ASSERT(sizeof(beint32_t) == PBKDF2_HMAC_EXTRA_LEN); - BUILD_ASSERT(sizeof(d1) == PBKDF2_HMAC_SHA_LEN); - - if (!bytes_out || !len) - return WALLY_EINVAL; - - if (flags & ~PBKDF2_HMAC_FLAG_BLOCK_RESERVED) - return WALLY_EINVAL; /* Invalid flag */ - - if (flags & PBKDF2_HMAC_FLAG_BLOCK_RESERVED && salt_len < PBKDF2_HMAC_EXTRA_LEN) - return WALLY_EINVAL; /* No room for block appending */ - - if (!len || len % PBKDF2_HMAC_SHA_LEN) - return WALLY_EINVAL; - - if (!(flags & PBKDF2_HMAC_FLAG_BLOCK_RESERVED)) { - tmp_salt = wally_malloc(salt_len + PBKDF2_HMAC_EXTRA_LEN); - if (!tmp_salt) - return WALLY_ENOMEM; - memcpy(tmp_salt, salt_in_out, salt_len); - salt_in_out = tmp_salt; - salt_len += PBKDF2_HMAC_EXTRA_LEN; - } - - /* If bytes out is suitably aligned, we can work on it directly */ - if (alignment_ok(bytes_out, sizeof(SHA_ALIGN_T))) - sha_cp = (struct SHA_T *)bytes_out; - - for (n = 0; n < len / PBKDF2_HMAC_SHA_LEN; ++n) { - beint32_t block = cpu_to_be32(n + 1); /* Block number */ - - memcpy(salt_in_out + salt_len - sizeof(block), &block, sizeof(block)); - SHA_POST(hmac_)(&d1, pass, pass_len, salt_in_out, salt_len); - memcpy(sha_cp, &d1, sizeof(d1)); - - for (c = 0; cost && c < cost - 1; ++c) { - SHA_POST(hmac_)(&d1, pass, pass_len, d1.u.u8, sizeof(d1)); - for (j = 0; j < sizeof(d1.u.SHA_MEM)/sizeof(d1.u.SHA_MEM[0]); ++j) - sha_cp->u.SHA_MEM[j] ^= d1.u.SHA_MEM[j]; - } - if (sha_cp == &d2) - memcpy(bytes_out, sha_cp, sizeof(*sha_cp)); - else - ++sha_cp; - - bytes_out += PBKDF2_HMAC_SHA_LEN; - } - - clear_n(2, &d1, sizeof(d1), &d2, sizeof(d2)); - if (tmp_salt) { - clear(tmp_salt, salt_len); - wally_free(tmp_salt); - } - return WALLY_OK; -} diff --git a/external/libwally-core/src/scrypt.c b/external/libwally-core/src/scrypt.c deleted file mode 100644 index 260c64c08..000000000 --- a/external/libwally-core/src/scrypt.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "internal.h" -#include -#include -#include "hmac.h" -#include "ccan/ccan/endian/endian.h" - -/* Use scrypts internal malloc/free */ -#undef malloc -#undef free - -/* Implement functions required by the scrypt core */ -static uint32_t le32dec(const void *p) -{ - leint32_t tmp; - memcpy(&tmp, p, sizeof(tmp)); - return le32_to_cpu(tmp); -} - -static void le32enc(void *p, uint32_t value) -{ - leint32_t tmp = cpu_to_le32(value); - memcpy(p, &tmp, sizeof(tmp)); -} - -static void PBKDF2_SHA256(const unsigned char *pass, size_t pass_len, - const unsigned char *salt, size_t salt_len, - uint64_t cost, - unsigned char *bytes_out, size_t len) -{ - const uint32_t flags = 0; - wally_pbkdf2_hmac_sha256(pass, pass_len, (unsigned char *)salt, salt_len, - flags, (uint32_t)cost, bytes_out, len); -} - -/* Include a suitable smix function/functions */ -#if defined(__ARM_NEON__) || defined(__ARM_NEON) -# include -# include "scrypt/crypto_scrypt_smix_neon.c" -# if !defined(__ANDROID__) -/* No way to check for support, assume Neon present */ -# define crypto_scrypt_smix_fn crypto_scrypt_smix_neon -# else -/* On Android, detect Neon support at runtime */ -# include "cpufeatures/cpu-features.h" -# include "scrypt/crypto_scrypt_smix.c" -static void -crypto_scrypt_smix_fn(uint8_t *B, size_t r, uint64_t N, void *_V, void *XY) -{ - if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) - crypto_scrypt_smix_neon(B, r, N, _V, XY); - else - crypto_scrypt_smix_c(B, r, N, _V, XY); -} -# endif -#elif defined(__SSE2__) -/* Use the SSE2 version */ -# include "scrypt/crypto_scrypt_smix_sse2.c" -# define crypto_scrypt_smix_fn crypto_scrypt_smix_sse2 -#else -/* Use the C version */ -# include "scrypt/crypto_scrypt_smix.c" -# define crypto_scrypt_smix_fn crypto_scrypt_smix_c -#endif - -#include "scrypt/crypto_scrypt.c" - -/* Our scrypt wrapper. */ -int wally_scrypt(const unsigned char *pass, size_t pass_len, - const unsigned char *salt, size_t salt_len, - uint32_t cost, uint32_t block_size, uint32_t parallelism, - unsigned char *bytes_out, size_t len) -{ - return _crypto_scrypt(pass, pass_len, salt, salt_len, - cost, block_size, parallelism, - bytes_out, len, crypto_scrypt_smix_fn); -} diff --git a/external/libwally-core/src/scrypt/crypto_scrypt.c b/external/libwally-core/src/scrypt/crypto_scrypt.c deleted file mode 100644 index ad103d3ff..000000000 --- a/external/libwally-core/src/scrypt/crypto_scrypt.c +++ /dev/null @@ -1,274 +0,0 @@ -/*- - * Copyright 2009 Colin Percival - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file was originally written by Colin Percival as part of the Tarsnap - * online backup system. - */ -#if 0 -#include "scrypt_platform.h" -#endif - -#include -#include - -#include -#include -#include -#include -#include - -#if 0 -#include "cpusupport.h" -#include "sha256.h" -#include "warnp.h" - -#include "crypto_scrypt_smix.h" -#include "crypto_scrypt_smix_sse2.h" - -#include "crypto_scrypt.h" - -static void (*smix_func)(uint8_t *, size_t, uint64_t, void *, void *) = NULL; -#endif - -/** - * _crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen, smix): - * Perform the requested scrypt computation, using ${smix} as the smix routine. - */ -static int -_crypto_scrypt(const uint8_t * passwd, size_t passwdlen, - const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t _r, uint32_t _p, - uint8_t * buf, size_t buflen, - void (*smix)(uint8_t *, size_t, uint64_t, void *, void *)) -{ - void * B0, * V0, * XY0; - uint8_t * B; - uint32_t * V; - uint32_t * XY; - size_t r = _r, p = _p; - uint32_t i; - int ret = 0; - - /* Sanity-check parameters. */ -#if SIZE_MAX > UINT32_MAX - if (buflen > (((uint64_t)(1) << 32) - 1) * 32) { - ret = WALLY_EINVAL; - goto err0; - } -#endif - if ((uint64_t)(r) * (uint64_t)(p) >= (1 << 30)) { - ret = WALLY_EINVAL; - goto err0; - } - if (((N & (N - 1)) != 0) || (N < 2)) { - ret = WALLY_EINVAL; - goto err0; - } - if ((r > SIZE_MAX / 128 / p) || -#if SIZE_MAX / 256 <= UINT32_MAX - (r > (SIZE_MAX - 64) / 256) || -#endif - (N > SIZE_MAX / 128 / r)) { - ret = WALLY_EINVAL; - goto err0; - } - - /* Allocate memory. */ -#ifdef HAVE_POSIX_MEMALIGN - if ((errno = posix_memalign(&B0, 64, 128 * r * p)) != 0) { - ret = WALLY_ENOMEM; - goto err0; - } - B = (uint8_t *)(B0); - if ((errno = posix_memalign(&XY0, 64, 256 * r + 64)) != 0) { - ret = WALLY_ENOMEM; - goto err1; - } - XY = (uint32_t *)(XY0); -#if !defined(MAP_ANON) || !defined(HAVE_MMAP) - if ((errno = posix_memalign(&V0, 64, 128 * r * N)) != 0) { - ret = WALLY_ENOMEM; - goto err2; - } - V = (uint32_t *)(V0); -#endif -#else - if ((B0 = malloc(128 * r * p + 63)) == NULL) { - ret = WALLY_ENOMEM; - goto err0; - } - B = (uint8_t *)(((uintptr_t)(B0) + 63) & ~ (uintptr_t)(63)); - if ((XY0 = malloc(256 * r + 64 + 63)) == NULL) { - ret = WALLY_ENOMEM; - goto err1; - } - XY = (uint32_t *)(((uintptr_t)(XY0) + 63) & ~ (uintptr_t)(63)); -#if !defined(MAP_ANON) || !defined(HAVE_MMAP) - if ((V0 = malloc(128 * r * N + 63)) == NULL) { - ret = WALLY_ENOMEM; - goto err2; - } - V = (uint32_t *)(((uintptr_t)(V0) + 63) & ~ (uintptr_t)(63)); -#endif -#endif -#if defined(MAP_ANON) && defined(HAVE_MMAP) - if ((V0 = mmap(NULL, 128 * r * N, PROT_READ | PROT_WRITE, -#ifdef MAP_NOCORE - MAP_ANON | MAP_PRIVATE | MAP_NOCORE, -#else - MAP_ANON | MAP_PRIVATE, -#endif - -1, 0)) == MAP_FAILED) { - ret = WALLY_ENOMEM; - goto err2; - } - V = (uint32_t *)(V0); -#endif - - /* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */ - PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, p * 128 * r); - - /* 2: for i = 0 to p - 1 do */ - for (i = 0; i < p; i++) { - /* 3: B_i <-- MF(B_i, N) */ - (smix)(&B[i * 128 * r], r, N, V, XY); - } - - /* 5: DK <-- PBKDF2(P, B, 1, dkLen) */ - PBKDF2_SHA256(passwd, passwdlen, B, p * 128 * r, 1, buf, buflen); - - /* Free memory. */ -#if defined(MAP_ANON) && defined(HAVE_MMAP) - if (munmap(V0, 128 * r * N)) { - ret = WALLY_ENOMEM; - goto err2; - } -#else - free(V0); -#endif - free(XY0); - free(B0); - - /* Success! */ - return (0); - -err2: - free(XY0); -err1: - free(B0); -err0: - /* Failure! */ - return ret; -} - -#if 0 -#define TESTLEN 64 -static struct scrypt_test { - const char * passwd; - const char * salt; - uint64_t N; - uint32_t r; - uint32_t p; - uint8_t result[TESTLEN]; -} testcase = { - .passwd = "pleaseletmein", - .salt = "SodiumChloride", - .N = 16, - .r = 8, - .p = 1, - .result = { - 0x25, 0xa9, 0xfa, 0x20, 0x7f, 0x87, 0xca, 0x09, - 0xa4, 0xef, 0x8b, 0x9f, 0x77, 0x7a, 0xca, 0x16, - 0xbe, 0xb7, 0x84, 0xae, 0x18, 0x30, 0xbf, 0xbf, - 0xd3, 0x83, 0x25, 0xaa, 0xbb, 0x93, 0x77, 0xdf, - 0x1b, 0xa7, 0x84, 0xd7, 0x46, 0xea, 0x27, 0x3b, - 0xf5, 0x16, 0xa4, 0x6f, 0xbf, 0xac, 0xf5, 0x11, - 0xc5, 0xbe, 0xba, 0x4c, 0x4a, 0xb3, 0xac, 0xc7, - 0xfa, 0x6f, 0x46, 0x0b, 0x6c, 0x0f, 0x47, 0x7b, - } -}; - -static int -testsmix(void (*smix)(uint8_t *, size_t, uint64_t, void *, void *)) -{ - uint8_t hbuf[TESTLEN]; - - /* Perform the computation. */ - if (_crypto_scrypt( - (const uint8_t *)testcase.passwd, strlen(testcase.passwd), - (const uint8_t *)testcase.salt, strlen(testcase.salt), - testcase.N, testcase.r, testcase.p, hbuf, TESTLEN, smix)) - return (-1); - - /* Does it match? */ - return (memcmp(testcase.result, hbuf, TESTLEN)); -} - -static void -selectsmix(void) -{ - -#ifdef CPUSUPPORT_X86_SSE2 - /* If we're running on an SSE2-capable CPU, try that code. */ - if (cpusupport_x86_sse2()) { - /* If SSE2ized smix works, use it. */ - if (!testsmix(crypto_scrypt_smix_sse2)) { - smix_func = crypto_scrypt_smix_sse2; - return; - } - warn0("Disabling broken SSE2 scrypt support - please report bug!"); - } -#endif - - /* If generic smix works, use it. */ - if (!testsmix(crypto_scrypt_smix)) { - smix_func = crypto_scrypt_smix; - return; - } - warn0("Generic scrypt code is broken - please report bug!"); - - /* If we get here, something really bad happened. */ - abort(); -} - -/** - * crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen): - * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r, - * p, buflen) and write the result into buf. The parameters r, p, and buflen - * must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N - * must be a power of 2 greater than 1. - * - * Return 0 on success; or -1 on error. - */ -int -crypto_scrypt(const uint8_t * passwd, size_t passwdlen, - const uint8_t * salt, size_t saltlen, uint64_t N, uint32_t _r, uint32_t _p, - uint8_t * buf, size_t buflen) -{ - if (smix_func == NULL) - selectsmix(); - return (_crypto_scrypt(passwd, passwdlen, salt, saltlen, N, _r, _p, - buf, buflen, smix_func)); -} -#endif diff --git a/external/libwally-core/src/scrypt/crypto_scrypt_smix.c b/external/libwally-core/src/scrypt/crypto_scrypt_smix.c deleted file mode 100644 index 1098e9630..000000000 --- a/external/libwally-core/src/scrypt/crypto_scrypt_smix.c +++ /dev/null @@ -1,217 +0,0 @@ -/*- - * Copyright 2009 Colin Percival - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file was originally written by Colin Percival as part of the Tarsnap - * online backup system. - */ -#include -#include - -#if 0 -#include "sysendian.h" - -#include "crypto_scrypt_smix.h" - -static void blkcpy(void *, const void *, size_t); -static void blkxor(void *, const void *, size_t); -static void salsa20_8(uint32_t[16]); -static void blockmix_salsa8(const uint32_t *, uint32_t *, uint32_t *, size_t); -static uint64_t integerify(const void *, size_t); -#endif - -static void -blkcpy(void * dest, const void * src, size_t len) -{ - size_t * D = dest; - const size_t * S = src; - size_t L = len / sizeof(size_t); - size_t i; - - for (i = 0; i < L; i++) - D[i] = S[i]; -} - -static void -blkxor(void * dest, const void * src, size_t len) -{ - size_t * D = dest; - const size_t * S = src; - size_t L = len / sizeof(size_t); - size_t i; - - for (i = 0; i < L; i++) - D[i] ^= S[i]; -} - -/** - * salsa20_8(B): - * Apply the salsa20/8 core to the provided block. - */ -static void -salsa20_8(uint32_t B[16]) -{ - uint32_t x[16]; - size_t i; - - blkcpy(x, B, 64); - for (i = 0; i < 8; i += 2) { -#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b)))) - /* Operate on columns. */ - x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9); - x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18); - - x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9); - x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18); - - x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9); - x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18); - - x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9); - x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18); - - /* Operate on rows. */ - x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9); - x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18); - - x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9); - x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18); - - x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9); - x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18); - - x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9); - x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18); -#undef R - } - for (i = 0; i < 16; i++) - B[i] += x[i]; -} - -/** - * blockmix_salsa8(Bin, Bout, X, r): - * Compute Bout = BlockMix_{salsa20/8, r}(Bin). The input Bin must be 128r - * bytes in length; the output Bout must also be the same size. The - * temporary space X must be 64 bytes. - */ -static void -blockmix_salsa8(const uint32_t * Bin, uint32_t * Bout, uint32_t * X, size_t r) -{ - size_t i; - - /* 1: X <-- B_{2r - 1} */ - blkcpy(X, &Bin[(2 * r - 1) * 16], 64); - - /* 2: for i = 0 to 2r - 1 do */ - for (i = 0; i < 2 * r; i += 2) { - /* 3: X <-- H(X \xor B_i) */ - blkxor(X, &Bin[i * 16], 64); - salsa20_8(X); - - /* 4: Y_i <-- X */ - /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ - blkcpy(&Bout[i * 8], X, 64); - - /* 3: X <-- H(X \xor B_i) */ - blkxor(X, &Bin[i * 16 + 16], 64); - salsa20_8(X); - - /* 4: Y_i <-- X */ - /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ - blkcpy(&Bout[i * 8 + r * 16], X, 64); - } -} - -/** - * integerify(B, r): - * Return the result of parsing B_{2r-1} as a little-endian integer. - */ -static uint64_t -integerify(const void * B, size_t r) -{ - const uint32_t * X = (const void *)((uintptr_t)(B) + (2 * r - 1) * 64); - - /* Only return the lower 32 bits since N cannot be > 2^32 */ - return *X; -} - -/** - * crypto_scrypt_smix(B, r, N, V, XY): - * Compute B = SMix_r(B, N). The input B must be 128r bytes in length; - * the temporary storage V must be 128rN bytes in length; the temporary - * storage XY must be 256r + 64 bytes in length. The value N must be a - * power of 2 greater than 1. The arrays B, V, and XY must be aligned to a - * multiple of 64 bytes. - */ -static void -crypto_scrypt_smix_c(uint8_t * B, size_t r, uint64_t N, void * _V, void * XY) -{ - uint32_t * X = XY; - uint32_t * Y = (void *)((uint8_t *)(XY) + 128 * r); - uint32_t * Z = (void *)((uint8_t *)(XY) + 256 * r); - uint32_t * V = _V; - uint64_t i; - uint64_t j; - size_t k; - - /* 1: X <-- B */ - for (k = 0; k < 32 * r; k++) - X[k] = le32dec(&B[4 * k]); - - /* 2: for i = 0 to N - 1 do */ - for (i = 0; i < N; i += 2) { - /* 3: V_i <-- X */ - blkcpy(&V[i * (32 * r)], X, 128 * r); - - /* 4: X <-- H(X) */ - blockmix_salsa8(X, Y, Z, r); - - /* 3: V_i <-- X */ - blkcpy(&V[(i + 1) * (32 * r)], Y, 128 * r); - - /* 4: X <-- H(X) */ - blockmix_salsa8(Y, X, Z, r); - } - - /* 6: for i = 0 to N - 1 do */ - for (i = 0; i < N; i += 2) { - /* 7: j <-- Integerify(X) mod N */ - j = integerify(X, r) & (N - 1); - - /* 8: X <-- H(X \xor V_j) */ - blkxor(X, &V[j * (32 * r)], 128 * r); - blockmix_salsa8(X, Y, Z, r); - - /* 7: j <-- Integerify(X) mod N */ - j = integerify(Y, r) & (N - 1); - - /* 8: X <-- H(X \xor V_j) */ - blkxor(Y, &V[j * (32 * r)], 128 * r); - blockmix_salsa8(Y, X, Z, r); - } - - /* 10: B' <-- X */ - for (k = 0; k < 32 * r; k++) - le32enc(&B[4 * k], X[k]); -} diff --git a/external/libwally-core/src/scrypt/crypto_scrypt_smix_neon.c b/external/libwally-core/src/scrypt/crypto_scrypt_smix_neon.c deleted file mode 100644 index eb863163a..000000000 --- a/external/libwally-core/src/scrypt/crypto_scrypt_smix_neon.c +++ /dev/null @@ -1,266 +0,0 @@ -/*- - * Copyright 2009 Colin Percival - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file was originally written by Colin Percival as part of the Tarsnap - * online backup system. - */ -#if 0 -#include "scrypt_platform.h" -#include -#include -#include -#include -#include -#include -#ifdef USE_OPENSSL_PBKDF2 -#include -#else -#include "sha256.h" -#endif -#include "sysendian.h" -#include "crypto_scrypt.h" -#include "crypto_scrypt-neon-salsa208.h" -static void blkcpy(void *, void *, size_t); -static void blkxor(void *, void *, size_t); -void crypto_core_salsa208_armneon2(void *); -static void blockmix_salsa8(uint8x16_t *, uint8x16_t *, uint8x16_t *, size_t); -static uint64_t integerify(void *, size_t); -static void smix(uint8_t *, size_t, uint64_t, void *, void *); -#endif - -static void -neon_blkcpy(void * dest, void * src, size_t len) -{ - uint8x16_t * D = dest; - uint8x16_t * S = src; - size_t L = len / 16; - size_t i; - for (i = 0; i < L; i++) - D[i] = S[i]; -} -static void -neon_blkxor(void * dest, void * src, size_t len) -{ - uint8x16_t * D = dest; - uint8x16_t * S = src; - size_t L = len / 16; - size_t i; - for (i = 0; i < L; i++) - D[i] = veorq_u8(D[i], S[i]); -} - -/* - * version 20110505 - * D. J. Bernstein - * Public domain. - * - * Based on crypto_core/salsa208/armneon/core.c from SUPERCOP 20130419 - */ -#define ROUNDS 8 -static void -neon_salsa20_8_intrinsic(void * input) -{ - int i; - const uint32x4_t abab = {-1,0,-1,0}; - /* - * This is modified since we only have one argument. Usually you'd rearrange - * the constant, key, and input bytes, but we just have one linear array to - * rearrange which is a bit easier. - */ - /* - * Change the input to be diagonals as if it's a 4x4 matrix of 32-bit values. - */ - uint32x4_t x0x5x10x15; - uint32x4_t x12x1x6x11; - uint32x4_t x8x13x2x7; - uint32x4_t x4x9x14x3; - uint32x4_t x0x1x10x11; - uint32x4_t x12x13x6x7; - uint32x4_t x8x9x2x3; - uint32x4_t x4x5x14x15; - uint32x4_t x0x1x2x3; - uint32x4_t x4x5x6x7; - uint32x4_t x8x9x10x11; - uint32x4_t x12x13x14x15; - x0x1x2x3 = vld1q_u8((uint8_t *) input); - x4x5x6x7 = vld1q_u8(16 + (uint8_t *) input); - x8x9x10x11 = vld1q_u8(32 + (uint8_t *) input); - x12x13x14x15 = vld1q_u8(48 + (uint8_t *) input); - x0x1x10x11 = vcombine_u32(vget_low_u32(x0x1x2x3), vget_high_u32(x8x9x10x11)); - x4x5x14x15 = vcombine_u32(vget_low_u32(x4x5x6x7), vget_high_u32(x12x13x14x15)); - x8x9x2x3 = vcombine_u32(vget_low_u32(x8x9x10x11), vget_high_u32(x0x1x2x3)); - x12x13x6x7 = vcombine_u32(vget_low_u32(x12x13x14x15), vget_high_u32(x4x5x6x7)); - x0x5x10x15 = vbslq_u32(abab,x0x1x10x11,x4x5x14x15); - x8x13x2x7 = vbslq_u32(abab,x8x9x2x3,x12x13x6x7); - x4x9x14x3 = vbslq_u32(abab,x4x5x14x15,x8x9x2x3); - x12x1x6x11 = vbslq_u32(abab,x12x13x6x7,x0x1x10x11); - { - uint32x4_t start0 = x0x5x10x15; - uint32x4_t start1 = x12x1x6x11; - uint32x4_t start3 = x4x9x14x3; - uint32x4_t start2 = x8x13x2x7; - /* From here on this should be the same as the SUPERCOP version. */ - uint32x4_t diag0 = start0; - uint32x4_t diag1 = start1; - uint32x4_t diag2 = start2; - uint32x4_t diag3 = start3; - uint32x4_t a0; - uint32x4_t a1; - uint32x4_t a2; - uint32x4_t a3; - for (i = ROUNDS;i > 0;i -= 2) { - a0 = diag1 + diag0; - diag3 ^= vsriq_n_u32(vshlq_n_u32(a0,7),a0,25); - a1 = diag0 + diag3; - diag2 ^= vsriq_n_u32(vshlq_n_u32(a1,9),a1,23); - a2 = diag3 + diag2; - diag1 ^= vsriq_n_u32(vshlq_n_u32(a2,13),a2,19); - a3 = diag2 + diag1; - diag0 ^= vsriq_n_u32(vshlq_n_u32(a3,18),a3,14); - diag3 = vextq_u32(diag3,diag3,3); - diag2 = vextq_u32(diag2,diag2,2); - diag1 = vextq_u32(diag1,diag1,1); - a0 = diag3 + diag0; - diag1 ^= vsriq_n_u32(vshlq_n_u32(a0,7),a0,25); - a1 = diag0 + diag1; - diag2 ^= vsriq_n_u32(vshlq_n_u32(a1,9),a1,23); - a2 = diag1 + diag2; - diag3 ^= vsriq_n_u32(vshlq_n_u32(a2,13),a2,19); - a3 = diag2 + diag3; - diag0 ^= vsriq_n_u32(vshlq_n_u32(a3,18),a3,14); - diag1 = vextq_u32(diag1,diag1,3); - diag2 = vextq_u32(diag2,diag2,2); - diag3 = vextq_u32(diag3,diag3,1); - } - x0x5x10x15 = diag0 + start0; - x12x1x6x11 = diag1 + start1; - x8x13x2x7 = diag2 + start2; - x4x9x14x3 = diag3 + start3; - x0x1x10x11 = vbslq_u32(abab,x0x5x10x15,x12x1x6x11); - x12x13x6x7 = vbslq_u32(abab,x12x1x6x11,x8x13x2x7); - x8x9x2x3 = vbslq_u32(abab,x8x13x2x7,x4x9x14x3); - x4x5x14x15 = vbslq_u32(abab,x4x9x14x3,x0x5x10x15); - x0x1x2x3 = vcombine_u32(vget_low_u32(x0x1x10x11),vget_high_u32(x8x9x2x3)); - x4x5x6x7 = vcombine_u32(vget_low_u32(x4x5x14x15),vget_high_u32(x12x13x6x7)); - x8x9x10x11 = vcombine_u32(vget_low_u32(x8x9x2x3),vget_high_u32(x0x1x10x11)); - x12x13x14x15 = vcombine_u32(vget_low_u32(x12x13x6x7),vget_high_u32(x4x5x14x15)); - vst1q_u8((uint8_t *) input,(uint8x16_t) x0x1x2x3); - vst1q_u8(16 + (uint8_t *) input,(uint8x16_t) x4x5x6x7); - vst1q_u8(32 + (uint8_t *) input,(uint8x16_t) x8x9x10x11); - vst1q_u8(48 + (uint8_t *) input,(uint8x16_t) x12x13x14x15); - } -} - -/** - * blockmix_salsa8(B, Y, r): - * Compute B = BlockMix_{salsa20/8, r}(B). The input B must be 128r bytes in - * length; the temporary space Y must also be the same size. - */ -static void -neon_blockmix_salsa8(uint8x16_t * Bin, uint8x16_t * Bout, uint8x16_t * X, size_t r) -{ - size_t i; - /* 1: X <-- B_{2r - 1} */ - neon_blkcpy(X, &Bin[8 * r - 4], 64); - /* 2: for i = 0 to 2r - 1 do */ - for (i = 0; i < r; i++) { - /* 3: X <-- H(X \xor B_i) */ - neon_blkxor(X, &Bin[i * 8], 64); - neon_salsa20_8_intrinsic((void *) X); - /* 4: Y_i <-- X */ - /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ - neon_blkcpy(&Bout[i * 4], X, 64); - /* 3: X <-- H(X \xor B_i) */ - neon_blkxor(X, &Bin[i * 8 + 4], 64); - neon_salsa20_8_intrinsic((void *) X); - /* 4: Y_i <-- X */ - /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ - neon_blkcpy(&Bout[(r + i) * 4], X, 64); - } -} - -static inline uint64_t -neon_le64dec(const void *pp) -{ - const uint8_t *p = (uint8_t const *)pp; - - /* Only return the lower 32 bits since N cannot be > 2^32 */ - return (uint64_t)(p[0]) + ((uint64_t)(p[1]) << 8) + - ((uint64_t)(p[2]) << 16) + ((uint64_t)(p[3]) << 24); -} - -/** - * integerify(B, r): - * Return the result of parsing B_{2r-1} as a little-endian integer. - */ -static uint64_t -neon_integerify(void * B, size_t r) -{ - uint8_t * X = (void*)((uintptr_t)(B) + (2 * r - 1) * 64); - return (neon_le64dec(X)); -} -/** - * smix(B, r, N, V, XY): - * Compute B = SMix_r(B, N). The input B must be 128r bytes in length; the - * temporary storage V must be 128rN bytes in length; the temporary storage - * XY must be 256r bytes in length. The value N must be a power of 2. - */ -static void -crypto_scrypt_smix_neon(uint8_t * B, size_t r, uint64_t N, void * V, void * XY) -{ - uint8x16_t * X = XY; - uint8x16_t * Y = (void *)((uintptr_t)(XY) + 128 * r); - uint8x16_t * Z = (void *)((uintptr_t)(XY) + 256 * r); - uint64_t i, j; - - /* 1: X <-- B */ - neon_blkcpy(X, B, 128 * r); - /* 2: for i = 0 to N - 1 do */ - for (i = 0; i < N; i += 2) { - /* 3: V_i <-- X */ - neon_blkcpy(((unsigned char *)V) + i * 128 * r, X, 128 * r); - /* 4: X <-- H(X) */ - neon_blockmix_salsa8(X, Y, Z, r); - /* 3: V_i <-- X */ - neon_blkcpy(((unsigned char *)V) + (i + 1) * 128 * r, Y, 128 * r); - /* 4: X <-- H(X) */ - neon_blockmix_salsa8(Y, X, Z, r); - } - /* 6: for i = 0 to N - 1 do */ - for (i = 0; i < N; i += 2) { - /* 7: j <-- Integerify(X) mod N */ - j = neon_integerify(X, r) & (N - 1); - /* 8: X <-- H(X \xor V_j) */ - neon_blkxor(X, ((unsigned char *)V) + j * 128 * r, 128 * r); - neon_blockmix_salsa8(X, Y, Z, r); - /* 7: j <-- Integerify(X) mod N */ - j = neon_integerify(Y, r) & (N - 1); - /* 8: X <-- H(X \xor V_j) */ - neon_blkxor(Y, ((unsigned char *)V) + j * 128 * r, 128 * r); - neon_blockmix_salsa8(Y, X, Z, r); - } - /* 10: B' <-- X */ - neon_blkcpy(B, X, 128 * r); -} diff --git a/external/libwally-core/src/scrypt/crypto_scrypt_smix_sse2.c b/external/libwally-core/src/scrypt/crypto_scrypt_smix_sse2.c deleted file mode 100644 index c00b7d91b..000000000 --- a/external/libwally-core/src/scrypt/crypto_scrypt_smix_sse2.c +++ /dev/null @@ -1,251 +0,0 @@ -/*- - * Copyright 2009 Colin Percival - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file was originally written by Colin Percival as part of the Tarsnap - * online backup system. - */ -#include - -#if 0 -#include "cpusupport.h" -/*#ifdef CPUSUPPORT_X86_SSE2*/ - -#include -#include - -#include "sysendian.h" - -#include "crypto_scrypt_smix_sse2.h" - -static void blkcpy(void *, const void *, size_t); -static void blkxor(void *, const void *, size_t); -static void salsa20_8(__m128i *); -static void blockmix_salsa8(const __m128i *, __m128i *, __m128i *, size_t); -static uint64_t integerify(const void *, size_t); -#endif - -static void -sse2_blkcpy(void * dest, const void * src, size_t len) -{ - __m128i * D = dest; - const __m128i * S = src; - size_t L = len / 16; - size_t i; - - for (i = 0; i < L; i++) - D[i] = S[i]; -} - -static void -sse2_blkxor(void * dest, const void * src, size_t len) -{ - __m128i * D = dest; - const __m128i * S = src; - size_t L = len / 16; - size_t i; - - for (i = 0; i < L; i++) - D[i] = _mm_xor_si128(D[i], S[i]); -} - -/** - * salsa20_8(B): - * Apply the salsa20/8 core to the provided block. - */ -static void -sse2_salsa20_8(__m128i B[4]) -{ - __m128i X0, X1, X2, X3; - __m128i T; - size_t i; - - X0 = B[0]; - X1 = B[1]; - X2 = B[2]; - X3 = B[3]; - - for (i = 0; i < 8; i += 2) { - /* Operate on "columns". */ - T = _mm_add_epi32(X0, X3); - X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 7)); - X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 25)); - T = _mm_add_epi32(X1, X0); - X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9)); - X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23)); - T = _mm_add_epi32(X2, X1); - X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 13)); - X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 19)); - T = _mm_add_epi32(X3, X2); - X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18)); - X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14)); - - /* Rearrange data. */ - X1 = _mm_shuffle_epi32(X1, 0x93); - X2 = _mm_shuffle_epi32(X2, 0x4E); - X3 = _mm_shuffle_epi32(X3, 0x39); - - /* Operate on "rows". */ - T = _mm_add_epi32(X0, X1); - X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 7)); - X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 25)); - T = _mm_add_epi32(X3, X0); - X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9)); - X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23)); - T = _mm_add_epi32(X2, X3); - X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 13)); - X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 19)); - T = _mm_add_epi32(X1, X2); - X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18)); - X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14)); - - /* Rearrange data. */ - X1 = _mm_shuffle_epi32(X1, 0x39); - X2 = _mm_shuffle_epi32(X2, 0x4E); - X3 = _mm_shuffle_epi32(X3, 0x93); - } - - B[0] = _mm_add_epi32(B[0], X0); - B[1] = _mm_add_epi32(B[1], X1); - B[2] = _mm_add_epi32(B[2], X2); - B[3] = _mm_add_epi32(B[3], X3); -} - -/** - * blockmix_salsa8(Bin, Bout, X, r): - * Compute Bout = BlockMix_{salsa20/8, r}(Bin). The input Bin must be 128r - * bytes in length; the output Bout must also be the same size. The - * temporary space X must be 64 bytes. - */ -static void -sse2_blockmix_salsa8(const __m128i * Bin, __m128i * Bout, __m128i * X, size_t r) -{ - size_t i; - - /* 1: X <-- B_{2r - 1} */ - sse2_blkcpy(X, &Bin[8 * r - 4], 64); - - /* 2: for i = 0 to 2r - 1 do */ - for (i = 0; i < r; i++) { - /* 3: X <-- H(X \xor B_i) */ - sse2_blkxor(X, &Bin[i * 8], 64); - sse2_salsa20_8(X); - - /* 4: Y_i <-- X */ - /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ - sse2_blkcpy(&Bout[i * 4], X, 64); - - /* 3: X <-- H(X \xor B_i) */ - sse2_blkxor(X, &Bin[i * 8 + 4], 64); - sse2_salsa20_8(X); - - /* 4: Y_i <-- X */ - /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ - sse2_blkcpy(&Bout[(r + i) * 4], X, 64); - } -} - -/** - * integerify(B, r): - * Return the result of parsing B_{2r-1} as a little-endian integer. - * Note that B's layout is permuted compared to the generic implementation. - */ -static uint64_t -sse2_integerify(const void * B, size_t r) -{ - const uint32_t * X = (const void *)((uintptr_t)(B) + (2 * r - 1) * 64); - - return X[0]; -} - -/** - * crypto_scrypt_smix_sse2(B, r, N, V, XY): - * Compute B = SMix_r(B, N). The input B must be 128r bytes in length; - * the temporary storage V must be 128rN bytes in length; the temporary - * storage XY must be 256r + 64 bytes in length. The value N must be a - * power of 2 greater than 1. The arrays B, V, and XY must be aligned to a - * multiple of 64 bytes. - * - * Use SSE2 instructions. - */ -void -crypto_scrypt_smix_sse2(uint8_t * B, size_t r, uint64_t N, void * V, void * XY) -{ - __m128i * X = XY; - __m128i * Y = (void *)((uintptr_t)(XY) + 128 * r); - __m128i * Z = (void *)((uintptr_t)(XY) + 256 * r); - uint32_t * X32 = (void *)X; - uint64_t i, j; - size_t k; - - /* 1: X <-- B */ - for (k = 0; k < 2 * r; k++) { - for (i = 0; i < 16; i++) { - X32[k * 16 + i] = - le32dec(&B[(k * 16 + (i * 5 % 16)) * 4]); - } - } - - /* 2: for i = 0 to N - 1 do */ - for (i = 0; i < N; i += 2) { - /* 3: V_i <-- X */ - sse2_blkcpy(((unsigned char *)V) + i * 128 * r, X, 128 * r); - - /* 4: X <-- H(X) */ - sse2_blockmix_salsa8(X, Y, Z, r); - - /* 3: V_i <-- X */ - sse2_blkcpy(((unsigned char *)V) + (i + 1) * 128 * r, Y, 128 * r); - - /* 4: X <-- H(X) */ - sse2_blockmix_salsa8(Y, X, Z, r); - } - - /* 6: for i = 0 to N - 1 do */ - for (i = 0; i < N; i += 2) { - /* 7: j <-- Integerify(X) mod N */ - j = sse2_integerify(X, r) & (N - 1); - - /* 8: X <-- H(X \xor V_j) */ - sse2_blkxor(X, ((unsigned char *)V) + j * 128 * r, 128 * r); - sse2_blockmix_salsa8(X, Y, Z, r); - - /* 7: j <-- Integerify(X) mod N */ - j = sse2_integerify(Y, r) & (N - 1); - - /* 8: X <-- H(X \xor V_j) */ - sse2_blkxor(Y, ((unsigned char *)V) + j * 128 * r, 128 * r); - sse2_blockmix_salsa8(Y, X, Z, r); - } - - /* 10: B' <-- X */ - for (k = 0; k < 2 * r; k++) { - for (i = 0; i < 16; i++) { - le32enc(&B[(k * 16 + (i * 5 % 16)) * 4], - X32[k * 16 + i]); - } - } -} - -/*#endif*/ diff --git a/external/libwally-core/src/secp256k1/.gitignore b/external/libwally-core/src/secp256k1/.gitignore deleted file mode 100644 index efb277d34..000000000 --- a/external/libwally-core/src/secp256k1/.gitignore +++ /dev/null @@ -1,48 +0,0 @@ -bench_inv -bench_ecdh -bench_sign -bench_verify -bench_schnorr_verify -bench_recover -bench_internal -tests -gen_context -*.exe -*.so -*.a -!.gitignore - -Makefile -configure -.libs/ -Makefile.in -aclocal.m4 -autom4te.cache/ -config.log -config.status -*.tar.gz -*.la -libtool -.deps/ -.dirstamp -*.lo -*.o -*~ -src/libsecp256k1-config.h -src/libsecp256k1-config.h.in -src/ecmult_static_context.h -build-aux/config.guess -build-aux/config.sub -build-aux/depcomp -build-aux/install-sh -build-aux/ltmain.sh -build-aux/m4/libtool.m4 -build-aux/m4/lt~obsolete.m4 -build-aux/m4/ltoptions.m4 -build-aux/m4/ltsugar.m4 -build-aux/m4/ltversion.m4 -build-aux/missing -build-aux/compile -build-aux/test-driver -src/stamp-h1 -libsecp256k1.pc diff --git a/external/libwally-core/src/secp256k1/.travis.yml b/external/libwally-core/src/secp256k1/.travis.yml deleted file mode 100644 index 2c5c63ada..000000000 --- a/external/libwally-core/src/secp256k1/.travis.yml +++ /dev/null @@ -1,70 +0,0 @@ -language: c -sudo: false -addons: - apt: - packages: libgmp-dev -compiler: - - clang - - gcc -cache: - directories: - - src/java/guava/ -env: - global: - - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no schnorr=no RECOVERY=no EXPERIMENTAL=no - - GUAVA_URL=https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar GUAVA_JAR=src/java/guava/guava-18.0.jar - matrix: - - SCALAR=32bit RECOVERY=yes - - SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes - - SCALAR=64bit - - FIELD=64bit RECOVERY=yes - - FIELD=64bit ENDOMORPHISM=yes - - FIELD=64bit ENDOMORPHISM=yes ECDH=yes EXPERIMENTAL=yes - - FIELD=64bit ASM=x86_64 - - FIELD=64bit ENDOMORPHISM=yes ASM=x86_64 - - FIELD=32bit SCHNORR=yes EXPERIMENTAL=yes - - FIELD=32bit ENDOMORPHISM=yes - - BIGNUM=no - - BIGNUM=no ENDOMORPHISM=yes SCHNORR=yes RECOVERY=yes EXPERIMENTAL=yes - - BIGNUM=no STATICPRECOMPUTATION=no - - BUILD=distcheck - - EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC - - EXTRAFLAGS=CFLAGS=-O0 - - BUILD=check-java ECDH=yes SCHNORR=yes EXPERIMENTAL=yes -matrix: - fast_finish: true - include: - - compiler: clang - env: HOST=i686-linux-gnu ENDOMORPHISM=yes - addons: - apt: - packages: - - gcc-multilib - - libgmp-dev:i386 - - compiler: clang - env: HOST=i686-linux-gnu - addons: - apt: - packages: - - gcc-multilib - - compiler: gcc - env: HOST=i686-linux-gnu ENDOMORPHISM=yes - addons: - apt: - packages: - - gcc-multilib - - compiler: gcc - env: HOST=i686-linux-gnu - addons: - apt: - packages: - - gcc-multilib - - libgmp-dev:i386 -before_install: mkdir -p `dirname $GUAVA_JAR` -install: if [ ! -f $GUAVA_JAR ]; then wget $GUAVA_URL -O $GUAVA_JAR; fi -before_script: ./autogen.sh -script: - - if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi - - if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi - - ./configure --enable-experimental=$EXPERIMENTAL --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --enable-module-ecdh=$ECDH --enable-module-schnorr=$SCHNORR --enable-module-recovery=$RECOVERY $EXTRAFLAGS $USE_HOST && make -j2 $BUILD -os: linux diff --git a/external/libwally-core/src/secp256k1/COPYING b/external/libwally-core/src/secp256k1/COPYING deleted file mode 100644 index 4522a5990..000000000 --- a/external/libwally-core/src/secp256k1/COPYING +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2013 Pieter Wuille - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/external/libwally-core/src/secp256k1/Makefile.am b/external/libwally-core/src/secp256k1/Makefile.am deleted file mode 100644 index 20aeb6c8b..000000000 --- a/external/libwally-core/src/secp256k1/Makefile.am +++ /dev/null @@ -1,167 +0,0 @@ -ACLOCAL_AMFLAGS = -I build-aux/m4 - -lib_LTLIBRARIES = libsecp256k1.la -if USE_JNI -JNI_LIB = libsecp256k1_jni.la -noinst_LTLIBRARIES = $(JNI_LIB) -else -JNI_LIB = -endif -include_HEADERS = include/secp256k1.h -noinst_HEADERS = -noinst_HEADERS += src/scalar.h -noinst_HEADERS += src/scalar_4x64.h -noinst_HEADERS += src/scalar_8x32.h -noinst_HEADERS += src/scalar_impl.h -noinst_HEADERS += src/scalar_4x64_impl.h -noinst_HEADERS += src/scalar_8x32_impl.h -noinst_HEADERS += src/group.h -noinst_HEADERS += src/group_impl.h -noinst_HEADERS += src/num_gmp.h -noinst_HEADERS += src/num_gmp_impl.h -noinst_HEADERS += src/ecdsa.h -noinst_HEADERS += src/ecdsa_impl.h -noinst_HEADERS += src/eckey.h -noinst_HEADERS += src/eckey_impl.h -noinst_HEADERS += src/ecmult.h -noinst_HEADERS += src/ecmult_impl.h -noinst_HEADERS += src/ecmult_const.h -noinst_HEADERS += src/ecmult_const_impl.h -noinst_HEADERS += src/ecmult_gen.h -noinst_HEADERS += src/ecmult_gen_impl.h -noinst_HEADERS += src/num.h -noinst_HEADERS += src/num_impl.h -noinst_HEADERS += src/field_10x26.h -noinst_HEADERS += src/field_10x26_impl.h -noinst_HEADERS += src/field_5x52.h -noinst_HEADERS += src/field_5x52_impl.h -noinst_HEADERS += src/field_5x52_int128_impl.h -noinst_HEADERS += src/field_5x52_asm_impl.h -noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h -noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h -noinst_HEADERS += src/util.h -noinst_HEADERS += src/testrand.h -noinst_HEADERS += src/testrand_impl.h -noinst_HEADERS += src/hash.h -noinst_HEADERS += src/hash_impl.h -noinst_HEADERS += src/field.h -noinst_HEADERS += src/field_impl.h -noinst_HEADERS += src/bench.h -noinst_HEADERS += contrib/lax_der_parsing.h -noinst_HEADERS += contrib/lax_der_parsing.c -noinst_HEADERS += contrib/lax_der_privatekey_parsing.h -noinst_HEADERS += contrib/lax_der_privatekey_parsing.c - -if USE_EXTERNAL_ASM -COMMON_LIB = libsecp256k1_common.la -noinst_LTLIBRARIES = $(COMMON_LIB) -else -COMMON_LIB = -endif - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libsecp256k1.pc - -if USE_EXTERNAL_ASM -if USE_ASM_ARM -libsecp256k1_common_la_SOURCES = src/asm/field_10x26_arm.s -endif -endif - -libsecp256k1_la_SOURCES = src/secp256k1.c -libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES) -libsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS) $(COMMON_LIB) - -libsecp256k1_jni_la_SOURCES = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c -libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES) - -noinst_PROGRAMS = -if USE_BENCHMARK -noinst_PROGRAMS += bench_verify bench_sign bench_internal -bench_verify_SOURCES = src/bench_verify.c -bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) -bench_sign_SOURCES = src/bench_sign.c -bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) -bench_internal_SOURCES = src/bench_internal.c -bench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB) -bench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES) -endif - -if USE_TESTS -noinst_PROGRAMS += tests -tests_SOURCES = src/tests.c -tests_CPPFLAGS = -DSECP256K1_BUILD -DVERIFY -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) -tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) -tests_LDFLAGS = -static -TESTS = tests -endif - -JAVAROOT=src/java -JAVAORG=org/bitcoin -JAVA_GUAVA=$(srcdir)/$(JAVAROOT)/guava/guava-18.0.jar -CLASSPATH_ENV=CLASSPATH=$(JAVA_GUAVA) -JAVA_FILES= \ - $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \ - $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \ - $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \ - $(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java - -if USE_JNI - -$(JAVA_GUAVA): - @echo Guava is missing. Fetch it via: \ - wget https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar -O $(@) - @false - -.stamp-java: $(JAVA_FILES) - @echo Compiling $^ - $(AM_V_at)$(CLASSPATH_ENV) javac $^ - @touch $@ - -if USE_TESTS - -check-java: libsecp256k1.la $(JAVA_GUAVA) .stamp-java - $(AM_V_at)java -Djava.library.path="./:./src:./src/.libs:.libs/" -cp "$(JAVA_GUAVA):$(JAVAROOT)" $(JAVAORG)/NativeSecp256k1Test - -endif -endif - -if USE_ECMULT_STATIC_PRECOMPUTATION -CPPFLAGS_FOR_BUILD +=-I$(top_srcdir) -CFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function - -gen_context_OBJECTS = gen_context.o -gen_context_BIN = gen_context$(BUILD_EXEEXT) -gen_%.o: src/gen_%.c - $(CC_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@ - -$(gen_context_BIN): $(gen_context_OBJECTS) - $(CC_FOR_BUILD) $^ -o $@ - -$(libsecp256k1_la_OBJECTS): src/ecmult_static_context.h -$(tests_OBJECTS): src/ecmult_static_context.h -$(bench_internal_OBJECTS): src/ecmult_static_context.h - -src/ecmult_static_context.h: $(gen_context_BIN) - ./$(gen_context_BIN) - -CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java -endif - -EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES) - -if ENABLE_MODULE_ECDH -include src/modules/ecdh/Makefile.am.include -endif - -if ENABLE_MODULE_SCHNORR -include src/modules/schnorr/Makefile.am.include -endif - -if ENABLE_MODULE_RECOVERY -include src/modules/recovery/Makefile.am.include -endif - -if ENABLE_MODULE_RANGEPROOF -include src/modules/rangeproof/Makefile.am.include -endif diff --git a/external/libwally-core/src/secp256k1/README.md b/external/libwally-core/src/secp256k1/README.md deleted file mode 100644 index 8cd344ea8..000000000 --- a/external/libwally-core/src/secp256k1/README.md +++ /dev/null @@ -1,61 +0,0 @@ -libsecp256k1 -============ - -[![Build Status](https://travis-ci.org/bitcoin-core/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin-core/secp256k1) - -Optimized C library for EC operations on curve secp256k1. - -This library is a work in progress and is being used to research best practices. Use at your own risk. - -Features: -* secp256k1 ECDSA signing/verification and key generation. -* Adding/multiplying private/public keys. -* Serialization/parsing of private keys, public keys, signatures. -* Constant time, constant memory access signing and pubkey generation. -* Derandomized DSA (via RFC6979 or with a caller provided function.) -* Very efficient implementation. - -Implementation details ----------------------- - -* General - * No runtime heap allocation. - * Extensive testing infrastructure. - * Structured to facilitate review and analysis. - * Intended to be portable to any system with a C89 compiler and uint64_t support. - * Expose only higher level interfaces to minimize the API surface and improve application security. ("Be difficult to use insecurely.") -* Field operations - * Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1). - * Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys). - * Using 10 26-bit limbs. - * Field inverses and square roots using a sliding window over blocks of 1s (by Peter Dettman). -* Scalar operations - * Optimized implementation without data-dependent branches of arithmetic modulo the curve's order. - * Using 4 64-bit limbs (relying on __int128 support in the compiler). - * Using 8 32-bit limbs. -* Group operations - * Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7). - * Use addition between points in Jacobian and affine coordinates where possible. - * Use a unified addition/doubling formula where necessary to avoid data-dependent branches. - * Point/x comparison without a field inversion by comparison in the Jacobian coordinate space. -* Point multiplication for verification (a*P + b*G). - * Use wNAF notation for point multiplicands. - * Use a much larger window for multiples of G, using precomputed multiples. - * Use Shamir's trick to do the multiplication with the public key and the generator simultaneously. - * Optionally (off by default) use secp256k1's efficiently-computable endomorphism to split the P multiplicand into 2 half-sized ones. -* Point multiplication for signing - * Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions. - * Access the table with branch-free conditional moves so memory access is uniform. - * No data-dependent branches - * The precomputed tables add and eventually subtract points for which no known scalar (private key) is known, preventing even an attacker with control over the private key used to control the data internally. - -Build steps ------------ - -libsecp256k1 is built using autotools: - - $ ./autogen.sh - $ ./configure - $ make - $ ./tests - $ sudo make install # optional diff --git a/external/libwally-core/src/secp256k1/TODO b/external/libwally-core/src/secp256k1/TODO deleted file mode 100644 index a300e1c5e..000000000 --- a/external/libwally-core/src/secp256k1/TODO +++ /dev/null @@ -1,3 +0,0 @@ -* Unit tests for fieldelem/groupelem, including ones intended to - trigger fieldelem's boundary cases. -* Complete constant-time operations for signing/keygen diff --git a/external/libwally-core/src/secp256k1/autogen.sh b/external/libwally-core/src/secp256k1/autogen.sh deleted file mode 100755 index 65286b935..000000000 --- a/external/libwally-core/src/secp256k1/autogen.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -set -e -autoreconf -if --warnings=all diff --git a/external/libwally-core/src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 b/external/libwally-core/src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 deleted file mode 100644 index 1fc362761..000000000 --- a/external/libwally-core/src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 +++ /dev/null @@ -1,140 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_JNI_INCLUDE_DIR -# -# DESCRIPTION -# -# AX_JNI_INCLUDE_DIR finds include directories needed for compiling -# programs using the JNI interface. -# -# JNI include directories are usually in the Java distribution. This is -# deduced from the value of $JAVA_HOME, $JAVAC, or the path to "javac", in -# that order. When this macro completes, a list of directories is left in -# the variable JNI_INCLUDE_DIRS. -# -# Example usage follows: -# -# AX_JNI_INCLUDE_DIR -# -# for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS -# do -# CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" -# done -# -# If you want to force a specific compiler: -# -# - at the configure.in level, set JAVAC=yourcompiler before calling -# AX_JNI_INCLUDE_DIR -# -# - at the configure level, setenv JAVAC -# -# Note: This macro can work with the autoconf M4 macros for Java programs. -# This particular macro is not part of the original set of macros. -# -# LICENSE -# -# Copyright (c) 2008 Don Anderson -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 10 - -AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR]) -AC_DEFUN([AX_JNI_INCLUDE_DIR],[ - -JNI_INCLUDE_DIRS="" - -if test "x$JAVA_HOME" != x; then - _JTOPDIR="$JAVA_HOME" -else - if test "x$JAVAC" = x; then - JAVAC=javac - fi - AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no]) - if test "x$_ACJNI_JAVAC" = xno; then - AC_MSG_WARN([cannot find JDK; try setting \$JAVAC or \$JAVA_HOME]) - fi - _ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC") - _JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'` -fi - -case "$host_os" in - darwin*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` - _JINC="$_JTOPDIR/Headers";; - *) _JINC="$_JTOPDIR/include";; -esac -_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR]) -_AS_ECHO_LOG([_JINC=$_JINC]) - -# On Mac OS X 10.6.4, jni.h is a symlink: -# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h -# -> ../../CurrentJDK/Headers/jni.h. - -AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path, -[ -if test -f "$_JINC/jni.h"; then - ac_cv_jni_header_path="$_JINC" - JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" -else - _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` - if test -f "$_JTOPDIR/include/jni.h"; then - ac_cv_jni_header_path="$_JTOPDIR/include" - JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" - else - ac_cv_jni_header_path=none - fi -fi -]) - - - -# get the likely subdirectories for system specific java includes -case "$host_os" in -bsdi*) _JNI_INC_SUBDIRS="bsdos";; -darwin*) _JNI_INC_SUBDIRS="darwin";; -freebsd*) _JNI_INC_SUBDIRS="freebsd";; -linux*) _JNI_INC_SUBDIRS="linux genunix";; -osf*) _JNI_INC_SUBDIRS="alpha";; -solaris*) _JNI_INC_SUBDIRS="solaris";; -mingw*) _JNI_INC_SUBDIRS="win32";; -cygwin*) _JNI_INC_SUBDIRS="win32";; -*) _JNI_INC_SUBDIRS="genunix";; -esac - -if test "x$ac_cv_jni_header_path" != "xnone"; then - # add any subdirectories that are present - for JINCSUBDIR in $_JNI_INC_SUBDIRS - do - if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then - JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR" - fi - done -fi -]) - -# _ACJNI_FOLLOW_SYMLINKS -# Follows symbolic links on , -# finally setting variable _ACJNI_FOLLOWED -# ---------------------------------------- -AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[ -# find the include directory relative to the javac executable -_cur="$1" -while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do - AC_MSG_CHECKING([symlink for $_cur]) - _slink=`ls -ld "$_cur" | sed 's/.* -> //'` - case "$_slink" in - /*) _cur="$_slink";; - # 'X' avoids triggering unwanted echo options. - *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";; - esac - AC_MSG_RESULT([$_cur]) -done -_ACJNI_FOLLOWED="$_cur" -])# _ACJNI diff --git a/external/libwally-core/src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 b/external/libwally-core/src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 deleted file mode 100644 index 77fd346a7..000000000 --- a/external/libwally-core/src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 +++ /dev/null @@ -1,125 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PROG_CC_FOR_BUILD -# -# DESCRIPTION -# -# This macro searches for a C compiler that generates native executables, -# that is a C compiler that surely is not a cross-compiler. This can be -# useful if you have to generate source code at compile-time like for -# example GCC does. -# -# The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything -# needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD). -# The value of these variables can be overridden by the user by specifying -# a compiler with an environment variable (like you do for standard CC). -# -# It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object -# file extensions for the build platform, and GCC_FOR_BUILD to `yes' if -# the compiler we found is GCC. All these variables but GCC_FOR_BUILD are -# substituted in the Makefile. -# -# LICENSE -# -# Copyright (c) 2008 Paolo Bonzini -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 8 - -AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD]) -AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_CPP])dnl -AC_REQUIRE([AC_EXEEXT])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl - -dnl Use the standard macros, but make them use other variable names -dnl -pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl -pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl -pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl -pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl -pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl -pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl -pushdef([ac_cv_objext], ac_cv_build_objext)dnl -pushdef([ac_exeext], ac_build_exeext)dnl -pushdef([ac_objext], ac_build_objext)dnl -pushdef([CC], CC_FOR_BUILD)dnl -pushdef([CPP], CPP_FOR_BUILD)dnl -pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl -pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl -pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl -pushdef([host], build)dnl -pushdef([host_alias], build_alias)dnl -pushdef([host_cpu], build_cpu)dnl -pushdef([host_vendor], build_vendor)dnl -pushdef([host_os], build_os)dnl -pushdef([ac_cv_host], ac_cv_build)dnl -pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl -pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl -pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl -pushdef([ac_cv_host_os], ac_cv_build_os)dnl -pushdef([ac_cpp], ac_build_cpp)dnl -pushdef([ac_compile], ac_build_compile)dnl -pushdef([ac_link], ac_build_link)dnl - -save_cross_compiling=$cross_compiling -save_ac_tool_prefix=$ac_tool_prefix -cross_compiling=no -ac_tool_prefix= - -AC_PROG_CC -AC_PROG_CPP -AC_EXEEXT - -ac_tool_prefix=$save_ac_tool_prefix -cross_compiling=$save_cross_compiling - -dnl Restore the old definitions -dnl -popdef([ac_link])dnl -popdef([ac_compile])dnl -popdef([ac_cpp])dnl -popdef([ac_cv_host_os])dnl -popdef([ac_cv_host_vendor])dnl -popdef([ac_cv_host_cpu])dnl -popdef([ac_cv_host_alias])dnl -popdef([ac_cv_host])dnl -popdef([host_os])dnl -popdef([host_vendor])dnl -popdef([host_cpu])dnl -popdef([host_alias])dnl -popdef([host])dnl -popdef([LDFLAGS])dnl -popdef([CPPFLAGS])dnl -popdef([CFLAGS])dnl -popdef([CPP])dnl -popdef([CC])dnl -popdef([ac_objext])dnl -popdef([ac_exeext])dnl -popdef([ac_cv_objext])dnl -popdef([ac_cv_exeext])dnl -popdef([ac_cv_prog_cc_g])dnl -popdef([ac_cv_prog_cc_cross])dnl -popdef([ac_cv_prog_cc_works])dnl -popdef([ac_cv_prog_gcc])dnl -popdef([ac_cv_prog_CPP])dnl - -dnl Finally, set Makefile variables -dnl -BUILD_EXEEXT=$ac_build_exeext -BUILD_OBJEXT=$ac_build_objext -AC_SUBST(BUILD_EXEEXT)dnl -AC_SUBST(BUILD_OBJEXT)dnl -AC_SUBST([CFLAGS_FOR_BUILD])dnl -AC_SUBST([CPPFLAGS_FOR_BUILD])dnl -AC_SUBST([LDFLAGS_FOR_BUILD])dnl -]) diff --git a/external/libwally-core/src/secp256k1/build-aux/m4/bitcoin_secp.m4 b/external/libwally-core/src/secp256k1/build-aux/m4/bitcoin_secp.m4 deleted file mode 100644 index b25d8adb9..000000000 --- a/external/libwally-core/src/secp256k1/build-aux/m4/bitcoin_secp.m4 +++ /dev/null @@ -1,65 +0,0 @@ -dnl libsecp25k1 helper checks -AC_DEFUN([SECP_INT128_CHECK],[ -has_int128=$ac_cv_type___int128 -]) - -dnl escape "$0x" below using the m4 quadrigaph @S|@, and escape it again with a \ for the shell. -AC_DEFUN([SECP_64BIT_ASM_CHECK],[ -AC_MSG_CHECKING(for x86_64 assembly availability) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include ]],[[ - uint64_t a = 11, tmp; - __asm__ __volatile__("movq \@S|@0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); - ]])],[has_64bit_asm=yes],[has_64bit_asm=no]) -AC_MSG_RESULT([$has_64bit_asm]) -]) - -dnl -AC_DEFUN([SECP_OPENSSL_CHECK],[ - has_libcrypto=no - m4_ifdef([PKG_CHECK_MODULES],[ - PKG_CHECK_MODULES([CRYPTO], [libcrypto], [has_libcrypto=yes],[has_libcrypto=no]) - if test x"$has_libcrypto" = x"yes"; then - TEMP_LIBS="$LIBS" - LIBS="$LIBS $CRYPTO_LIBS" - AC_CHECK_LIB(crypto, main,[AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])],[has_libcrypto=no]) - LIBS="$TEMP_LIBS" - fi - ]) - if test x$has_libcrypto = xno; then - AC_CHECK_HEADER(openssl/crypto.h,[ - AC_CHECK_LIB(crypto, main,[ - has_libcrypto=yes - CRYPTO_LIBS=-lcrypto - AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed]) - ]) - ]) - LIBS= - fi -if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then - AC_MSG_CHECKING(for EC functions in libcrypto) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #include - #include ]],[[ - EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_secp256k1); - ECDSA_sign(0, NULL, 0, NULL, NULL, eckey); - ECDSA_verify(0, NULL, 0, NULL, 0, eckey); - EC_KEY_free(eckey); - ]])],[has_openssl_ec=yes],[has_openssl_ec=no]) - AC_MSG_RESULT([$has_openssl_ec]) -fi -]) - -dnl -AC_DEFUN([SECP_GMP_CHECK],[ -if test x"$has_gmp" != x"yes"; then - CPPFLAGS_TEMP="$CPPFLAGS" - CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS" - LIBS_TEMP="$LIBS" - LIBS="$GMP_LIBS $LIBS" - AC_CHECK_HEADER(gmp.h,[AC_CHECK_LIB(gmp, __gmpz_init,[has_gmp=yes; GMP_LIBS="$GMP_LIBS -lgmp"; AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])])]) - CPPFLAGS="$CPPFLAGS_TEMP" - LIBS="$LIBS_TEMP" -fi -]) diff --git a/external/libwally-core/src/secp256k1/configure.ac b/external/libwally-core/src/secp256k1/configure.ac deleted file mode 100644 index c4b1539ac..000000000 --- a/external/libwally-core/src/secp256k1/configure.ac +++ /dev/null @@ -1,510 +0,0 @@ -AC_PREREQ([2.60]) -AC_INIT([libsecp256k1],[0.1]) -AC_CONFIG_AUX_DIR([build-aux]) -AC_CONFIG_MACRO_DIR([build-aux/m4]) -AC_CANONICAL_HOST -AH_TOP([#ifndef LIBSECP256K1_CONFIG_H]) -AH_TOP([#define LIBSECP256K1_CONFIG_H]) -AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/]) -AM_INIT_AUTOMAKE([foreign subdir-objects]) -LT_INIT - -dnl make the compilation flags quiet unless V=1 is used -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - -PKG_PROG_PKG_CONFIG - -AC_PATH_TOOL(AR, ar) -AC_PATH_TOOL(RANLIB, ranlib) -AC_PATH_TOOL(STRIP, strip) -AX_PROG_CC_FOR_BUILD - -if test "x$CFLAGS" = "x"; then - CFLAGS="-O3 -g" -fi - -AM_PROG_CC_C_O - -AC_PROG_CC_C89 -if test x"$ac_cv_prog_cc_c89" = x"no"; then - AC_MSG_ERROR([c89 compiler support required]) -fi -AM_PROG_AS - -case $host_os in - *darwin*) - if test x$cross_compiling != xyes; then - AC_PATH_PROG([BREW],brew,) - if test x$BREW != x; then - dnl These Homebrew packages may be keg-only, meaning that they won't be found - dnl in expected paths because they may conflict with system files. Ask - dnl Homebrew where each one is located, then adjust paths accordingly. - - openssl_prefix=`$BREW --prefix openssl 2>/dev/null` - gmp_prefix=`$BREW --prefix gmp 2>/dev/null` - if test x$openssl_prefix != x; then - PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" - export PKG_CONFIG_PATH - fi - if test x$gmp_prefix != x; then - GMP_CPPFLAGS="-I$gmp_prefix/include" - GMP_LIBS="-L$gmp_prefix/lib" - fi - else - AC_PATH_PROG([PORT],port,) - dnl if homebrew isn't installed and macports is, add the macports default paths - dnl as a last resort. - if test x$PORT != x; then - CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" - LDFLAGS="$LDFLAGS -L/opt/local/lib" - fi - fi - fi - ;; -esac - -CFLAGS="$CFLAGS -W" - -warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings" -saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $warn_CFLAGS" -AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], - [ AC_MSG_RESULT([yes]) ], - [ AC_MSG_RESULT([no]) - CFLAGS="$saved_CFLAGS" - ]) - -saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -fvisibility=hidden" -AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], - [ AC_MSG_RESULT([yes]) ], - [ AC_MSG_RESULT([no]) - CFLAGS="$saved_CFLAGS" - ]) - -AC_ARG_ENABLE(benchmark, - AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]), - [use_benchmark=$enableval], - [use_benchmark=no]) - -AC_ARG_ENABLE(tests, - AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), - [use_tests=$enableval], - [use_tests=yes]) - -AC_ARG_ENABLE(openssl_tests, - AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]), - [enable_openssl_tests=$enableval], - [enable_openssl_tests=auto]) - -AC_ARG_ENABLE(experimental, - AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]), - [use_experimental=$enableval], - [use_experimental=no]) - -AC_ARG_ENABLE(endomorphism, - AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), - [use_endomorphism=$enableval], - [use_endomorphism=no]) - -AC_ARG_ENABLE(ecmult_static_precomputation, - AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]), - [use_ecmult_static_precomputation=$enableval], - [use_ecmult_static_precomputation=auto]) - -AC_ARG_ENABLE(module_ecdh, - AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]), - [enable_module_ecdh=$enableval], - [enable_module_ecdh=no]) - -AC_ARG_ENABLE(module_schnorr, - AS_HELP_STRING([--enable-module-schnorr],[enable Schnorr signature module (experimental)]), - [enable_module_schnorr=$enableval], - [enable_module_schnorr=no]) - -AC_ARG_ENABLE(module_recovery, - AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]), - [enable_module_recovery=$enableval], - [enable_module_recovery=no]) - -AC_ARG_ENABLE(module_rangeproof, - AS_HELP_STRING([--enable-module-rangeproof],[enable Pedersen / zero-knowledge range proofs module (default is no)]), - [enable_module_rangeproof=$enableval], - [enable_module_rangeproof=no]) - -AC_ARG_ENABLE(jni, - AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]), - [use_jni=$enableval], - [use_jni=auto]) - -AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto], -[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) - -AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], -[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto]) - -AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto], -[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto]) - -AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto] -[Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto]) - -AC_CHECK_TYPES([__int128]) - -AC_MSG_CHECKING([for __builtin_expect]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])], - [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ], - [ AC_MSG_RESULT([no]) - ]) - -if test x"$use_ecmult_static_precomputation" != x"no"; then - save_cross_compiling=$cross_compiling - cross_compiling=no - TEMP_CC="$CC" - CC="$CC_FOR_BUILD" - AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}]) - AC_RUN_IFELSE( - [AC_LANG_PROGRAM([], [return 0])], - [working_native_cc=yes], - [working_native_cc=no],[dnl]) - CC="$TEMP_CC" - cross_compiling=$save_cross_compiling - - if test x"$working_native_cc" = x"no"; then - set_precomp=no - if test x"$use_ecmult_static_precomputation" = x"yes"; then - AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) - else - AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) - fi - else - AC_MSG_RESULT([ok]) - set_precomp=yes - fi -else - set_precomp=no -fi - -AC_MSG_CHECKING([for __builtin_clzll]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() { __builtin_clzll(1);}]])], - [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_CLZLL,1,[Define this symbol if __builtin_clzll is available]) ], - [ AC_MSG_RESULT([no]) - ]) - -if test x"$req_asm" = x"auto"; then - SECP_64BIT_ASM_CHECK - if test x"$has_64bit_asm" = x"yes"; then - set_asm=x86_64 - fi - if test x"$set_asm" = x; then - set_asm=no - fi -else - set_asm=$req_asm - case $set_asm in - x86_64) - SECP_64BIT_ASM_CHECK - if test x"$has_64bit_asm" != x"yes"; then - AC_MSG_ERROR([x86_64 assembly optimization requested but not available]) - fi - ;; - arm) - ;; - no) - ;; - *) - AC_MSG_ERROR([invalid assembly optimization selection]) - ;; - esac -fi - -if test x"$req_field" = x"auto"; then - if test x"set_asm" = x"x86_64"; then - set_field=64bit - fi - if test x"$set_field" = x; then - SECP_INT128_CHECK - if test x"$has_int128" = x"yes"; then - set_field=64bit - fi - fi - if test x"$set_field" = x; then - set_field=32bit - fi -else - set_field=$req_field - case $set_field in - 64bit) - if test x"$set_asm" != x"x86_64"; then - SECP_INT128_CHECK - if test x"$has_int128" != x"yes"; then - AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available]) - fi - fi - ;; - 32bit) - ;; - *) - AC_MSG_ERROR([invalid field implementation selection]) - ;; - esac -fi - -if test x"$req_scalar" = x"auto"; then - SECP_INT128_CHECK - if test x"$has_int128" = x"yes"; then - set_scalar=64bit - fi - if test x"$set_scalar" = x; then - set_scalar=32bit - fi -else - set_scalar=$req_scalar - case $set_scalar in - 64bit) - SECP_INT128_CHECK - if test x"$has_int128" != x"yes"; then - AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available]) - fi - ;; - 32bit) - ;; - *) - AC_MSG_ERROR([invalid scalar implementation selected]) - ;; - esac -fi - -if test x"$req_bignum" = x"auto"; then - SECP_GMP_CHECK - if test x"$has_gmp" = x"yes"; then - set_bignum=gmp - fi - - if test x"$set_bignum" = x; then - set_bignum=no - fi -else - set_bignum=$req_bignum - case $set_bignum in - gmp) - SECP_GMP_CHECK - if test x"$has_gmp" != x"yes"; then - AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available]) - fi - ;; - no) - ;; - *) - AC_MSG_ERROR([invalid bignum implementation selection]) - ;; - esac -fi - -# select assembly optimization -use_external_asm=no - -case $set_asm in -x86_64) - AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations]) - ;; -arm) - use_external_asm=yes - ;; -no) - ;; -*) - AC_MSG_ERROR([invalid assembly optimizations]) - ;; -esac - -# select field implementation -case $set_field in -64bit) - AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation]) - ;; -32bit) - AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation]) - ;; -*) - AC_MSG_ERROR([invalid field implementation]) - ;; -esac - -# select bignum implementation -case $set_bignum in -gmp) - AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed]) - AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num]) - AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation]) - AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation]) - ;; -no) - AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation]) - AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation]) - AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation]) - ;; -*) - AC_MSG_ERROR([invalid bignum implementation]) - ;; -esac - -#select scalar implementation -case $set_scalar in -64bit) - AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation]) - ;; -32bit) - AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation]) - ;; -*) - AC_MSG_ERROR([invalid scalar implementation]) - ;; -esac - -if test x"$use_tests" = x"yes"; then - SECP_OPENSSL_CHECK - if test x"$has_openssl_ec" = x"yes"; then - if test x"$enable_openssl_tests" != x"no"; then - AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) - SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" - SECP_TEST_LIBS="$CRYPTO_LIBS" - - case $host in - *mingw*) - SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" - ;; - esac - fi - else - if test x"$enable_openssl_tests" = x"yes"; then - AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available]) - fi - fi -else - if test x"$enable_openssl_tests" = x"yes"; then - AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled]) - fi -fi - -if test x"$use_jni" != x"no"; then - AX_JNI_INCLUDE_DIR - have_jni_dependencies=yes - if test x"$enable_module_schnorr" = x"no"; then - have_jni_dependencies=no - fi - if test x"$enable_module_ecdh" = x"no"; then - have_jni_dependencies=no - fi - if test "x$JNI_INCLUDE_DIRS" = "x"; then - have_jni_dependencies=no - fi - if test "x$have_jni_dependencies" = "xno"; then - if test x"$use_jni" = x"yes"; then - AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and Schnorr and try again.]) - fi - AC_MSG_WARN([jni headers/dependencies not found. jni support disabled]) - use_jni=no - else - use_jni=yes - for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do - JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR" - done - fi -fi - -if test x"$set_bignum" = x"gmp"; then - SECP_LIBS="$SECP_LIBS $GMP_LIBS" - SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS" -fi - -if test x"$use_endomorphism" = x"yes"; then - AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization]) -fi - -if test x"$set_precomp" = x"yes"; then - AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table]) -fi - -if test x"$enable_module_ecdh" = x"yes"; then - AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module]) -fi - -if test x"$enable_module_schnorr" = x"yes"; then - AC_DEFINE(ENABLE_MODULE_SCHNORR, 1, [Define this symbol to enable the Schnorr signature module]) -fi - -if test x"$enable_module_recovery" = x"yes"; then - AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module]) -fi - -if test x"$enable_module_rangeproof" = x"yes"; then - AC_DEFINE(ENABLE_MODULE_RANGEPROOF, 1, [Define this symbol to enable the Pedersen / zero knowledge range proof module]) -fi - -AC_C_BIGENDIAN() - -if test x"$use_external_asm" = x"yes"; then - AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used]) -fi - -AC_MSG_NOTICE([Using static precomputation: $set_precomp]) -AC_MSG_NOTICE([Using assembly optimizations: $set_asm]) -AC_MSG_NOTICE([Using field implementation: $set_field]) -AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) -AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) -AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism]) -AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) -AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr]) -AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery]) -AC_MSG_NOTICE([Using jni: $use_jni]) - -if test x"$enable_experimental" = x"yes"; then - AC_MSG_NOTICE([******]) - AC_MSG_NOTICE([WARNING: experimental build]) - AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.]) - AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) - AC_MSG_NOTICE([Building Schnorr signatures module: $enable_module_schnorr]) - AC_MSG_NOTICE([Building range proof module: $enable_module_rangeproof]) - AC_MSG_NOTICE([******]) -else - if test x"$enable_module_schnorr" = x"yes"; then - AC_MSG_ERROR([Schnorr signature module is experimental. Use --enable-experimental to allow.]) - fi - if test x"$enable_module_ecdh" = x"yes"; then - AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.]) - fi - if test x"$set_asm" = x"arm"; then - AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.]) - fi - if test x"$enable_module_rangeproof" = x"yes"; then - AC_MSG_ERROR([Range proof module is experimental. Use --enable-experimental to allow.]) - fi -fi - -AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) -AC_CONFIG_FILES([Makefile libsecp256k1.pc]) -AC_SUBST(JNI_INCLUDES) -AC_SUBST(SECP_INCLUDES) -AC_SUBST(SECP_LIBS) -AC_SUBST(SECP_TEST_LIBS) -AC_SUBST(SECP_TEST_INCLUDES) -AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) -AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"]) -AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"]) -AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"]) -AM_CONDITIONAL([ENABLE_MODULE_SCHNORR], [test x"$enable_module_schnorr" = x"yes"]) -AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"]) -AM_CONDITIONAL([ENABLE_MODULE_RANGEPROOF], [test x"$enable_module_rangeproof" = x"yes"]) -AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"]) -AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"]) -AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"]) - -dnl make sure nothing new is exported so that we don't break the cache -PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" -unset PKG_CONFIG_PATH -PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP" - -AC_OUTPUT diff --git a/external/libwally-core/src/secp256k1/contrib/lax_der_parsing.c b/external/libwally-core/src/secp256k1/contrib/lax_der_parsing.c deleted file mode 100644 index 5b141a994..000000000 --- a/external/libwally-core/src/secp256k1/contrib/lax_der_parsing.c +++ /dev/null @@ -1,150 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include -#include - -#include "lax_der_parsing.h" - -int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { - size_t rpos, rlen, spos, slen; - size_t pos = 0; - size_t lenbyte; - unsigned char tmpsig[64] = {0}; - int overflow = 0; - - /* Hack to initialize sig with a correctly-parsed but invalid signature. */ - secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); - - /* Sequence tag byte */ - if (pos == inputlen || input[pos] != 0x30) { - return 0; - } - pos++; - - /* Sequence length bytes */ - if (pos == inputlen) { - return 0; - } - lenbyte = input[pos++]; - if (lenbyte & 0x80) { - lenbyte -= 0x80; - if (pos + lenbyte > inputlen) { - return 0; - } - pos += lenbyte; - } - - /* Integer tag byte for R */ - if (pos == inputlen || input[pos] != 0x02) { - return 0; - } - pos++; - - /* Integer length for R */ - if (pos == inputlen) { - return 0; - } - lenbyte = input[pos++]; - if (lenbyte & 0x80) { - lenbyte -= 0x80; - if (pos + lenbyte > inputlen) { - return 0; - } - while (lenbyte > 0 && input[pos] == 0) { - pos++; - lenbyte--; - } - if (lenbyte >= sizeof(size_t)) { - return 0; - } - rlen = 0; - while (lenbyte > 0) { - rlen = (rlen << 8) + input[pos]; - pos++; - lenbyte--; - } - } else { - rlen = lenbyte; - } - if (rlen > inputlen - pos) { - return 0; - } - rpos = pos; - pos += rlen; - - /* Integer tag byte for S */ - if (pos == inputlen || input[pos] != 0x02) { - return 0; - } - pos++; - - /* Integer length for S */ - if (pos == inputlen) { - return 0; - } - lenbyte = input[pos++]; - if (lenbyte & 0x80) { - lenbyte -= 0x80; - if (pos + lenbyte > inputlen) { - return 0; - } - while (lenbyte > 0 && input[pos] == 0) { - pos++; - lenbyte--; - } - if (lenbyte >= sizeof(size_t)) { - return 0; - } - slen = 0; - while (lenbyte > 0) { - slen = (slen << 8) + input[pos]; - pos++; - lenbyte--; - } - } else { - slen = lenbyte; - } - if (slen > inputlen - pos) { - return 0; - } - spos = pos; - pos += slen; - - /* Ignore leading zeroes in R */ - while (rlen > 0 && input[rpos] == 0) { - rlen--; - rpos++; - } - /* Copy R value */ - if (rlen > 32) { - overflow = 1; - } else { - memcpy(tmpsig + 32 - rlen, input + rpos, rlen); - } - - /* Ignore leading zeroes in S */ - while (slen > 0 && input[spos] == 0) { - slen--; - spos++; - } - /* Copy S value */ - if (slen > 32) { - overflow = 1; - } else { - memcpy(tmpsig + 64 - slen, input + spos, slen); - } - - if (!overflow) { - overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); - } - if (overflow) { - memset(tmpsig, 0, 64); - secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); - } - return 1; -} - diff --git a/external/libwally-core/src/secp256k1/contrib/lax_der_parsing.h b/external/libwally-core/src/secp256k1/contrib/lax_der_parsing.h deleted file mode 100644 index 6d27871a7..000000000 --- a/external/libwally-core/src/secp256k1/contrib/lax_der_parsing.h +++ /dev/null @@ -1,91 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -/**** - * Please do not link this file directly. It is not part of the libsecp256k1 - * project and does not promise any stability in its API, functionality or - * presence. Projects which use this code should instead copy this header - * and its accompanying .c file directly into their codebase. - ****/ - -/* This file defines a function that parses DER with various errors and - * violations. This is not a part of the library itself, because the allowed - * violations are chosen arbitrarily and do not follow or establish any - * standard. - * - * In many places it matters that different implementations do not only accept - * the same set of valid signatures, but also reject the same set of signatures. - * The only means to accomplish that is by strictly obeying a standard, and not - * accepting anything else. - * - * Nonetheless, sometimes there is a need for compatibility with systems that - * use signatures which do not strictly obey DER. The snippet below shows how - * certain violations are easily supported. You may need to adapt it. - * - * Do not use this for new systems. Use well-defined DER or compact signatures - * instead if you have the choice (see secp256k1_ecdsa_signature_parse_der and - * secp256k1_ecdsa_signature_parse_compact). - * - * The supported violations are: - * - All numbers are parsed as nonnegative integers, even though X.609-0207 - * section 8.3.3 specifies that integers are always encoded as two's - * complement. - * - Integers can have length 0, even though section 8.3.1 says they can't. - * - Integers with overly long padding are accepted, violation section - * 8.3.2. - * - 127-byte long length descriptors are accepted, even though section - * 8.1.3.5.c says that they are not. - * - Trailing garbage data inside or after the signature is ignored. - * - The length descriptor of the sequence is ignored. - * - * Compared to for example OpenSSL, many violations are NOT supported: - * - Using overly long tag descriptors for the sequence or integers inside, - * violating section 8.1.2.2. - * - Encoding primitive integers as constructed values, violating section - * 8.3.1. - */ - -#ifndef _SECP256K1_CONTRIB_LAX_DER_PARSING_H_ -#define _SECP256K1_CONTRIB_LAX_DER_PARSING_H_ - -#include - -# ifdef __cplusplus -extern "C" { -# endif - -/** Parse a signature in "lax DER" format - * - * Returns: 1 when the signature could be parsed, 0 otherwise. - * Args: ctx: a secp256k1 context object - * Out: sig: a pointer to a signature object - * In: input: a pointer to the signature to be parsed - * inputlen: the length of the array pointed to be input - * - * This function will accept any valid DER encoded signature, even if the - * encoded numbers are out of range. In addition, it will accept signatures - * which violate the DER spec in various ways. Its purpose is to allow - * validation of the Bitcoin blockchain, which includes non-DER signatures - * from before the network rules were updated to enforce DER. Note that - * the set of supported violations is a strict subset of what OpenSSL will - * accept. - * - * After the call, sig will always be initialized. If parsing failed or the - * encoded numbers are out of range, signature validation with it is - * guaranteed to fail for every message and public key. - */ -int ecdsa_signature_parse_der_lax( - const secp256k1_context* ctx, - secp256k1_ecdsa_signature* sig, - const unsigned char *input, - size_t inputlen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/external/libwally-core/src/secp256k1/contrib/lax_der_privatekey_parsing.c b/external/libwally-core/src/secp256k1/contrib/lax_der_privatekey_parsing.c deleted file mode 100644 index c2e63b4b8..000000000 --- a/external/libwally-core/src/secp256k1/contrib/lax_der_privatekey_parsing.c +++ /dev/null @@ -1,113 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014, 2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include -#include - -#include "lax_der_privatekey_parsing.h" - -int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { - const unsigned char *end = privkey + privkeylen; - int lenb = 0; - int len = 0; - memset(out32, 0, 32); - /* sequence header */ - if (end < privkey+1 || *privkey != 0x30) { - return 0; - } - privkey++; - /* sequence length constructor */ - if (end < privkey+1 || !(*privkey & 0x80)) { - return 0; - } - lenb = *privkey & ~0x80; privkey++; - if (lenb < 1 || lenb > 2) { - return 0; - } - if (end < privkey+lenb) { - return 0; - } - /* sequence length */ - len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); - privkey += lenb; - if (end < privkey+len) { - return 0; - } - /* sequence element 0: version number (=1) */ - if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { - return 0; - } - privkey += 3; - /* sequence element 1: octet string, up to 32 bytes */ - if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { - return 0; - } - memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]); - if (!secp256k1_ec_seckey_verify(ctx, out32)) { - memset(out32, 0, 32); - return 0; - } - return 1; -} - -int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { - secp256k1_pubkey pubkey; - size_t pubkeylen = 0; - if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { - *privkeylen = 0; - return 0; - } - if (compressed) { - static const unsigned char begin[] = { - 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 - }; - static const unsigned char middle[] = { - 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, - 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, - 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, - 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, - 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, - 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 - }; - unsigned char *ptr = privkey; - memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); - memcpy(ptr, key32, 32); ptr += 32; - memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - pubkeylen = 33; - secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED); - ptr += pubkeylen; - *privkeylen = ptr - privkey; - } else { - static const unsigned char begin[] = { - 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 - }; - static const unsigned char middle[] = { - 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, - 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, - 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, - 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, - 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, - 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, - 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, - 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 - }; - unsigned char *ptr = privkey; - memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); - memcpy(ptr, key32, 32); ptr += 32; - memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); - pubkeylen = 65; - secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED); - ptr += pubkeylen; - *privkeylen = ptr - privkey; - } - return 1; -} diff --git a/external/libwally-core/src/secp256k1/contrib/lax_der_privatekey_parsing.h b/external/libwally-core/src/secp256k1/contrib/lax_der_privatekey_parsing.h deleted file mode 100644 index 2fd088f8a..000000000 --- a/external/libwally-core/src/secp256k1/contrib/lax_der_privatekey_parsing.h +++ /dev/null @@ -1,90 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014, 2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -/**** - * Please do not link this file directly. It is not part of the libsecp256k1 - * project and does not promise any stability in its API, functionality or - * presence. Projects which use this code should instead copy this header - * and its accompanying .c file directly into their codebase. - ****/ - -/* This file contains code snippets that parse DER private keys with - * various errors and violations. This is not a part of the library - * itself, because the allowed violations are chosen arbitrarily and - * do not follow or establish any standard. - * - * It also contains code to serialize private keys in a compatible - * manner. - * - * These functions are meant for compatibility with applications - * that require BER encoded keys. When working with secp256k1-specific - * code, the simple 32-byte private keys normally used by the - * library are sufficient. - */ - -#ifndef _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_ -#define _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_ - -#include - -# ifdef __cplusplus -extern "C" { -# endif - -/** Export a private key in DER format. - * - * Returns: 1 if the private key was valid. - * Args: ctx: pointer to a context object, initialized for signing (cannot - * be NULL) - * Out: privkey: pointer to an array for storing the private key in BER. - * Should have space for 279 bytes, and cannot be NULL. - * privkeylen: Pointer to an int where the length of the private key in - * privkey will be stored. - * In: seckey: pointer to a 32-byte secret key to export. - * compressed: 1 if the key should be exported in - * compressed format, 0 otherwise - * - * This function is purely meant for compatibility with applications that - * require BER encoded keys. When working with secp256k1-specific code, the - * simple 32-byte private keys are sufficient. - * - * Note that this function does not guarantee correct DER output. It is - * guaranteed to be parsable by secp256k1_ec_privkey_import_der - */ -SECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der( - const secp256k1_context* ctx, - unsigned char *privkey, - size_t *privkeylen, - const unsigned char *seckey, - int compressed -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Import a private key in DER format. - * Returns: 1 if a private key was extracted. - * Args: ctx: pointer to a context object (cannot be NULL). - * Out: seckey: pointer to a 32-byte array for storing the private key. - * (cannot be NULL). - * In: privkey: pointer to a private key in DER format (cannot be NULL). - * privkeylen: length of the DER private key pointed to be privkey. - * - * This function will accept more than just strict DER, and even allow some BER - * violations. The public key stored inside the DER-encoded private key is not - * verified for correctness, nor are the curve parameters. Use this function - * only if you know in advance it is supposed to contain a secp256k1 private - * key. - */ -SECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der( - const secp256k1_context* ctx, - unsigned char *seckey, - const unsigned char *privkey, - size_t privkeylen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/external/libwally-core/src/secp256k1/include/secp256k1.h b/external/libwally-core/src/secp256k1/include/secp256k1.h deleted file mode 100644 index f268e309d..000000000 --- a/external/libwally-core/src/secp256k1/include/secp256k1.h +++ /dev/null @@ -1,577 +0,0 @@ -#ifndef _SECP256K1_ -# define _SECP256K1_ - -# ifdef __cplusplus -extern "C" { -# endif - -#include - -/* These rules specify the order of arguments in API calls: - * - * 1. Context pointers go first, followed by output arguments, combined - * output/input arguments, and finally input-only arguments. - * 2. Array lengths always immediately the follow the argument whose length - * they describe, even if this violates rule 1. - * 3. Within the OUT/OUTIN/IN groups, pointers to data that is typically generated - * later go first. This means: signatures, public nonces, private nonces, - * messages, public keys, secret keys, tweaks. - * 4. Arguments that are not data pointers go last, from more complex to less - * complex: function pointers, algorithm names, messages, void pointers, - * counts, flags, booleans. - * 5. Opaque data pointers follow the function pointer they are to be passed to. - */ - -/** Opaque data structure that holds context information (precomputed tables etc.). - * - * The purpose of context structures is to cache large precomputed data tables - * that are expensive to construct, and also to maintain the randomization data - * for blinding. - * - * Do not create a new context object for each operation, as construction is - * far slower than all other API calls (~100 times slower than an ECDSA - * verification). - * - * A constructed context can safely be used from multiple threads - * simultaneously, but API call that take a non-const pointer to a context - * need exclusive access to it. In particular this is the case for - * secp256k1_context_destroy and secp256k1_context_randomize. - * - * Regarding randomization, either do it once at creation time (in which case - * you do not need any locking for the other calls), or use a read-write lock. - */ -typedef struct secp256k1_context_struct secp256k1_context; - -/** Opaque data structure that holds a parsed and valid public key. - * - * The exact representation of data inside is implementation defined and not - * guaranteed to be portable between different platforms or versions. It is - * however guaranteed to be 64 bytes in size, and can be safely copied/moved. - * If you need to convert to a format suitable for storage, transmission, or - * comparison, use secp256k1_ec_pubkey_serialize and secp256k1_ec_pubkey_parse. - */ -typedef struct { - unsigned char data[64]; -} secp256k1_pubkey; - -/** Opaque data structured that holds a parsed ECDSA signature. - * - * The exact representation of data inside is implementation defined and not - * guaranteed to be portable between different platforms or versions. It is - * however guaranteed to be 64 bytes in size, and can be safely copied/moved. - * If you need to convert to a format suitable for storage, transmission, or - * comparison, use the secp256k1_ecdsa_signature_serialize_* and - * secp256k1_ecdsa_signature_serialize_* functions. - */ -typedef struct { - unsigned char data[64]; -} secp256k1_ecdsa_signature; - -/** A pointer to a function to deterministically generate a nonce. - * - * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. - * Out: nonce32: pointer to a 32-byte array to be filled by the function. - * In: msg32: the 32-byte message hash being verified (will not be NULL) - * key32: pointer to a 32-byte secret key (will not be NULL) - * algo16: pointer to a 16-byte array describing the signature - * algorithm (will be NULL for ECDSA for compatibility). - * data: Arbitrary data pointer that is passed through. - * attempt: how many iterations we have tried to find a nonce. - * This will almost always be 0, but different attempt values - * are required to result in a different nonce. - * - * Except for test cases, this function should compute some cryptographic hash of - * the message, the algorithm, the key and the attempt. - */ -typedef int (*secp256k1_nonce_function)( - unsigned char *nonce32, - const unsigned char *msg32, - const unsigned char *key32, - const unsigned char *algo16, - void *data, - unsigned int attempt -); - -# if !defined(SECP256K1_GNUC_PREREQ) -# if defined(__GNUC__)&&defined(__GNUC_MINOR__) -# define SECP256K1_GNUC_PREREQ(_maj,_min) \ - ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) -# else -# define SECP256K1_GNUC_PREREQ(_maj,_min) 0 -# endif -# endif - -# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) -# if SECP256K1_GNUC_PREREQ(2,7) -# define SECP256K1_INLINE __inline__ -# elif (defined(_MSC_VER)) -# define SECP256K1_INLINE __inline -# else -# define SECP256K1_INLINE -# endif -# else -# define SECP256K1_INLINE inline -# endif - -#ifndef SECP256K1_API -# if defined(_WIN32) -# ifdef SECP256K1_BUILD -# define SECP256K1_API __declspec(dllexport) -# else -# define SECP256K1_API -# endif -# elif defined(__GNUC__) && defined(SECP256K1_BUILD) -# define SECP256K1_API __attribute__ ((visibility ("default"))) -# else -# define SECP256K1_API -# endif -#endif - -/**Warning attributes - * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out - * some paranoid null checks. */ -# if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) -# define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) -# else -# define SECP256K1_WARN_UNUSED_RESULT -# endif -# if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) -# define SECP256K1_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) -# else -# define SECP256K1_ARG_NONNULL(_x) -# endif - -/** All flags' lower 8 bits indicate what they're for. Do not use directly. */ -#define SECP256K1_FLAGS_TYPE_MASK ((1 << 8) - 1) -#define SECP256K1_FLAGS_TYPE_CONTEXT (1 << 0) -#define SECP256K1_FLAGS_TYPE_COMPRESSION (1 << 1) -/** The higher bits contain the actual data. Do not use directly. */ -#define SECP256K1_FLAGS_BIT_CONTEXT_VERIFY (1 << 8) -#define SECP256K1_FLAGS_BIT_CONTEXT_SIGN (1 << 9) -#define SECP256K1_FLAGS_BIT_COMPRESSION (1 << 8) - -/** Flags to pass to secp256k1_context_create. */ -#define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) -#define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN) -#define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT) - -/** Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export. */ -#define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION) -#define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION) - -/** Create a secp256k1 context object. - * - * Returns: a newly created context object. - * In: flags: which parts of the context to initialize. - */ -SECP256K1_API secp256k1_context* secp256k1_context_create( - unsigned int flags -) SECP256K1_WARN_UNUSED_RESULT; - -/** Copies a secp256k1 context object. - * - * Returns: a newly created context object. - * Args: ctx: an existing context to copy (cannot be NULL) - */ -SECP256K1_API secp256k1_context* secp256k1_context_clone( - const secp256k1_context* ctx -) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT; - -/** Destroy a secp256k1 context object. - * - * The context pointer may not be used afterwards. - * Args: ctx: an existing context to destroy (cannot be NULL) - */ -SECP256K1_API void secp256k1_context_destroy( - secp256k1_context* ctx -); - -/** Set a callback function to be called when an illegal argument is passed to - * an API call. It will only trigger for violations that are mentioned - * explicitly in the header. - * - * The philosophy is that these shouldn't be dealt with through a - * specific return value, as calling code should not have branches to deal with - * the case that this code itself is broken. - * - * On the other hand, during debug stage, one would want to be informed about - * such mistakes, and the default (crashing) may be inadvisable. - * When this callback is triggered, the API function called is guaranteed not - * to cause a crash, though its return value and output arguments are - * undefined. - * - * Args: ctx: an existing context object (cannot be NULL) - * In: fun: a pointer to a function to call when an illegal argument is - * passed to the API, taking a message and an opaque pointer - * (NULL restores a default handler that calls abort). - * data: the opaque pointer to pass to fun above. - */ -SECP256K1_API void secp256k1_context_set_illegal_callback( - secp256k1_context* ctx, - void (*fun)(const char* message, void* data), - const void* data -) SECP256K1_ARG_NONNULL(1); - -/** Set a callback function to be called when an internal consistency check - * fails. The default is crashing. - * - * This can only trigger in case of a hardware failure, miscompilation, - * memory corruption, serious bug in the library, or other error would can - * otherwise result in undefined behaviour. It will not trigger due to mere - * incorrect usage of the API (see secp256k1_context_set_illegal_callback - * for that). After this callback returns, anything may happen, including - * crashing. - * - * Args: ctx: an existing context object (cannot be NULL) - * In: fun: a pointer to a function to call when an internal error occurs, - * taking a message and an opaque pointer (NULL restores a default - * handler that calls abort). - * data: the opaque pointer to pass to fun above. - */ -SECP256K1_API void secp256k1_context_set_error_callback( - secp256k1_context* ctx, - void (*fun)(const char* message, void* data), - const void* data -) SECP256K1_ARG_NONNULL(1); - -/** Parse a variable-length public key into the pubkey object. - * - * Returns: 1 if the public key was fully valid. - * 0 if the public key could not be parsed or is invalid. - * Args: ctx: a secp256k1 context object. - * Out: pubkey: pointer to a pubkey object. If 1 is returned, it is set to a - * parsed version of input. If not, its value is undefined. - * In: input: pointer to a serialized public key - * inputlen: length of the array pointed to by input - * - * This function supports parsing compressed (33 bytes, header byte 0x02 or - * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, header - * byte 0x06 or 0x07) format public keys. - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse( - const secp256k1_context* ctx, - secp256k1_pubkey* pubkey, - const unsigned char *input, - size_t inputlen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Serialize a pubkey object into a serialized byte sequence. - * - * Returns: 1 always. - * Args: ctx: a secp256k1 context object. - * Out: output: a pointer to a 65-byte (if compressed==0) or 33-byte (if - * compressed==1) byte array to place the serialized key - * in. - * In/Out: outputlen: a pointer to an integer which is initially set to the - * size of output, and is overwritten with the written - * size. - * In: pubkey: a pointer to a secp256k1_pubkey containing an - * initialized public key. - * flags: SECP256K1_EC_COMPRESSED if serialization should be in - * compressed format, otherwise SECP256K1_EC_UNCOMPRESSED. - */ -SECP256K1_API int secp256k1_ec_pubkey_serialize( - const secp256k1_context* ctx, - unsigned char *output, - size_t *outputlen, - const secp256k1_pubkey* pubkey, - unsigned int flags -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Parse an ECDSA signature in compact (64 bytes) format. - * - * Returns: 1 when the signature could be parsed, 0 otherwise. - * Args: ctx: a secp256k1 context object - * Out: sig: a pointer to a signature object - * In: input64: a pointer to the 64-byte array to parse - * - * The signature must consist of a 32-byte big endian R value, followed by a - * 32-byte big endian S value. If R or S fall outside of [0..order-1], the - * encoding is invalid. R and S with value 0 are allowed in the encoding. - * - * After the call, sig will always be initialized. If parsing failed or R or - * S are zero, the resulting sig value is guaranteed to fail validation for any - * message and public key. - */ -SECP256K1_API int secp256k1_ecdsa_signature_parse_compact( - const secp256k1_context* ctx, - secp256k1_ecdsa_signature* sig, - const unsigned char *input64 -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Parse a DER ECDSA signature. - * - * Returns: 1 when the signature could be parsed, 0 otherwise. - * Args: ctx: a secp256k1 context object - * Out: sig: a pointer to a signature object - * In: input: a pointer to the signature to be parsed - * inputlen: the length of the array pointed to be input - * - * This function will accept any valid DER encoded signature, even if the - * encoded numbers are out of range. - * - * After the call, sig will always be initialized. If parsing failed or the - * encoded numbers are out of range, signature validation with it is - * guaranteed to fail for every message and public key. - */ -SECP256K1_API int secp256k1_ecdsa_signature_parse_der( - const secp256k1_context* ctx, - secp256k1_ecdsa_signature* sig, - const unsigned char *input, - size_t inputlen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Serialize an ECDSA signature in DER format. - * - * Returns: 1 if enough space was available to serialize, 0 otherwise - * Args: ctx: a secp256k1 context object - * Out: output: a pointer to an array to store the DER serialization - * In/Out: outputlen: a pointer to a length integer. Initially, this integer - * should be set to the length of output. After the call - * it will be set to the length of the serialization (even - * if 0 was returned). - * In: sig: a pointer to an initialized signature object - */ -SECP256K1_API int secp256k1_ecdsa_signature_serialize_der( - const secp256k1_context* ctx, - unsigned char *output, - size_t *outputlen, - const secp256k1_ecdsa_signature* sig -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Serialize an ECDSA signature in compact (64 byte) format. - * - * Returns: 1 - * Args: ctx: a secp256k1 context object - * Out: output64: a pointer to a 64-byte array to store the compact serialization - * In: sig: a pointer to an initialized signature object - * - * See secp256k1_ecdsa_signature_parse_compact for details about the encoding. - */ -SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact( - const secp256k1_context* ctx, - unsigned char *output64, - const secp256k1_ecdsa_signature* sig -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Verify an ECDSA signature. - * - * Returns: 1: correct signature - * 0: incorrect or unparseable signature - * Args: ctx: a secp256k1 context object, initialized for verification. - * In: sig: the signature being verified (cannot be NULL) - * msg32: the 32-byte message hash being verified (cannot be NULL) - * pubkey: pointer to an initialized public key to verify with (cannot be NULL) - * - * To avoid accepting malleable signatures, only ECDSA signatures in lower-S - * form are accepted. - * - * If you need to accept ECDSA signatures from sources that do not obey this - * rule, apply secp256k1_ecdsa_signature_normalize to the signature prior to - * validation, but be aware that doing so results in malleable signatures. - * - * For details, see the comments for that function. - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( - const secp256k1_context* ctx, - const secp256k1_ecdsa_signature *sig, - const unsigned char *msg32, - const secp256k1_pubkey *pubkey -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Convert a signature to a normalized lower-S form. - * - * Returns: 1 if sigin was not normalized, 0 if it already was. - * Args: ctx: a secp256k1 context object - * Out: sigout: a pointer to a signature to fill with the normalized form, - * or copy if the input was already normalized. (can be NULL if - * you're only interested in whether the input was already - * normalized). - * In: sigin: a pointer to a signature to check/normalize (cannot be NULL, - * can be identical to sigout) - * - * With ECDSA a third-party can forge a second distinct signature of the same - * message, given a single initial signature, but without knowing the key. This - * is done by negating the S value modulo the order of the curve, 'flipping' - * the sign of the random point R which is not included in the signature. - * - * Forgery of the same message isn't universally problematic, but in systems - * where message malleability or uniqueness of signatures is important this can - * cause issues. This forgery can be blocked by all verifiers forcing signers - * to use a normalized form. - * - * The lower-S form reduces the size of signatures slightly on average when - * variable length encodings (such as DER) are used and is cheap to verify, - * making it a good choice. Security of always using lower-S is assured because - * anyone can trivially modify a signature after the fact to enforce this - * property anyway. - * - * The lower S value is always between 0x1 and - * 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, - * inclusive. - * - * No other forms of ECDSA malleability are known and none seem likely, but - * there is no formal proof that ECDSA, even with this additional restriction, - * is free of other malleability. Commonly used serialization schemes will also - * accept various non-unique encodings, so care should be taken when this - * property is required for an application. - * - * The secp256k1_ecdsa_sign function will by default create signatures in the - * lower-S form, and secp256k1_ecdsa_verify will not accept others. In case - * signatures come from a system that cannot enforce this property, - * secp256k1_ecdsa_signature_normalize must be called before verification. - */ -SECP256K1_API int secp256k1_ecdsa_signature_normalize( - const secp256k1_context* ctx, - secp256k1_ecdsa_signature *sigout, - const secp256k1_ecdsa_signature *sigin -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3); - -/** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. - * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of - * extra entropy. - */ -SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_rfc6979; - -/** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */ -SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_default; - -/** Create an ECDSA signature. - * - * Returns: 1: signature created - * 0: the nonce generation function failed, or the private key was invalid. - * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) - * In: msg32: the 32-byte message hash being signed (cannot be NULL) - * seckey: pointer to a 32-byte secret key (cannot be NULL) - * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used - * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) - * - * The created signature is always in lower-S form. See - * secp256k1_ecdsa_signature_normalize for more details. - */ -SECP256K1_API int secp256k1_ecdsa_sign( - const secp256k1_context* ctx, - secp256k1_ecdsa_signature *sig, - const unsigned char *msg32, - const unsigned char *seckey, - secp256k1_nonce_function noncefp, - const void *ndata -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Verify an ECDSA secret key. - * - * Returns: 1: secret key is valid - * 0: secret key is invalid - * Args: ctx: pointer to a context object (cannot be NULL) - * In: seckey: pointer to a 32-byte secret key (cannot be NULL) - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( - const secp256k1_context* ctx, - const unsigned char *seckey -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); - -/** Compute the public key for a secret key. - * - * Returns: 1: secret was valid, public key stores - * 0: secret was invalid, try again - * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * Out: pubkey: pointer to the created public key (cannot be NULL) - * In: seckey: pointer to a 32-byte private key (cannot be NULL) - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( - const secp256k1_context* ctx, - secp256k1_pubkey *pubkey, - const unsigned char *seckey -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Tweak a private key by adding tweak to it. - * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for - * uniformly random 32-byte arrays, or if the resulting private key - * would be invalid (only when the tweak is the complement of the - * private key). 1 otherwise. - * Args: ctx: pointer to a context object (cannot be NULL). - * In/Out: seckey: pointer to a 32-byte private key. - * In: tweak: pointer to a 32-byte tweak. - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( - const secp256k1_context* ctx, - unsigned char *seckey, - const unsigned char *tweak -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Tweak a public key by adding tweak times the generator to it. - * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for - * uniformly random 32-byte arrays, or if the resulting public key - * would be invalid (only when the tweak is the complement of the - * corresponding private key). 1 otherwise. - * Args: ctx: pointer to a context object initialized for validation - * (cannot be NULL). - * In/Out: pubkey: pointer to a public key object. - * In: tweak: pointer to a 32-byte tweak. - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( - const secp256k1_context* ctx, - secp256k1_pubkey *pubkey, - const unsigned char *tweak -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Tweak a private key by multiplying it by a tweak. - * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for - * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. - * Args: ctx: pointer to a context object (cannot be NULL). - * In/Out: seckey: pointer to a 32-byte private key. - * In: tweak: pointer to a 32-byte tweak. - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( - const secp256k1_context* ctx, - unsigned char *seckey, - const unsigned char *tweak -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Tweak a public key by multiplying it by a tweak value. - * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for - * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. - * Args: ctx: pointer to a context object initialized for validation - * (cannot be NULL). - * In/Out: pubkey: pointer to a public key obkect. - * In: tweak: pointer to a 32-byte tweak. - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( - const secp256k1_context* ctx, - secp256k1_pubkey *pubkey, - const unsigned char *tweak -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Updates the context randomization. - * Returns: 1: randomization successfully updated - * 0: error - * Args: ctx: pointer to a context object (cannot be NULL) - * In: seed32: pointer to a 32-byte random seed (NULL resets to initial state) - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( - secp256k1_context* ctx, - const unsigned char *seed32 -) SECP256K1_ARG_NONNULL(1); - -/** Add a number of public keys together. - * Returns: 1: the sum of the public keys is valid. - * 0: the sum of the public keys is not valid. - * Args: ctx: pointer to a context object - * Out: out: pointer to a public key object for placing the resulting public key - * (cannot be NULL) - * In: ins: pointer to array of pointers to public keys (cannot be NULL) - * n: the number of public keys to add together (must be at least 1) - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine( - const secp256k1_context* ctx, - secp256k1_pubkey *out, - const secp256k1_pubkey * const * ins, - size_t n -) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -# ifdef __cplusplus -} -# endif - -#endif diff --git a/external/libwally-core/src/secp256k1/include/secp256k1_ecdh.h b/external/libwally-core/src/secp256k1/include/secp256k1_ecdh.h deleted file mode 100644 index 4b84d7a96..000000000 --- a/external/libwally-core/src/secp256k1/include/secp256k1_ecdh.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _SECP256K1_ECDH_ -# define _SECP256K1_ECDH_ - -# include "secp256k1.h" - -# ifdef __cplusplus -extern "C" { -# endif - -/** Compute an EC Diffie-Hellman secret in constant time - * Returns: 1: exponentiation was successful - * 0: scalar was invalid (zero or overflow) - * Args: ctx: pointer to a context object (cannot be NULL) - * Out: result: a 32-byte array which will be populated by an ECDH - * secret computed from the point and scalar - * In: pubkey: a pointer to a secp256k1_pubkey containing an - * initialized public key - * privkey: a 32-byte scalar with which to multiply the point - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdh( - const secp256k1_context* ctx, - unsigned char *result, - const secp256k1_pubkey *pubkey, - const unsigned char *privkey -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -# ifdef __cplusplus -} -# endif - -#endif diff --git a/external/libwally-core/src/secp256k1/include/secp256k1_rangeproof.h b/external/libwally-core/src/secp256k1/include/secp256k1_rangeproof.h deleted file mode 100644 index 54b454ef6..000000000 --- a/external/libwally-core/src/secp256k1/include/secp256k1_rangeproof.h +++ /dev/null @@ -1,186 +0,0 @@ -#ifndef _SECP256K1_RANGEPROOF_ -# define _SECP256K1_RANGEPROOF_ - -# include "secp256k1.h" - -# ifdef __cplusplus -extern "C" { -# endif - -#include - -/** Initialize a context for usage with Pedersen commitments. */ -void secp256k1_pedersen_context_initialize(secp256k1_context* ctx); - -/** Generate a pedersen commitment. - * Returns 1: commitment successfully created. - * 0: error - * In: ctx: pointer to a context object, initialized for signing and Pedersen commitment (cannot be NULL) - * blind: pointer to a 32-byte blinding factor (cannot be NULL) - * value: unsigned 64-bit integer value to commit to. - * Out: commit: pointer to a 33-byte array for the commitment (cannot be NULL) - * - * Blinding factors can be generated and verified in the same way as secp256k1 private keys for ECDSA. - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_pedersen_commit( - const secp256k1_context* ctx, - unsigned char *commit, - unsigned char *blind, - uint64_t value -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Computes the sum of multiple positive and negative blinding factors. - * Returns 1: sum successfully computed. - * 0: error - * In: ctx: pointer to a context object (cannot be NULL) - * blinds: pointer to pointers to 32-byte character arrays for blinding factors. (cannot be NULL) - * n: number of factors pointed to by blinds. - * nneg: how many of the initial factors should be treated with a positive sign. - * Out: blind_out: pointer to a 32-byte array for the sum (cannot be NULL) - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_pedersen_blind_sum( - const secp256k1_context* ctx, - unsigned char *blind_out, - const unsigned char * const *blinds, - int n, - int npositive -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Verify a tally of pedersen commitments - * Returns 1: commitments successfully sum to zero. - * 0: Commitments do not sum to zero or other error. - * In: ctx: pointer to a context object, initialized for Pedersen commitment (cannot be NULL) - * commits: pointer to pointers to 33-byte character arrays for the commitments. (cannot be NULL if pcnt is non-zero) - * pcnt: number of commitments pointed to by commits. - * ncommits: pointer to pointers to 33-byte character arrays for negative commitments. (cannot be NULL if ncnt is non-zero) - * ncnt: number of commitments pointed to by ncommits. - * excess: signed 64bit amount to add to the total to bring it to zero, can be negative. - * - * This computes sum(commit[0..pcnt)) - sum(ncommit[0..ncnt)) - excess*H == 0. - * - * A pedersen commitment is xG + vH where G and H are generators for the secp256k1 group and x is a blinding factor, - * while v is the committed value. For a collection of commitments to sum to zero both their blinding factors and - * values must sum to zero. - * - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_pedersen_verify_tally( - const secp256k1_context* ctx, - const unsigned char * const *commits, - int pcnt, - const unsigned char * const *ncommits, - int ncnt, - int64_t excess -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); - -/** Initialize a context for usage with Pedersen commitments. */ -void secp256k1_rangeproof_context_initialize(secp256k1_context* ctx); - -/** Verify a proof that a committed value is within a range. - * Returns 1: Value is within the range [0..2^64), the specifically proven range is in the min/max value outputs. - * 0: Proof failed or other error. - * In: ctx: pointer to a context object, initialized for range-proof and commitment (cannot be NULL) - * commit: the 33-byte commitment being proved. (cannot be NULL) - * proof: pointer to character array with the proof. (cannot be NULL) - * plen: length of proof in bytes. - * Out: min_value: pointer to a unsigned int64 which will be updated with the minimum value that commit could have. (cannot be NULL) - * max_value: pointer to a unsigned int64 which will be updated with the maximum value that commit could have. (cannot be NULL) - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_rangeproof_verify( - const secp256k1_context* ctx, - uint64_t *min_value, - uint64_t *max_value, - const unsigned char *commit, - const unsigned char *proof, - int plen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); - -/** Verify a range proof proof and rewind the proof to recover information sent by its author. - * Returns 1: Value is within the range [0..2^64), the specifically proven range is in the min/max value outputs, and the value and blinding were recovered. - * 0: Proof failed, rewind failed, or other error. - * In: ctx: pointer to a context object, initialized for range-proof and Pedersen commitment (cannot be NULL) - * commit: the 33-byte commitment being proved. (cannot be NULL) - * proof: pointer to character array with the proof. (cannot be NULL) - * plen: length of proof in bytes. - * nonce: 32-byte secret nonce used by the prover (cannot be NULL) - * In/Out: blind_out: storage for the 32-byte blinding factor used for the commitment - * value_out: pointer to an unsigned int64 which has the exact value of the commitment. - * message_out: pointer to a 4096 byte character array to receive message data from the proof author. - * outlen: length of message data written to message_out. - * min_value: pointer to an unsigned int64 which will be updated with the minimum value that commit could have. (cannot be NULL) - * max_value: pointer to an unsigned int64 which will be updated with the maximum value that commit could have. (cannot be NULL) - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_rangeproof_rewind( - const secp256k1_context* ctx, - unsigned char *blind_out, - uint64_t *value_out, - unsigned char *message_out, - int *outlen, - const unsigned char *nonce, - uint64_t *min_value, - uint64_t *max_value, - const unsigned char *commit, - const unsigned char *proof, - int plen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(6) SECP256K1_ARG_NONNULL(7) SECP256K1_ARG_NONNULL(8) SECP256K1_ARG_NONNULL(9) SECP256K1_ARG_NONNULL(10); - -/** Author a proof that a committed value is within a range. - * Returns 1: Proof successfully created. - * 0: Error - * In: ctx: pointer to a context object, initialized for range-proof, signing, and Pedersen commitment (cannot be NULL) - * proof: pointer to array to receive the proof, can be up to 5134 bytes. (cannot be NULL) - * min_value: constructs a proof where the verifer can tell the minimum value is at least the specified amount. - * commit: 33-byte array with the commitment being proved. - * blind: 32-byte blinding factor used by commit. - * nonce: 32-byte secret nonce used to initialize the proof (value can be reverse-engineered out of the proof if this secret is known.) - * exp: Base-10 exponent. Digits below above will be made public, but the proof will be made smaller. Allowed range is -1 to 18. - * (-1 is a special case that makes the value public. 0 is the most private.) - * min_bits: Number of bits of the value to keep private. (0 = auto/minimal, - 64). - * value: Actual value of the commitment. - * In/out: plen: point to an integer with the size of the proof buffer and the size of the constructed proof. - * - * If min_value or exp is non-zero then the value must be on the range [0, 2^63) to prevent the proof range from spanning past 2^64. - * - * If exp is -1 the value is revealed by the proof (e.g. it proves that the proof is a blinding of a specific value, without revealing the blinding key.) - * - * This can randomly fail with probability around one in 2^100. If this happens, buy a lottery ticket and retry with a different nonce or blinding. - * - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_rangeproof_sign( - const secp256k1_context* ctx, - unsigned char *proof, - int *plen, - uint64_t min_value, - const unsigned char *commit, - const unsigned char *blind, - const unsigned char *nonce, - int exp, - int min_bits, - uint64_t value -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5) SECP256K1_ARG_NONNULL(6) SECP256K1_ARG_NONNULL(7); - -/** Extract some basic information from a range-proof. - * Returns 1: Information successfully extracted. - * 0: Decode failed. - * In: ctx: pointer to a context object - * proof: pointer to character array with the proof. - * plen: length of proof in bytes. - * Out: exp: Exponent used in the proof (-1 means the value isn't private). - * mantissa: Number of bits covered by the proof. - * min_value: pointer to an unsigned int64 which will be updated with the minimum value that commit could have. (cannot be NULL) - * max_value: pointer to an unsigned int64 which will be updated with the maximum value that commit could have. (cannot be NULL) - */ -SECP256K1_WARN_UNUSED_RESULT int secp256k1_rangeproof_info( - const secp256k1_context* ctx, - int *exp, - int *mantissa, - uint64_t *min_value, - uint64_t *max_value, - const unsigned char *proof, - int plen -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); - -# ifdef __cplusplus -} -# endif - -#endif diff --git a/external/libwally-core/src/secp256k1/include/secp256k1_recovery.h b/external/libwally-core/src/secp256k1/include/secp256k1_recovery.h deleted file mode 100644 index 055379725..000000000 --- a/external/libwally-core/src/secp256k1/include/secp256k1_recovery.h +++ /dev/null @@ -1,110 +0,0 @@ -#ifndef _SECP256K1_RECOVERY_ -# define _SECP256K1_RECOVERY_ - -# include "secp256k1.h" - -# ifdef __cplusplus -extern "C" { -# endif - -/** Opaque data structured that holds a parsed ECDSA signature, - * supporting pubkey recovery. - * - * The exact representation of data inside is implementation defined and not - * guaranteed to be portable between different platforms or versions. It is - * however guaranteed to be 65 bytes in size, and can be safely copied/moved. - * If you need to convert to a format suitable for storage or transmission, use - * the secp256k1_ecdsa_signature_serialize_* and - * secp256k1_ecdsa_signature_parse_* functions. - * - * Furthermore, it is guaranteed that identical signatures (including their - * recoverability) will have identical representation, so they can be - * memcmp'ed. - */ -typedef struct { - unsigned char data[65]; -} secp256k1_ecdsa_recoverable_signature; - -/** Parse a compact ECDSA signature (64 bytes + recovery id). - * - * Returns: 1 when the signature could be parsed, 0 otherwise - * Args: ctx: a secp256k1 context object - * Out: sig: a pointer to a signature object - * In: input64: a pointer to a 64-byte compact signature - * recid: the recovery id (0, 1, 2 or 3) - */ -SECP256K1_API int secp256k1_ecdsa_recoverable_signature_parse_compact( - const secp256k1_context* ctx, - secp256k1_ecdsa_recoverable_signature* sig, - const unsigned char *input64, - int recid -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Convert a recoverable signature into a normal signature. - * - * Returns: 1 - * Out: sig: a pointer to a normal signature (cannot be NULL). - * In: sigin: a pointer to a recoverable signature (cannot be NULL). - */ -SECP256K1_API int secp256k1_ecdsa_recoverable_signature_convert( - const secp256k1_context* ctx, - secp256k1_ecdsa_signature* sig, - const secp256k1_ecdsa_recoverable_signature* sigin -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Serialize an ECDSA signature in compact format (64 bytes + recovery id). - * - * Returns: 1 - * Args: ctx: a secp256k1 context object - * Out: output64: a pointer to a 64-byte array of the compact signature (cannot be NULL) - * recid: a pointer to an integer to hold the recovery id (can be NULL). - * In: sig: a pointer to an initialized signature object (cannot be NULL) - */ -SECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact( - const secp256k1_context* ctx, - unsigned char *output64, - int *recid, - const secp256k1_ecdsa_recoverable_signature* sig -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Create a recoverable ECDSA signature. - * - * Returns: 1: signature created - * 0: the nonce generation function failed, or the private key was invalid. - * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) - * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) - * In: msg32: the 32-byte message hash being signed (cannot be NULL) - * seckey: pointer to a 32-byte secret key (cannot be NULL) - * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used - * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) - */ -SECP256K1_API int secp256k1_ecdsa_sign_recoverable( - const secp256k1_context* ctx, - secp256k1_ecdsa_recoverable_signature *sig, - const unsigned char *msg32, - const unsigned char *seckey, - secp256k1_nonce_function noncefp, - const void *ndata -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Recover an ECDSA public key from a signature. - * - * Returns: 1: public key successfully recovered (which guarantees a correct signature). - * 0: otherwise. - * Args: ctx: pointer to a context object, initialized for verification (cannot be NULL) - * Out: pubkey: pointer to the recovered public key (cannot be NULL) - * In: sig: pointer to initialized signature that supports pubkey recovery (cannot be NULL) - * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover( - const secp256k1_context* ctx, - secp256k1_pubkey *pubkey, - const secp256k1_ecdsa_recoverable_signature *sig, - const unsigned char *msg32 -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -# ifdef __cplusplus -} -# endif - -#endif diff --git a/external/libwally-core/src/secp256k1/include/secp256k1_schnorr.h b/external/libwally-core/src/secp256k1/include/secp256k1_schnorr.h deleted file mode 100644 index dc32fec1e..000000000 --- a/external/libwally-core/src/secp256k1/include/secp256k1_schnorr.h +++ /dev/null @@ -1,173 +0,0 @@ -#ifndef _SECP256K1_SCHNORR_ -# define _SECP256K1_SCHNORR_ - -# include "secp256k1.h" - -# ifdef __cplusplus -extern "C" { -# endif - -/** Create a signature using a custom EC-Schnorr-SHA256 construction. It - * produces non-malleable 64-byte signatures which support public key recovery - * batch validation, and multiparty signing. - * Returns: 1: signature created - * 0: the nonce generation function failed, or the private key was - * invalid. - * Args: ctx: pointer to a context object, initialized for signing - * (cannot be NULL) - * Out: sig64: pointer to a 64-byte array where the signature will be - * placed (cannot be NULL) - * In: msg32: the 32-byte message hash being signed (cannot be NULL) - * seckey: pointer to a 32-byte secret key (cannot be NULL) - * noncefp:pointer to a nonce generation function. If NULL, - * secp256k1_nonce_function_default is used - * ndata: pointer to arbitrary data used by the nonce generation - * function (can be NULL) - */ -SECP256K1_API int secp256k1_schnorr_sign( - const secp256k1_context* ctx, - unsigned char *sig64, - const unsigned char *msg32, - const unsigned char *seckey, - secp256k1_nonce_function noncefp, - const void *ndata -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Verify a signature created by secp256k1_schnorr_sign. - * Returns: 1: correct signature - * 0: incorrect signature - * Args: ctx: a secp256k1 context object, initialized for verification. - * In: sig64: the 64-byte signature being verified (cannot be NULL) - * msg32: the 32-byte message hash being verified (cannot be NULL) - * pubkey: the public key to verify with (cannot be NULL) - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_schnorr_verify( - const secp256k1_context* ctx, - const unsigned char *sig64, - const unsigned char *msg32, - const secp256k1_pubkey *pubkey -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Recover an EC public key from a Schnorr signature created using - * secp256k1_schnorr_sign. - * Returns: 1: public key successfully recovered (which guarantees a correct - * signature). - * 0: otherwise. - * Args: ctx: pointer to a context object, initialized for - * verification (cannot be NULL) - * Out: pubkey: pointer to a pubkey to set to the recovered public key - * (cannot be NULL). - * In: sig64: signature as 64 byte array (cannot be NULL) - * msg32: the 32-byte message hash assumed to be signed (cannot - * be NULL) - */ -SECP256K1_API int secp256k1_schnorr_recover( - const secp256k1_context* ctx, - secp256k1_pubkey *pubkey, - const unsigned char *sig64, - const unsigned char *msg32 -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); - -/** Generate a nonce pair deterministically for use with - * secp256k1_schnorr_partial_sign. - * Returns: 1: valid nonce pair was generated. - * 0: otherwise (nonce generation function failed) - * Args: ctx: pointer to a context object, initialized for signing - * (cannot be NULL) - * Out: pubnonce: public side of the nonce (cannot be NULL) - * privnonce32: private side of the nonce (32 byte) (cannot be NULL) - * In: msg32: the 32-byte message hash assumed to be signed (cannot - * be NULL) - * sec32: the 32-byte private key (cannot be NULL) - * noncefp: pointer to a nonce generation function. If NULL, - * secp256k1_nonce_function_default is used - * noncedata: pointer to arbitrary data used by the nonce generation - * function (can be NULL) - * - * Do not use the output as a private/public key pair for signing/validation. - */ -SECP256K1_API int secp256k1_schnorr_generate_nonce_pair( - const secp256k1_context* ctx, - secp256k1_pubkey *pubnonce, - unsigned char *privnonce32, - const unsigned char *msg32, - const unsigned char *sec32, - secp256k1_nonce_function noncefp, - const void* noncedata -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -/** Produce a partial Schnorr signature, which can be combined using - * secp256k1_schnorr_partial_combine, to end up with a full signature that is - * verifiable using secp256k1_schnorr_verify. - * Returns: 1: signature created successfully. - * 0: no valid signature exists with this combination of keys, nonces - * and message (chance around 1 in 2^128) - * -1: invalid private key, nonce, or public nonces. - * Args: ctx: pointer to context object, initialized for signing (cannot - * be NULL) - * Out: sig64: pointer to 64-byte array to put partial signature in - * In: msg32: pointer to 32-byte message to sign - * sec32: pointer to 32-byte private key - * pubnonce_others: pointer to pubkey containing the sum of the other's - * nonces (see secp256k1_ec_pubkey_combine) - * secnonce32: pointer to 32-byte array containing our nonce - * - * The intended procedure for creating a multiparty signature is: - * - Each signer S[i] with private key x[i] and public key Q[i] runs - * secp256k1_schnorr_generate_nonce_pair to produce a pair (k[i],R[i]) of - * private/public nonces. - * - All signers communicate their public nonces to each other (revealing your - * private nonce can lead to discovery of your private key, so it should be - * considered secret). - * - All signers combine all the public nonces they received (excluding their - * own) using secp256k1_ec_pubkey_combine to obtain an - * Rall[i] = sum(R[0..i-1,i+1..n]). - * - All signers produce a partial signature using - * secp256k1_schnorr_partial_sign, passing in their own private key x[i], - * their own private nonce k[i], and the sum of the others' public nonces - * Rall[i]. - * - All signers communicate their partial signatures to each other. - * - Someone combines all partial signatures using - * secp256k1_schnorr_partial_combine, to obtain a full signature. - * - The resulting signature is validatable using secp256k1_schnorr_verify, with - * public key equal to the result of secp256k1_ec_pubkey_combine of the - * signers' public keys (sum(Q[0..n])). - * - * Note that secp256k1_schnorr_partial_combine and secp256k1_ec_pubkey_combine - * function take their arguments in any order, and it is possible to - * pre-combine several inputs already with one call, and add more inputs later - * by calling the function again (they are commutative and associative). - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_schnorr_partial_sign( - const secp256k1_context* ctx, - unsigned char *sig64, - const unsigned char *msg32, - const unsigned char *sec32, - const secp256k1_pubkey *pubnonce_others, - const unsigned char *secnonce32 -) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5) SECP256K1_ARG_NONNULL(6); - -/** Combine multiple Schnorr partial signatures. - * Returns: 1: the passed signatures were successfully combined. - * 0: the resulting signature is not valid (chance of 1 in 2^256) - * -1: some inputs were invalid, or the signatures were not created - * using the same set of nonces - * Args: ctx: pointer to a context object - * Out: sig64: pointer to a 64-byte array to place the combined signature - * (cannot be NULL) - * In: sig64sin: pointer to an array of n pointers to 64-byte input - * signatures - * n: the number of signatures to combine (at least 1) - */ -SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_schnorr_partial_combine( - const secp256k1_context* ctx, - unsigned char *sig64, - const unsigned char * const * sig64sin, - size_t n -) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); - -# ifdef __cplusplus -} -# endif - -#endif diff --git a/external/libwally-core/src/secp256k1/libsecp256k1.pc.in b/external/libwally-core/src/secp256k1/libsecp256k1.pc.in deleted file mode 100644 index a0d006f11..000000000 --- a/external/libwally-core/src/secp256k1/libsecp256k1.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libsecp256k1 -Description: Optimized C library for EC operations on curve secp256k1 -URL: https://github.com/bitcoin-core/secp256k1 -Version: @PACKAGE_VERSION@ -Cflags: -I${includedir} -Libs.private: @SECP_LIBS@ -Libs: -L${libdir} -lsecp256k1 - diff --git a/external/libwally-core/src/secp256k1/obj/.gitignore b/external/libwally-core/src/secp256k1/obj/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/external/libwally-core/src/secp256k1/sage/group_prover.sage b/external/libwally-core/src/secp256k1/sage/group_prover.sage deleted file mode 100644 index ab580c5b2..000000000 --- a/external/libwally-core/src/secp256k1/sage/group_prover.sage +++ /dev/null @@ -1,322 +0,0 @@ -# This code supports verifying group implementations which have branches -# or conditional statements (like cmovs), by allowing each execution path -# to independently set assumptions on input or intermediary variables. -# -# The general approach is: -# * A constraint is a tuple of two sets of of symbolic expressions: -# the first of which are required to evaluate to zero, the second of which -# are required to evaluate to nonzero. -# - A constraint is said to be conflicting if any of its nonzero expressions -# is in the ideal with basis the zero expressions (in other words: when the -# zero expressions imply that one of the nonzero expressions are zero). -# * There is a list of laws that describe the intended behaviour, including -# laws for addition and doubling. Each law is called with the symbolic point -# coordinates as arguments, and returns: -# - A constraint describing the assumptions under which it is applicable, -# called "assumeLaw" -# - A constraint describing the requirements of the law, called "require" -# * Implementations are transliterated into functions that operate as well on -# algebraic input points, and are called once per combination of branches -# exectured. Each execution returns: -# - A constraint describing the assumptions this implementation requires -# (such as Z1=1), called "assumeFormula" -# - A constraint describing the assumptions this specific branch requires, -# but which is by construction guaranteed to cover the entire space by -# merging the results from all branches, called "assumeBranch" -# - The result of the computation -# * All combinations of laws with implementation branches are tried, and: -# - If the combination of assumeLaw, assumeFormula, and assumeBranch results -# in a conflict, it means this law does not apply to this branch, and it is -# skipped. -# - For others, we try to prove the require constraints hold, assuming the -# information in assumeLaw + assumeFormula + assumeBranch, and if this does -# not succeed, we fail. -# + To prove an expression is zero, we check whether it belongs to the -# ideal with the assumed zero expressions as basis. This test is exact. -# + To prove an expression is nonzero, we check whether each of its -# factors is contained in the set of nonzero assumptions' factors. -# This test is not exact, so various combinations of original and -# reduced expressions' factors are tried. -# - If we succeed, we print out the assumptions from assumeFormula that -# weren't implied by assumeLaw already. Those from assumeBranch are skipped, -# as we assume that all constraints in it are complementary with each other. -# -# Based on the sage verification scripts used in the Explicit-Formulas Database -# by Tanja Lange and others, see http://hyperelliptic.org/EFD - -class fastfrac: - """Fractions over rings.""" - - def __init__(self,R,top,bot=1): - """Construct a fractional, given a ring, a numerator, and denominator.""" - self.R = R - if parent(top) == ZZ or parent(top) == R: - self.top = R(top) - self.bot = R(bot) - elif top.__class__ == fastfrac: - self.top = top.top - self.bot = top.bot * bot - else: - self.top = R(numerator(top)) - self.bot = R(denominator(top)) * bot - - def iszero(self,I): - """Return whether this fraction is zero given an ideal.""" - return self.top in I and self.bot not in I - - def reduce(self,assumeZero): - zero = self.R.ideal(map(numerator, assumeZero)) - return fastfrac(self.R, zero.reduce(self.top)) / fastfrac(self.R, zero.reduce(self.bot)) - - def __add__(self,other): - """Add two fractions.""" - if parent(other) == ZZ: - return fastfrac(self.R,self.top + self.bot * other,self.bot) - if other.__class__ == fastfrac: - return fastfrac(self.R,self.top * other.bot + self.bot * other.top,self.bot * other.bot) - return NotImplemented - - def __sub__(self,other): - """Subtract two fractions.""" - if parent(other) == ZZ: - return fastfrac(self.R,self.top - self.bot * other,self.bot) - if other.__class__ == fastfrac: - return fastfrac(self.R,self.top * other.bot - self.bot * other.top,self.bot * other.bot) - return NotImplemented - - def __neg__(self): - """Return the negation of a fraction.""" - return fastfrac(self.R,-self.top,self.bot) - - def __mul__(self,other): - """Multiply two fractions.""" - if parent(other) == ZZ: - return fastfrac(self.R,self.top * other,self.bot) - if other.__class__ == fastfrac: - return fastfrac(self.R,self.top * other.top,self.bot * other.bot) - return NotImplemented - - def __rmul__(self,other): - """Multiply something else with a fraction.""" - return self.__mul__(other) - - def __div__(self,other): - """Divide two fractions.""" - if parent(other) == ZZ: - return fastfrac(self.R,self.top,self.bot * other) - if other.__class__ == fastfrac: - return fastfrac(self.R,self.top * other.bot,self.bot * other.top) - return NotImplemented - - def __pow__(self,other): - """Compute a power of a fraction.""" - if parent(other) == ZZ: - if other < 0: - # Negative powers require flipping top and bottom - return fastfrac(self.R,self.bot ^ (-other),self.top ^ (-other)) - else: - return fastfrac(self.R,self.top ^ other,self.bot ^ other) - return NotImplemented - - def __str__(self): - return "fastfrac((" + str(self.top) + ") / (" + str(self.bot) + "))" - def __repr__(self): - return "%s" % self - - def numerator(self): - return self.top - -class constraints: - """A set of constraints, consisting of zero and nonzero expressions. - - Constraints can either be used to express knowledge or a requirement. - - Both the fields zero and nonzero are maps from expressions to description - strings. The expressions that are the keys in zero are required to be zero, - and the expressions that are the keys in nonzero are required to be nonzero. - - Note that (a != 0) and (b != 0) is the same as (a*b != 0), so all keys in - nonzero could be multiplied into a single key. This is often much less - efficient to work with though, so we keep them separate inside the - constraints. This allows higher-level code to do fast checks on the individual - nonzero elements, or combine them if needed for stronger checks. - - We can't multiply the different zero elements, as it would suffice for one of - the factors to be zero, instead of all of them. Instead, the zero elements are - typically combined into an ideal first. - """ - - def __init__(self, **kwargs): - if 'zero' in kwargs: - self.zero = dict(kwargs['zero']) - else: - self.zero = dict() - if 'nonzero' in kwargs: - self.nonzero = dict(kwargs['nonzero']) - else: - self.nonzero = dict() - - def negate(self): - return constraints(zero=self.nonzero, nonzero=self.zero) - - def __add__(self, other): - zero = self.zero.copy() - zero.update(other.zero) - nonzero = self.nonzero.copy() - nonzero.update(other.nonzero) - return constraints(zero=zero, nonzero=nonzero) - - def __str__(self): - return "constraints(zero=%s,nonzero=%s)" % (self.zero, self.nonzero) - - def __repr__(self): - return "%s" % self - - -def conflicts(R, con): - """Check whether any of the passed non-zero assumptions is implied by the zero assumptions""" - zero = R.ideal(map(numerator, con.zero)) - if 1 in zero: - return True - # First a cheap check whether any of the individual nonzero terms conflict on - # their own. - for nonzero in con.nonzero: - if nonzero.iszero(zero): - return True - # It can be the case that entries in the nonzero set do not individually - # conflict with the zero set, but their combination does. For example, knowing - # that either x or y is zero is equivalent to having x*y in the zero set. - # Having x or y individually in the nonzero set is not a conflict, but both - # simultaneously is, so that is the right thing to check for. - if reduce(lambda a,b: a * b, con.nonzero, fastfrac(R, 1)).iszero(zero): - return True - return False - - -def get_nonzero_set(R, assume): - """Calculate a simple set of nonzero expressions""" - zero = R.ideal(map(numerator, assume.zero)) - nonzero = set() - for nz in map(numerator, assume.nonzero): - for (f,n) in nz.factor(): - nonzero.add(f) - rnz = zero.reduce(nz) - for (f,n) in rnz.factor(): - nonzero.add(f) - return nonzero - - -def prove_nonzero(R, exprs, assume): - """Check whether an expression is provably nonzero, given assumptions""" - zero = R.ideal(map(numerator, assume.zero)) - nonzero = get_nonzero_set(R, assume) - expl = set() - ok = True - for expr in exprs: - if numerator(expr) in zero: - return (False, [exprs[expr]]) - allexprs = reduce(lambda a,b: numerator(a)*numerator(b), exprs, 1) - for (f, n) in allexprs.factor(): - if f not in nonzero: - ok = False - if ok: - return (True, None) - ok = True - for (f, n) in zero.reduce(numerator(allexprs)).factor(): - if f not in nonzero: - ok = False - if ok: - return (True, None) - ok = True - for expr in exprs: - for (f,n) in numerator(expr).factor(): - if f not in nonzero: - ok = False - if ok: - return (True, None) - ok = True - for expr in exprs: - for (f,n) in zero.reduce(numerator(expr)).factor(): - if f not in nonzero: - expl.add(exprs[expr]) - if expl: - return (False, list(expl)) - else: - return (True, None) - - -def prove_zero(R, exprs, assume): - """Check whether all of the passed expressions are provably zero, given assumptions""" - r, e = prove_nonzero(R, dict(map(lambda x: (fastfrac(R, x.bot, 1), exprs[x]), exprs)), assume) - if not r: - return (False, map(lambda x: "Possibly zero denominator: %s" % x, e)) - zero = R.ideal(map(numerator, assume.zero)) - nonzero = prod(x for x in assume.nonzero) - expl = [] - for expr in exprs: - if not expr.iszero(zero): - expl.append(exprs[expr]) - if not expl: - return (True, None) - return (False, expl) - - -def describe_extra(R, assume, assumeExtra): - """Describe what assumptions are added, given existing assumptions""" - zerox = assume.zero.copy() - zerox.update(assumeExtra.zero) - zero = R.ideal(map(numerator, assume.zero)) - zeroextra = R.ideal(map(numerator, zerox)) - nonzero = get_nonzero_set(R, assume) - ret = set() - # Iterate over the extra zero expressions - for base in assumeExtra.zero: - if base not in zero: - add = [] - for (f, n) in numerator(base).factor(): - if f not in nonzero: - add += ["%s" % f] - if add: - ret.add((" * ".join(add)) + " = 0 [%s]" % assumeExtra.zero[base]) - # Iterate over the extra nonzero expressions - for nz in assumeExtra.nonzero: - nzr = zeroextra.reduce(numerator(nz)) - if nzr not in zeroextra: - for (f,n) in nzr.factor(): - if zeroextra.reduce(f) not in nonzero: - ret.add("%s != 0" % zeroextra.reduce(f)) - return ", ".join(x for x in ret) - - -def check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require): - """Check a set of zero and nonzero requirements, given a set of zero and nonzero assumptions""" - assume = assumeLaw + assumeAssert + assumeBranch - - if conflicts(R, assume): - # This formula does not apply - return None - - describe = describe_extra(R, assumeLaw + assumeBranch, assumeAssert) - - ok, msg = prove_zero(R, require.zero, assume) - if not ok: - return "FAIL, %s fails (assuming %s)" % (str(msg), describe) - - res, expl = prove_nonzero(R, require.nonzero, assume) - if not res: - return "FAIL, %s fails (assuming %s)" % (str(expl), describe) - - if describe != "": - return "OK (assuming %s)" % describe - else: - return "OK" - - -def concrete_verify(c): - for k in c.zero: - if k != 0: - return (False, c.zero[k]) - for k in c.nonzero: - if k == 0: - return (False, c.nonzero[k]) - return (True, None) diff --git a/external/libwally-core/src/secp256k1/sage/secp256k1.sage b/external/libwally-core/src/secp256k1/sage/secp256k1.sage deleted file mode 100644 index a97e732f7..000000000 --- a/external/libwally-core/src/secp256k1/sage/secp256k1.sage +++ /dev/null @@ -1,306 +0,0 @@ -# Test libsecp256k1' group operation implementations using prover.sage - -import sys - -load("group_prover.sage") -load("weierstrass_prover.sage") - -def formula_secp256k1_gej_double_var(a): - """libsecp256k1's secp256k1_gej_double_var, used by various addition functions""" - rz = a.Z * a.Y - rz = rz * 2 - t1 = a.X^2 - t1 = t1 * 3 - t2 = t1^2 - t3 = a.Y^2 - t3 = t3 * 2 - t4 = t3^2 - t4 = t4 * 2 - t3 = t3 * a.X - rx = t3 - rx = rx * 4 - rx = -rx - rx = rx + t2 - t2 = -t2 - t3 = t3 * 6 - t3 = t3 + t2 - ry = t1 * t3 - t2 = -t4 - ry = ry + t2 - return jacobianpoint(rx, ry, rz) - -def formula_secp256k1_gej_add_var(branch, a, b): - """libsecp256k1's secp256k1_gej_add_var""" - if branch == 0: - return (constraints(), constraints(nonzero={a.Infinity : 'a_infinite'}), b) - if branch == 1: - return (constraints(), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) - z22 = b.Z^2 - z12 = a.Z^2 - u1 = a.X * z22 - u2 = b.X * z12 - s1 = a.Y * z22 - s1 = s1 * b.Z - s2 = b.Y * z12 - s2 = s2 * a.Z - h = -u1 - h = h + u2 - i = -s1 - i = i + s2 - if branch == 2: - r = formula_secp256k1_gej_double_var(a) - return (constraints(), constraints(zero={h : 'h=0', i : 'i=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}), r) - if branch == 3: - return (constraints(), constraints(zero={h : 'h=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={i : 'i!=0'}), point_at_infinity()) - i2 = i^2 - h2 = h^2 - h3 = h2 * h - h = h * b.Z - rz = a.Z * h - t = u1 * h2 - rx = t - rx = rx * 2 - rx = rx + h3 - rx = -rx - rx = rx + i2 - ry = -rx - ry = ry + t - ry = ry * i - h3 = h3 * s1 - h3 = -h3 - ry = ry + h3 - return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) - -def formula_secp256k1_gej_add_ge_var(branch, a, b): - """libsecp256k1's secp256k1_gej_add_ge_var, which assume bz==1""" - if branch == 0: - return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(nonzero={a.Infinity : 'a_infinite'}), b) - if branch == 1: - return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) - z12 = a.Z^2 - u1 = a.X - u2 = b.X * z12 - s1 = a.Y - s2 = b.Y * z12 - s2 = s2 * a.Z - h = -u1 - h = h + u2 - i = -s1 - i = i + s2 - if (branch == 2): - r = formula_secp256k1_gej_double_var(a) - return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) - if (branch == 3): - return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) - i2 = i^2 - h2 = h^2 - h3 = h * h2 - rz = a.Z * h - t = u1 * h2 - rx = t - rx = rx * 2 - rx = rx + h3 - rx = -rx - rx = rx + i2 - ry = -rx - ry = ry + t - ry = ry * i - h3 = h3 * s1 - h3 = -h3 - ry = ry + h3 - return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) - -def formula_secp256k1_gej_add_zinv_var(branch, a, b): - """libsecp256k1's secp256k1_gej_add_zinv_var""" - bzinv = b.Z^(-1) - if branch == 0: - return (constraints(), constraints(nonzero={b.Infinity : 'b_infinite'}), a) - if branch == 1: - bzinv2 = bzinv^2 - bzinv3 = bzinv2 * bzinv - rx = b.X * bzinv2 - ry = b.Y * bzinv3 - rz = 1 - return (constraints(), constraints(zero={b.Infinity : 'b_finite'}, nonzero={a.Infinity : 'a_infinite'}), jacobianpoint(rx, ry, rz)) - azz = a.Z * bzinv - z12 = azz^2 - u1 = a.X - u2 = b.X * z12 - s1 = a.Y - s2 = b.Y * z12 - s2 = s2 * azz - h = -u1 - h = h + u2 - i = -s1 - i = i + s2 - if branch == 2: - r = formula_secp256k1_gej_double_var(a) - return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) - if branch == 3: - return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) - i2 = i^2 - h2 = h^2 - h3 = h * h2 - rz = a.Z - rz = rz * h - t = u1 * h2 - rx = t - rx = rx * 2 - rx = rx + h3 - rx = -rx - rx = rx + i2 - ry = -rx - ry = ry + t - ry = ry * i - h3 = h3 * s1 - h3 = -h3 - ry = ry + h3 - return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) - -def formula_secp256k1_gej_add_ge(branch, a, b): - """libsecp256k1's secp256k1_gej_add_ge""" - zeroes = {} - nonzeroes = {} - a_infinity = False - if (branch & 4) != 0: - nonzeroes.update({a.Infinity : 'a_infinite'}) - a_infinity = True - else: - zeroes.update({a.Infinity : 'a_finite'}) - zz = a.Z^2 - u1 = a.X - u2 = b.X * zz - s1 = a.Y - s2 = b.Y * zz - s2 = s2 * a.Z - t = u1 - t = t + u2 - m = s1 - m = m + s2 - rr = t^2 - m_alt = -u2 - tt = u1 * m_alt - rr = rr + tt - degenerate = (branch & 3) == 3 - if (branch & 1) != 0: - zeroes.update({m : 'm_zero'}) - else: - nonzeroes.update({m : 'm_nonzero'}) - if (branch & 2) != 0: - zeroes.update({rr : 'rr_zero'}) - else: - nonzeroes.update({rr : 'rr_nonzero'}) - rr_alt = s1 - rr_alt = rr_alt * 2 - m_alt = m_alt + u1 - if not degenerate: - rr_alt = rr - m_alt = m - n = m_alt^2 - q = n * t - n = n^2 - if degenerate: - n = m - t = rr_alt^2 - rz = a.Z * m_alt - infinity = False - if (branch & 8) != 0: - if not a_infinity: - infinity = True - zeroes.update({rz : 'r.z=0'}) - else: - nonzeroes.update({rz : 'r.z!=0'}) - rz = rz * 2 - q = -q - t = t + q - rx = t - t = t * 2 - t = t + q - t = t * rr_alt - t = t + n - ry = -t - rx = rx * 4 - ry = ry * 4 - if a_infinity: - rx = b.X - ry = b.Y - rz = 1 - if infinity: - return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), point_at_infinity()) - return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), jacobianpoint(rx, ry, rz)) - -def formula_secp256k1_gej_add_ge_old(branch, a, b): - """libsecp256k1's old secp256k1_gej_add_ge, which fails when ay+by=0 but ax!=bx""" - a_infinity = (branch & 1) != 0 - zero = {} - nonzero = {} - if a_infinity: - nonzero.update({a.Infinity : 'a_infinite'}) - else: - zero.update({a.Infinity : 'a_finite'}) - zz = a.Z^2 - u1 = a.X - u2 = b.X * zz - s1 = a.Y - s2 = b.Y * zz - s2 = s2 * a.Z - z = a.Z - t = u1 - t = t + u2 - m = s1 - m = m + s2 - n = m^2 - q = n * t - n = n^2 - rr = t^2 - t = u1 * u2 - t = -t - rr = rr + t - t = rr^2 - rz = m * z - infinity = False - if (branch & 2) != 0: - if not a_infinity: - infinity = True - else: - return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(nonzero={z : 'conflict_a'}, zero={z : 'conflict_b'}), point_at_infinity()) - zero.update({rz : 'r.z=0'}) - else: - nonzero.update({rz : 'r.z!=0'}) - rz = rz * (0 if a_infinity else 2) - rx = t - q = -q - rx = rx + q - q = q * 3 - t = t * 2 - t = t + q - t = t * rr - t = t + n - ry = -t - rx = rx * (0 if a_infinity else 4) - ry = ry * (0 if a_infinity else 4) - t = b.X - t = t * (1 if a_infinity else 0) - rx = rx + t - t = b.Y - t = t * (1 if a_infinity else 0) - ry = ry + t - t = (1 if a_infinity else 0) - rz = rz + t - if infinity: - return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), point_at_infinity()) - return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), jacobianpoint(rx, ry, rz)) - -if __name__ == "__main__": - check_symbolic_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var) - check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var) - check_symbolic_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var) - check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge) - check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old) - - if len(sys.argv) >= 2 and sys.argv[1] == "--exhaustive": - check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var, 43) - check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var, 43) - check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var, 43) - check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge, 43) - check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old, 43) diff --git a/external/libwally-core/src/secp256k1/sage/weierstrass_prover.sage b/external/libwally-core/src/secp256k1/sage/weierstrass_prover.sage deleted file mode 100644 index 03ef2ec90..000000000 --- a/external/libwally-core/src/secp256k1/sage/weierstrass_prover.sage +++ /dev/null @@ -1,264 +0,0 @@ -# Prover implementation for Weierstrass curves of the form -# y^2 = x^3 + A * x + B, specifically with a = 0 and b = 7, with group laws -# operating on affine and Jacobian coordinates, including the point at infinity -# represented by a 4th variable in coordinates. - -load("group_prover.sage") - - -class affinepoint: - def __init__(self, x, y, infinity=0): - self.x = x - self.y = y - self.infinity = infinity - def __str__(self): - return "affinepoint(x=%s,y=%s,inf=%s)" % (self.x, self.y, self.infinity) - - -class jacobianpoint: - def __init__(self, x, y, z, infinity=0): - self.X = x - self.Y = y - self.Z = z - self.Infinity = infinity - def __str__(self): - return "jacobianpoint(X=%s,Y=%s,Z=%s,inf=%s)" % (self.X, self.Y, self.Z, self.Infinity) - - -def point_at_infinity(): - return jacobianpoint(1, 1, 1, 1) - - -def negate(p): - if p.__class__ == affinepoint: - return affinepoint(p.x, -p.y) - if p.__class__ == jacobianpoint: - return jacobianpoint(p.X, -p.Y, p.Z) - assert(False) - - -def on_weierstrass_curve(A, B, p): - """Return a set of zero-expressions for an affine point to be on the curve""" - return constraints(zero={p.x^3 + A*p.x + B - p.y^2: 'on_curve'}) - - -def tangential_to_weierstrass_curve(A, B, p12, p3): - """Return a set of zero-expressions for ((x12,y12),(x3,y3)) to be a line that is tangential to the curve at (x12,y12)""" - return constraints(zero={ - (p12.y - p3.y) * (p12.y * 2) - (p12.x^2 * 3 + A) * (p12.x - p3.x): 'tangential_to_curve' - }) - - -def colinear(p1, p2, p3): - """Return a set of zero-expressions for ((x1,y1),(x2,y2),(x3,y3)) to be collinear""" - return constraints(zero={ - (p1.y - p2.y) * (p1.x - p3.x) - (p1.y - p3.y) * (p1.x - p2.x): 'colinear_1', - (p2.y - p3.y) * (p2.x - p1.x) - (p2.y - p1.y) * (p2.x - p3.x): 'colinear_2', - (p3.y - p1.y) * (p3.x - p2.x) - (p3.y - p2.y) * (p3.x - p1.x): 'colinear_3' - }) - - -def good_affine_point(p): - return constraints(nonzero={p.x : 'nonzero_x', p.y : 'nonzero_y'}) - - -def good_jacobian_point(p): - return constraints(nonzero={p.X : 'nonzero_X', p.Y : 'nonzero_Y', p.Z^6 : 'nonzero_Z'}) - - -def good_point(p): - return constraints(nonzero={p.Z^6 : 'nonzero_X'}) - - -def finite(p, *affine_fns): - con = good_point(p) + constraints(zero={p.Infinity : 'finite_point'}) - if p.Z != 0: - return con + reduce(lambda a, b: a + b, (f(affinepoint(p.X / p.Z^2, p.Y / p.Z^3)) for f in affine_fns), con) - else: - return con - -def infinite(p): - return constraints(nonzero={p.Infinity : 'infinite_point'}) - - -def law_jacobian_weierstrass_add(A, B, pa, pb, pA, pB, pC): - """Check whether the passed set of coordinates is a valid Jacobian add, given assumptions""" - assumeLaw = (good_affine_point(pa) + - good_affine_point(pb) + - good_jacobian_point(pA) + - good_jacobian_point(pB) + - on_weierstrass_curve(A, B, pa) + - on_weierstrass_curve(A, B, pb) + - finite(pA) + - finite(pB) + - constraints(nonzero={pa.x - pb.x : 'different_x'})) - require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + - colinear(pa, pb, negate(pc)))) - return (assumeLaw, require) - - -def law_jacobian_weierstrass_double(A, B, pa, pb, pA, pB, pC): - """Check whether the passed set of coordinates is a valid Jacobian doubling, given assumptions""" - assumeLaw = (good_affine_point(pa) + - good_affine_point(pb) + - good_jacobian_point(pA) + - good_jacobian_point(pB) + - on_weierstrass_curve(A, B, pa) + - on_weierstrass_curve(A, B, pb) + - finite(pA) + - finite(pB) + - constraints(zero={pa.x - pb.x : 'equal_x', pa.y - pb.y : 'equal_y'})) - require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + - tangential_to_weierstrass_curve(A, B, pa, negate(pc)))) - return (assumeLaw, require) - - -def law_jacobian_weierstrass_add_opposites(A, B, pa, pb, pA, pB, pC): - assumeLaw = (good_affine_point(pa) + - good_affine_point(pb) + - good_jacobian_point(pA) + - good_jacobian_point(pB) + - on_weierstrass_curve(A, B, pa) + - on_weierstrass_curve(A, B, pb) + - finite(pA) + - finite(pB) + - constraints(zero={pa.x - pb.x : 'equal_x', pa.y + pb.y : 'opposite_y'})) - require = infinite(pC) - return (assumeLaw, require) - - -def law_jacobian_weierstrass_add_infinite_a(A, B, pa, pb, pA, pB, pC): - assumeLaw = (good_affine_point(pa) + - good_affine_point(pb) + - good_jacobian_point(pA) + - good_jacobian_point(pB) + - on_weierstrass_curve(A, B, pb) + - infinite(pA) + - finite(pB)) - require = finite(pC, lambda pc: constraints(zero={pc.x - pb.x : 'c.x=b.x', pc.y - pb.y : 'c.y=b.y'})) - return (assumeLaw, require) - - -def law_jacobian_weierstrass_add_infinite_b(A, B, pa, pb, pA, pB, pC): - assumeLaw = (good_affine_point(pa) + - good_affine_point(pb) + - good_jacobian_point(pA) + - good_jacobian_point(pB) + - on_weierstrass_curve(A, B, pa) + - infinite(pB) + - finite(pA)) - require = finite(pC, lambda pc: constraints(zero={pc.x - pa.x : 'c.x=a.x', pc.y - pa.y : 'c.y=a.y'})) - return (assumeLaw, require) - - -def law_jacobian_weierstrass_add_infinite_ab(A, B, pa, pb, pA, pB, pC): - assumeLaw = (good_affine_point(pa) + - good_affine_point(pb) + - good_jacobian_point(pA) + - good_jacobian_point(pB) + - infinite(pA) + - infinite(pB)) - require = infinite(pC) - return (assumeLaw, require) - - -laws_jacobian_weierstrass = { - 'add': law_jacobian_weierstrass_add, - 'double': law_jacobian_weierstrass_double, - 'add_opposite': law_jacobian_weierstrass_add_opposites, - 'add_infinite_a': law_jacobian_weierstrass_add_infinite_a, - 'add_infinite_b': law_jacobian_weierstrass_add_infinite_b, - 'add_infinite_ab': law_jacobian_weierstrass_add_infinite_ab -} - - -def check_exhaustive_jacobian_weierstrass(name, A, B, branches, formula, p): - """Verify an implementation of addition of Jacobian points on a Weierstrass curve, by executing and validating the result for every possible addition in a prime field""" - F = Integers(p) - print "Formula %s on Z%i:" % (name, p) - points = [] - for x in xrange(0, p): - for y in xrange(0, p): - point = affinepoint(F(x), F(y)) - r, e = concrete_verify(on_weierstrass_curve(A, B, point)) - if r: - points.append(point) - - for za in xrange(1, p): - for zb in xrange(1, p): - for pa in points: - for pb in points: - for ia in xrange(2): - for ib in xrange(2): - pA = jacobianpoint(pa.x * F(za)^2, pa.y * F(za)^3, F(za), ia) - pB = jacobianpoint(pb.x * F(zb)^2, pb.y * F(zb)^3, F(zb), ib) - for branch in xrange(0, branches): - assumeAssert, assumeBranch, pC = formula(branch, pA, pB) - pC.X = F(pC.X) - pC.Y = F(pC.Y) - pC.Z = F(pC.Z) - pC.Infinity = F(pC.Infinity) - r, e = concrete_verify(assumeAssert + assumeBranch) - if r: - match = False - for key in laws_jacobian_weierstrass: - assumeLaw, require = laws_jacobian_weierstrass[key](A, B, pa, pb, pA, pB, pC) - r, e = concrete_verify(assumeLaw) - if r: - if match: - print " multiple branches for (%s,%s,%s,%s) + (%s,%s,%s,%s)" % (pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity) - else: - match = True - r, e = concrete_verify(require) - if not r: - print " failure in branch %i for (%s,%s,%s,%s) + (%s,%s,%s,%s) = (%s,%s,%s,%s): %s" % (branch, pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity, pC.X, pC.Y, pC.Z, pC.Infinity, e) - print - - -def check_symbolic_function(R, assumeAssert, assumeBranch, f, A, B, pa, pb, pA, pB, pC): - assumeLaw, require = f(A, B, pa, pb, pA, pB, pC) - return check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require) - -def check_symbolic_jacobian_weierstrass(name, A, B, branches, formula): - """Verify an implementation of addition of Jacobian points on a Weierstrass curve symbolically""" - R. = PolynomialRing(QQ,8,order='invlex') - lift = lambda x: fastfrac(R,x) - ax = lift(ax) - ay = lift(ay) - Az = lift(Az) - bx = lift(bx) - by = lift(by) - Bz = lift(Bz) - Ai = lift(Ai) - Bi = lift(Bi) - - pa = affinepoint(ax, ay, Ai) - pb = affinepoint(bx, by, Bi) - pA = jacobianpoint(ax * Az^2, ay * Az^3, Az, Ai) - pB = jacobianpoint(bx * Bz^2, by * Bz^3, Bz, Bi) - - res = {} - - for key in laws_jacobian_weierstrass: - res[key] = [] - - print ("Formula " + name + ":") - count = 0 - for branch in xrange(branches): - assumeFormula, assumeBranch, pC = formula(branch, pA, pB) - pC.X = lift(pC.X) - pC.Y = lift(pC.Y) - pC.Z = lift(pC.Z) - pC.Infinity = lift(pC.Infinity) - - for key in laws_jacobian_weierstrass: - res[key].append((check_symbolic_function(R, assumeFormula, assumeBranch, laws_jacobian_weierstrass[key], A, B, pa, pb, pA, pB, pC), branch)) - - for key in res: - print " %s:" % key - val = res[key] - for x in val: - if x[0] is not None: - print " branch %i: %s" % (x[1], x[0]) - - print diff --git a/external/libwally-core/src/secp256k1/src/asm/field_10x26_arm.s b/external/libwally-core/src/secp256k1/src/asm/field_10x26_arm.s deleted file mode 100644 index 5df561f2f..000000000 --- a/external/libwally-core/src/secp256k1/src/asm/field_10x26_arm.s +++ /dev/null @@ -1,919 +0,0 @@ -@ vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab syntax=armasm: -/********************************************************************** - * Copyright (c) 2014 Wladimir J. van der Laan * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ -/* -ARM implementation of field_10x26 inner loops. - -Note: - -- To avoid unnecessary loads and make use of available registers, two - 'passes' have every time been interleaved, with the odd passes accumulating c' and d' - which will be added to c and d respectively in the the even passes - -*/ - - .syntax unified - .arch armv7-a - @ eabi attributes - see readelf -A - .eabi_attribute 8, 1 @ Tag_ARM_ISA_use = yes - .eabi_attribute 9, 0 @ Tag_Thumb_ISA_use = no - .eabi_attribute 10, 0 @ Tag_FP_arch = none - .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte - .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP - .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Agressive Speed - .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6 - .text - - @ Field constants - .set field_R0, 0x3d10 - .set field_R1, 0x400 - .set field_not_M, 0xfc000000 @ ~M = ~0x3ffffff - - .align 2 - .global secp256k1_fe_mul_inner - .type secp256k1_fe_mul_inner, %function - @ Arguments: - @ r0 r Restrict: can overlap with a, not with b - @ r1 a - @ r2 b - @ Stack (total 4+10*4 = 44) - @ sp + #0 saved 'r' pointer - @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 -secp256k1_fe_mul_inner: - stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} - sub sp, sp, #48 @ frame=44 + alignment - str r0, [sp, #0] @ save result address, we need it only at the end - - /****************************************** - * Main computation code. - ****************************************** - - Allocation: - r0,r14,r7,r8 scratch - r1 a (pointer) - r2 b (pointer) - r3:r4 c - r5:r6 d - r11:r12 c' - r9:r10 d' - - Note: do not write to r[] here, it may overlap with a[] - */ - - /* A - interleaved with B */ - ldr r7, [r1, #0*4] @ a[0] - ldr r8, [r2, #9*4] @ b[9] - ldr r0, [r1, #1*4] @ a[1] - umull r5, r6, r7, r8 @ d = a[0] * b[9] - ldr r14, [r2, #8*4] @ b[8] - umull r9, r10, r0, r8 @ d' = a[1] * b[9] - ldr r7, [r1, #2*4] @ a[2] - umlal r5, r6, r0, r14 @ d += a[1] * b[8] - ldr r8, [r2, #7*4] @ b[7] - umlal r9, r10, r7, r14 @ d' += a[2] * b[8] - ldr r0, [r1, #3*4] @ a[3] - umlal r5, r6, r7, r8 @ d += a[2] * b[7] - ldr r14, [r2, #6*4] @ b[6] - umlal r9, r10, r0, r8 @ d' += a[3] * b[7] - ldr r7, [r1, #4*4] @ a[4] - umlal r5, r6, r0, r14 @ d += a[3] * b[6] - ldr r8, [r2, #5*4] @ b[5] - umlal r9, r10, r7, r14 @ d' += a[4] * b[6] - ldr r0, [r1, #5*4] @ a[5] - umlal r5, r6, r7, r8 @ d += a[4] * b[5] - ldr r14, [r2, #4*4] @ b[4] - umlal r9, r10, r0, r8 @ d' += a[5] * b[5] - ldr r7, [r1, #6*4] @ a[6] - umlal r5, r6, r0, r14 @ d += a[5] * b[4] - ldr r8, [r2, #3*4] @ b[3] - umlal r9, r10, r7, r14 @ d' += a[6] * b[4] - ldr r0, [r1, #7*4] @ a[7] - umlal r5, r6, r7, r8 @ d += a[6] * b[3] - ldr r14, [r2, #2*4] @ b[2] - umlal r9, r10, r0, r8 @ d' += a[7] * b[3] - ldr r7, [r1, #8*4] @ a[8] - umlal r5, r6, r0, r14 @ d += a[7] * b[2] - ldr r8, [r2, #1*4] @ b[1] - umlal r9, r10, r7, r14 @ d' += a[8] * b[2] - ldr r0, [r1, #9*4] @ a[9] - umlal r5, r6, r7, r8 @ d += a[8] * b[1] - ldr r14, [r2, #0*4] @ b[0] - umlal r9, r10, r0, r8 @ d' += a[9] * b[1] - ldr r7, [r1, #0*4] @ a[0] - umlal r5, r6, r0, r14 @ d += a[9] * b[0] - @ r7,r14 used in B - - bic r0, r5, field_not_M @ t9 = d & M - str r0, [sp, #4 + 4*9] - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - - /* B */ - umull r3, r4, r7, r14 @ c = a[0] * b[0] - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u0 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u0 * R0 - umlal r3, r4, r0, r14 - - bic r14, r3, field_not_M @ t0 = c & M - str r14, [sp, #4 + 0*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u0 * R1 - umlal r3, r4, r0, r14 - - /* C - interleaved with D */ - ldr r7, [r1, #0*4] @ a[0] - ldr r8, [r2, #2*4] @ b[2] - ldr r14, [r2, #1*4] @ b[1] - umull r11, r12, r7, r8 @ c' = a[0] * b[2] - ldr r0, [r1, #1*4] @ a[1] - umlal r3, r4, r7, r14 @ c += a[0] * b[1] - ldr r8, [r2, #0*4] @ b[0] - umlal r11, r12, r0, r14 @ c' += a[1] * b[1] - ldr r7, [r1, #2*4] @ a[2] - umlal r3, r4, r0, r8 @ c += a[1] * b[0] - ldr r14, [r2, #9*4] @ b[9] - umlal r11, r12, r7, r8 @ c' += a[2] * b[0] - ldr r0, [r1, #3*4] @ a[3] - umlal r5, r6, r7, r14 @ d += a[2] * b[9] - ldr r8, [r2, #8*4] @ b[8] - umull r9, r10, r0, r14 @ d' = a[3] * b[9] - ldr r7, [r1, #4*4] @ a[4] - umlal r5, r6, r0, r8 @ d += a[3] * b[8] - ldr r14, [r2, #7*4] @ b[7] - umlal r9, r10, r7, r8 @ d' += a[4] * b[8] - ldr r0, [r1, #5*4] @ a[5] - umlal r5, r6, r7, r14 @ d += a[4] * b[7] - ldr r8, [r2, #6*4] @ b[6] - umlal r9, r10, r0, r14 @ d' += a[5] * b[7] - ldr r7, [r1, #6*4] @ a[6] - umlal r5, r6, r0, r8 @ d += a[5] * b[6] - ldr r14, [r2, #5*4] @ b[5] - umlal r9, r10, r7, r8 @ d' += a[6] * b[6] - ldr r0, [r1, #7*4] @ a[7] - umlal r5, r6, r7, r14 @ d += a[6] * b[5] - ldr r8, [r2, #4*4] @ b[4] - umlal r9, r10, r0, r14 @ d' += a[7] * b[5] - ldr r7, [r1, #8*4] @ a[8] - umlal r5, r6, r0, r8 @ d += a[7] * b[4] - ldr r14, [r2, #3*4] @ b[3] - umlal r9, r10, r7, r8 @ d' += a[8] * b[4] - ldr r0, [r1, #9*4] @ a[9] - umlal r5, r6, r7, r14 @ d += a[8] * b[3] - ldr r8, [r2, #2*4] @ b[2] - umlal r9, r10, r0, r14 @ d' += a[9] * b[3] - umlal r5, r6, r0, r8 @ d += a[9] * b[2] - - bic r0, r5, field_not_M @ u1 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u1 * R0 - umlal r3, r4, r0, r14 - - bic r14, r3, field_not_M @ t1 = c & M - str r14, [sp, #4 + 1*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u1 * R1 - umlal r3, r4, r0, r14 - - /* D */ - adds r3, r3, r11 @ c += c' - adc r4, r4, r12 - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u2 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u2 * R0 - umlal r3, r4, r0, r14 - - bic r14, r3, field_not_M @ t2 = c & M - str r14, [sp, #4 + 2*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u2 * R1 - umlal r3, r4, r0, r14 - - /* E - interleaved with F */ - ldr r7, [r1, #0*4] @ a[0] - ldr r8, [r2, #4*4] @ b[4] - umull r11, r12, r7, r8 @ c' = a[0] * b[4] - ldr r8, [r2, #3*4] @ b[3] - umlal r3, r4, r7, r8 @ c += a[0] * b[3] - ldr r7, [r1, #1*4] @ a[1] - umlal r11, r12, r7, r8 @ c' += a[1] * b[3] - ldr r8, [r2, #2*4] @ b[2] - umlal r3, r4, r7, r8 @ c += a[1] * b[2] - ldr r7, [r1, #2*4] @ a[2] - umlal r11, r12, r7, r8 @ c' += a[2] * b[2] - ldr r8, [r2, #1*4] @ b[1] - umlal r3, r4, r7, r8 @ c += a[2] * b[1] - ldr r7, [r1, #3*4] @ a[3] - umlal r11, r12, r7, r8 @ c' += a[3] * b[1] - ldr r8, [r2, #0*4] @ b[0] - umlal r3, r4, r7, r8 @ c += a[3] * b[0] - ldr r7, [r1, #4*4] @ a[4] - umlal r11, r12, r7, r8 @ c' += a[4] * b[0] - ldr r8, [r2, #9*4] @ b[9] - umlal r5, r6, r7, r8 @ d += a[4] * b[9] - ldr r7, [r1, #5*4] @ a[5] - umull r9, r10, r7, r8 @ d' = a[5] * b[9] - ldr r8, [r2, #8*4] @ b[8] - umlal r5, r6, r7, r8 @ d += a[5] * b[8] - ldr r7, [r1, #6*4] @ a[6] - umlal r9, r10, r7, r8 @ d' += a[6] * b[8] - ldr r8, [r2, #7*4] @ b[7] - umlal r5, r6, r7, r8 @ d += a[6] * b[7] - ldr r7, [r1, #7*4] @ a[7] - umlal r9, r10, r7, r8 @ d' += a[7] * b[7] - ldr r8, [r2, #6*4] @ b[6] - umlal r5, r6, r7, r8 @ d += a[7] * b[6] - ldr r7, [r1, #8*4] @ a[8] - umlal r9, r10, r7, r8 @ d' += a[8] * b[6] - ldr r8, [r2, #5*4] @ b[5] - umlal r5, r6, r7, r8 @ d += a[8] * b[5] - ldr r7, [r1, #9*4] @ a[9] - umlal r9, r10, r7, r8 @ d' += a[9] * b[5] - ldr r8, [r2, #4*4] @ b[4] - umlal r5, r6, r7, r8 @ d += a[9] * b[4] - - bic r0, r5, field_not_M @ u3 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u3 * R0 - umlal r3, r4, r0, r14 - - bic r14, r3, field_not_M @ t3 = c & M - str r14, [sp, #4 + 3*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u3 * R1 - umlal r3, r4, r0, r14 - - /* F */ - adds r3, r3, r11 @ c += c' - adc r4, r4, r12 - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u4 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u4 * R0 - umlal r3, r4, r0, r14 - - bic r14, r3, field_not_M @ t4 = c & M - str r14, [sp, #4 + 4*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u4 * R1 - umlal r3, r4, r0, r14 - - /* G - interleaved with H */ - ldr r7, [r1, #0*4] @ a[0] - ldr r8, [r2, #6*4] @ b[6] - ldr r14, [r2, #5*4] @ b[5] - umull r11, r12, r7, r8 @ c' = a[0] * b[6] - ldr r0, [r1, #1*4] @ a[1] - umlal r3, r4, r7, r14 @ c += a[0] * b[5] - ldr r8, [r2, #4*4] @ b[4] - umlal r11, r12, r0, r14 @ c' += a[1] * b[5] - ldr r7, [r1, #2*4] @ a[2] - umlal r3, r4, r0, r8 @ c += a[1] * b[4] - ldr r14, [r2, #3*4] @ b[3] - umlal r11, r12, r7, r8 @ c' += a[2] * b[4] - ldr r0, [r1, #3*4] @ a[3] - umlal r3, r4, r7, r14 @ c += a[2] * b[3] - ldr r8, [r2, #2*4] @ b[2] - umlal r11, r12, r0, r14 @ c' += a[3] * b[3] - ldr r7, [r1, #4*4] @ a[4] - umlal r3, r4, r0, r8 @ c += a[3] * b[2] - ldr r14, [r2, #1*4] @ b[1] - umlal r11, r12, r7, r8 @ c' += a[4] * b[2] - ldr r0, [r1, #5*4] @ a[5] - umlal r3, r4, r7, r14 @ c += a[4] * b[1] - ldr r8, [r2, #0*4] @ b[0] - umlal r11, r12, r0, r14 @ c' += a[5] * b[1] - ldr r7, [r1, #6*4] @ a[6] - umlal r3, r4, r0, r8 @ c += a[5] * b[0] - ldr r14, [r2, #9*4] @ b[9] - umlal r11, r12, r7, r8 @ c' += a[6] * b[0] - ldr r0, [r1, #7*4] @ a[7] - umlal r5, r6, r7, r14 @ d += a[6] * b[9] - ldr r8, [r2, #8*4] @ b[8] - umull r9, r10, r0, r14 @ d' = a[7] * b[9] - ldr r7, [r1, #8*4] @ a[8] - umlal r5, r6, r0, r8 @ d += a[7] * b[8] - ldr r14, [r2, #7*4] @ b[7] - umlal r9, r10, r7, r8 @ d' += a[8] * b[8] - ldr r0, [r1, #9*4] @ a[9] - umlal r5, r6, r7, r14 @ d += a[8] * b[7] - ldr r8, [r2, #6*4] @ b[6] - umlal r9, r10, r0, r14 @ d' += a[9] * b[7] - umlal r5, r6, r0, r8 @ d += a[9] * b[6] - - bic r0, r5, field_not_M @ u5 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u5 * R0 - umlal r3, r4, r0, r14 - - bic r14, r3, field_not_M @ t5 = c & M - str r14, [sp, #4 + 5*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u5 * R1 - umlal r3, r4, r0, r14 - - /* H */ - adds r3, r3, r11 @ c += c' - adc r4, r4, r12 - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u6 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u6 * R0 - umlal r3, r4, r0, r14 - - bic r14, r3, field_not_M @ t6 = c & M - str r14, [sp, #4 + 6*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u6 * R1 - umlal r3, r4, r0, r14 - - /* I - interleaved with J */ - ldr r8, [r2, #8*4] @ b[8] - ldr r7, [r1, #0*4] @ a[0] - ldr r14, [r2, #7*4] @ b[7] - umull r11, r12, r7, r8 @ c' = a[0] * b[8] - ldr r0, [r1, #1*4] @ a[1] - umlal r3, r4, r7, r14 @ c += a[0] * b[7] - ldr r8, [r2, #6*4] @ b[6] - umlal r11, r12, r0, r14 @ c' += a[1] * b[7] - ldr r7, [r1, #2*4] @ a[2] - umlal r3, r4, r0, r8 @ c += a[1] * b[6] - ldr r14, [r2, #5*4] @ b[5] - umlal r11, r12, r7, r8 @ c' += a[2] * b[6] - ldr r0, [r1, #3*4] @ a[3] - umlal r3, r4, r7, r14 @ c += a[2] * b[5] - ldr r8, [r2, #4*4] @ b[4] - umlal r11, r12, r0, r14 @ c' += a[3] * b[5] - ldr r7, [r1, #4*4] @ a[4] - umlal r3, r4, r0, r8 @ c += a[3] * b[4] - ldr r14, [r2, #3*4] @ b[3] - umlal r11, r12, r7, r8 @ c' += a[4] * b[4] - ldr r0, [r1, #5*4] @ a[5] - umlal r3, r4, r7, r14 @ c += a[4] * b[3] - ldr r8, [r2, #2*4] @ b[2] - umlal r11, r12, r0, r14 @ c' += a[5] * b[3] - ldr r7, [r1, #6*4] @ a[6] - umlal r3, r4, r0, r8 @ c += a[5] * b[2] - ldr r14, [r2, #1*4] @ b[1] - umlal r11, r12, r7, r8 @ c' += a[6] * b[2] - ldr r0, [r1, #7*4] @ a[7] - umlal r3, r4, r7, r14 @ c += a[6] * b[1] - ldr r8, [r2, #0*4] @ b[0] - umlal r11, r12, r0, r14 @ c' += a[7] * b[1] - ldr r7, [r1, #8*4] @ a[8] - umlal r3, r4, r0, r8 @ c += a[7] * b[0] - ldr r14, [r2, #9*4] @ b[9] - umlal r11, r12, r7, r8 @ c' += a[8] * b[0] - ldr r0, [r1, #9*4] @ a[9] - umlal r5, r6, r7, r14 @ d += a[8] * b[9] - ldr r8, [r2, #8*4] @ b[8] - umull r9, r10, r0, r14 @ d' = a[9] * b[9] - umlal r5, r6, r0, r8 @ d += a[9] * b[8] - - bic r0, r5, field_not_M @ u7 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u7 * R0 - umlal r3, r4, r0, r14 - - bic r14, r3, field_not_M @ t7 = c & M - str r14, [sp, #4 + 7*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u7 * R1 - umlal r3, r4, r0, r14 - - /* J */ - adds r3, r3, r11 @ c += c' - adc r4, r4, r12 - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u8 = d & M - str r0, [sp, #4 + 8*4] - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u8 * R0 - umlal r3, r4, r0, r14 - - /****************************************** - * compute and write back result - ****************************************** - Allocation: - r0 r - r3:r4 c - r5:r6 d - r7 t0 - r8 t1 - r9 t2 - r11 u8 - r12 t9 - r1,r2,r10,r14 scratch - - Note: do not read from a[] after here, it may overlap with r[] - */ - ldr r0, [sp, #0] - add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 - ldmia r1, {r2,r7,r8,r9,r10,r11,r12} - add r1, r0, #3*4 - stmia r1, {r2,r7,r8,r9,r10} - - bic r2, r3, field_not_M @ r[8] = c & M - str r2, [r0, #8*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u8 * R1 - umlal r3, r4, r11, r14 - movw r14, field_R0 @ c += d * R0 - umlal r3, r4, r5, r14 - adds r3, r3, r12 @ c += t9 - adc r4, r4, #0 - - add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 - ldmia r1, {r7,r8,r9} - - ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) - str r2, [r0, #9*4] - mov r3, r3, lsr #22 @ c >>= 22 - orr r3, r3, r4, asl #10 - mov r4, r4, lsr #22 - movw r14, field_R1 << 4 @ c += d * (R1 << 4) - umlal r3, r4, r5, r14 - - movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) - umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) - adds r5, r5, r7 @ d.lo += t0 - mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) - adc r6, r6, 0 @ d.hi += carry - - bic r2, r5, field_not_M @ r[0] = d & M - str r2, [r0, #0*4] - - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - - movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) - umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) - adds r5, r5, r8 @ d.lo += t1 - adc r6, r6, #0 @ d.hi += carry - adds r5, r5, r1 @ d.lo += tmp.lo - mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) - adc r6, r6, r2 @ d.hi += carry + tmp.hi - - bic r2, r5, field_not_M @ r[1] = d & M - str r2, [r0, #1*4] - mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) - orr r5, r5, r6, asl #6 - - add r5, r5, r9 @ d += t2 - str r5, [r0, #2*4] @ r[2] = d - - add sp, sp, #48 - ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size secp256k1_fe_mul_inner, .-secp256k1_fe_mul_inner - - .align 2 - .global secp256k1_fe_sqr_inner - .type secp256k1_fe_sqr_inner, %function - @ Arguments: - @ r0 r Can overlap with a - @ r1 a - @ Stack (total 4+10*4 = 44) - @ sp + #0 saved 'r' pointer - @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 -secp256k1_fe_sqr_inner: - stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} - sub sp, sp, #48 @ frame=44 + alignment - str r0, [sp, #0] @ save result address, we need it only at the end - /****************************************** - * Main computation code. - ****************************************** - - Allocation: - r0,r14,r2,r7,r8 scratch - r1 a (pointer) - r3:r4 c - r5:r6 d - r11:r12 c' - r9:r10 d' - - Note: do not write to r[] here, it may overlap with a[] - */ - /* A interleaved with B */ - ldr r0, [r1, #1*4] @ a[1]*2 - ldr r7, [r1, #0*4] @ a[0] - mov r0, r0, asl #1 - ldr r14, [r1, #9*4] @ a[9] - umull r3, r4, r7, r7 @ c = a[0] * a[0] - ldr r8, [r1, #8*4] @ a[8] - mov r7, r7, asl #1 - umull r5, r6, r7, r14 @ d = a[0]*2 * a[9] - ldr r7, [r1, #2*4] @ a[2]*2 - umull r9, r10, r0, r14 @ d' = a[1]*2 * a[9] - ldr r14, [r1, #7*4] @ a[7] - umlal r5, r6, r0, r8 @ d += a[1]*2 * a[8] - mov r7, r7, asl #1 - ldr r0, [r1, #3*4] @ a[3]*2 - umlal r9, r10, r7, r8 @ d' += a[2]*2 * a[8] - ldr r8, [r1, #6*4] @ a[6] - umlal r5, r6, r7, r14 @ d += a[2]*2 * a[7] - mov r0, r0, asl #1 - ldr r7, [r1, #4*4] @ a[4]*2 - umlal r9, r10, r0, r14 @ d' += a[3]*2 * a[7] - ldr r14, [r1, #5*4] @ a[5] - mov r7, r7, asl #1 - umlal r5, r6, r0, r8 @ d += a[3]*2 * a[6] - umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[6] - umlal r5, r6, r7, r14 @ d += a[4]*2 * a[5] - umlal r9, r10, r14, r14 @ d' += a[5] * a[5] - - bic r0, r5, field_not_M @ t9 = d & M - str r0, [sp, #4 + 9*4] - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - - /* B */ - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u0 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u0 * R0 - umlal r3, r4, r0, r14 - bic r14, r3, field_not_M @ t0 = c & M - str r14, [sp, #4 + 0*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u0 * R1 - umlal r3, r4, r0, r14 - - /* C interleaved with D */ - ldr r0, [r1, #0*4] @ a[0]*2 - ldr r14, [r1, #1*4] @ a[1] - mov r0, r0, asl #1 - ldr r8, [r1, #2*4] @ a[2] - umlal r3, r4, r0, r14 @ c += a[0]*2 * a[1] - mov r7, r8, asl #1 @ a[2]*2 - umull r11, r12, r14, r14 @ c' = a[1] * a[1] - ldr r14, [r1, #9*4] @ a[9] - umlal r11, r12, r0, r8 @ c' += a[0]*2 * a[2] - ldr r0, [r1, #3*4] @ a[3]*2 - ldr r8, [r1, #8*4] @ a[8] - umlal r5, r6, r7, r14 @ d += a[2]*2 * a[9] - mov r0, r0, asl #1 - ldr r7, [r1, #4*4] @ a[4]*2 - umull r9, r10, r0, r14 @ d' = a[3]*2 * a[9] - ldr r14, [r1, #7*4] @ a[7] - umlal r5, r6, r0, r8 @ d += a[3]*2 * a[8] - mov r7, r7, asl #1 - ldr r0, [r1, #5*4] @ a[5]*2 - umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[8] - ldr r8, [r1, #6*4] @ a[6] - mov r0, r0, asl #1 - umlal r5, r6, r7, r14 @ d += a[4]*2 * a[7] - umlal r9, r10, r0, r14 @ d' += a[5]*2 * a[7] - umlal r5, r6, r0, r8 @ d += a[5]*2 * a[6] - umlal r9, r10, r8, r8 @ d' += a[6] * a[6] - - bic r0, r5, field_not_M @ u1 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u1 * R0 - umlal r3, r4, r0, r14 - bic r14, r3, field_not_M @ t1 = c & M - str r14, [sp, #4 + 1*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u1 * R1 - umlal r3, r4, r0, r14 - - /* D */ - adds r3, r3, r11 @ c += c' - adc r4, r4, r12 - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u2 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u2 * R0 - umlal r3, r4, r0, r14 - bic r14, r3, field_not_M @ t2 = c & M - str r14, [sp, #4 + 2*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u2 * R1 - umlal r3, r4, r0, r14 - - /* E interleaved with F */ - ldr r7, [r1, #0*4] @ a[0]*2 - ldr r0, [r1, #1*4] @ a[1]*2 - ldr r14, [r1, #2*4] @ a[2] - mov r7, r7, asl #1 - ldr r8, [r1, #3*4] @ a[3] - ldr r2, [r1, #4*4] - umlal r3, r4, r7, r8 @ c += a[0]*2 * a[3] - mov r0, r0, asl #1 - umull r11, r12, r7, r2 @ c' = a[0]*2 * a[4] - mov r2, r2, asl #1 @ a[4]*2 - umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[3] - ldr r8, [r1, #9*4] @ a[9] - umlal r3, r4, r0, r14 @ c += a[1]*2 * a[2] - ldr r0, [r1, #5*4] @ a[5]*2 - umlal r11, r12, r14, r14 @ c' += a[2] * a[2] - ldr r14, [r1, #8*4] @ a[8] - mov r0, r0, asl #1 - umlal r5, r6, r2, r8 @ d += a[4]*2 * a[9] - ldr r7, [r1, #6*4] @ a[6]*2 - umull r9, r10, r0, r8 @ d' = a[5]*2 * a[9] - mov r7, r7, asl #1 - ldr r8, [r1, #7*4] @ a[7] - umlal r5, r6, r0, r14 @ d += a[5]*2 * a[8] - umlal r9, r10, r7, r14 @ d' += a[6]*2 * a[8] - umlal r5, r6, r7, r8 @ d += a[6]*2 * a[7] - umlal r9, r10, r8, r8 @ d' += a[7] * a[7] - - bic r0, r5, field_not_M @ u3 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u3 * R0 - umlal r3, r4, r0, r14 - bic r14, r3, field_not_M @ t3 = c & M - str r14, [sp, #4 + 3*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u3 * R1 - umlal r3, r4, r0, r14 - - /* F */ - adds r3, r3, r11 @ c += c' - adc r4, r4, r12 - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u4 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u4 * R0 - umlal r3, r4, r0, r14 - bic r14, r3, field_not_M @ t4 = c & M - str r14, [sp, #4 + 4*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u4 * R1 - umlal r3, r4, r0, r14 - - /* G interleaved with H */ - ldr r7, [r1, #0*4] @ a[0]*2 - ldr r0, [r1, #1*4] @ a[1]*2 - mov r7, r7, asl #1 - ldr r8, [r1, #5*4] @ a[5] - ldr r2, [r1, #6*4] @ a[6] - umlal r3, r4, r7, r8 @ c += a[0]*2 * a[5] - ldr r14, [r1, #4*4] @ a[4] - mov r0, r0, asl #1 - umull r11, r12, r7, r2 @ c' = a[0]*2 * a[6] - ldr r7, [r1, #2*4] @ a[2]*2 - umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[5] - mov r7, r7, asl #1 - ldr r8, [r1, #3*4] @ a[3] - umlal r3, r4, r0, r14 @ c += a[1]*2 * a[4] - mov r0, r2, asl #1 @ a[6]*2 - umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[4] - ldr r14, [r1, #9*4] @ a[9] - umlal r3, r4, r7, r8 @ c += a[2]*2 * a[3] - ldr r7, [r1, #7*4] @ a[7]*2 - umlal r11, r12, r8, r8 @ c' += a[3] * a[3] - mov r7, r7, asl #1 - ldr r8, [r1, #8*4] @ a[8] - umlal r5, r6, r0, r14 @ d += a[6]*2 * a[9] - umull r9, r10, r7, r14 @ d' = a[7]*2 * a[9] - umlal r5, r6, r7, r8 @ d += a[7]*2 * a[8] - umlal r9, r10, r8, r8 @ d' += a[8] * a[8] - - bic r0, r5, field_not_M @ u5 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u5 * R0 - umlal r3, r4, r0, r14 - bic r14, r3, field_not_M @ t5 = c & M - str r14, [sp, #4 + 5*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u5 * R1 - umlal r3, r4, r0, r14 - - /* H */ - adds r3, r3, r11 @ c += c' - adc r4, r4, r12 - adds r5, r5, r9 @ d += d' - adc r6, r6, r10 - - bic r0, r5, field_not_M @ u6 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u6 * R0 - umlal r3, r4, r0, r14 - bic r14, r3, field_not_M @ t6 = c & M - str r14, [sp, #4 + 6*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u6 * R1 - umlal r3, r4, r0, r14 - - /* I interleaved with J */ - ldr r7, [r1, #0*4] @ a[0]*2 - ldr r0, [r1, #1*4] @ a[1]*2 - mov r7, r7, asl #1 - ldr r8, [r1, #7*4] @ a[7] - ldr r2, [r1, #8*4] @ a[8] - umlal r3, r4, r7, r8 @ c += a[0]*2 * a[7] - ldr r14, [r1, #6*4] @ a[6] - mov r0, r0, asl #1 - umull r11, r12, r7, r2 @ c' = a[0]*2 * a[8] - ldr r7, [r1, #2*4] @ a[2]*2 - umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[7] - ldr r8, [r1, #5*4] @ a[5] - umlal r3, r4, r0, r14 @ c += a[1]*2 * a[6] - ldr r0, [r1, #3*4] @ a[3]*2 - mov r7, r7, asl #1 - umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[6] - ldr r14, [r1, #4*4] @ a[4] - mov r0, r0, asl #1 - umlal r3, r4, r7, r8 @ c += a[2]*2 * a[5] - mov r2, r2, asl #1 @ a[8]*2 - umlal r11, r12, r0, r8 @ c' += a[3]*2 * a[5] - umlal r3, r4, r0, r14 @ c += a[3]*2 * a[4] - umlal r11, r12, r14, r14 @ c' += a[4] * a[4] - ldr r8, [r1, #9*4] @ a[9] - umlal r5, r6, r2, r8 @ d += a[8]*2 * a[9] - @ r8 will be used in J - - bic r0, r5, field_not_M @ u7 = d & M - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u7 * R0 - umlal r3, r4, r0, r14 - bic r14, r3, field_not_M @ t7 = c & M - str r14, [sp, #4 + 7*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u7 * R1 - umlal r3, r4, r0, r14 - - /* J */ - adds r3, r3, r11 @ c += c' - adc r4, r4, r12 - umlal r5, r6, r8, r8 @ d += a[9] * a[9] - - bic r0, r5, field_not_M @ u8 = d & M - str r0, [sp, #4 + 8*4] - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - movw r14, field_R0 @ c += u8 * R0 - umlal r3, r4, r0, r14 - - /****************************************** - * compute and write back result - ****************************************** - Allocation: - r0 r - r3:r4 c - r5:r6 d - r7 t0 - r8 t1 - r9 t2 - r11 u8 - r12 t9 - r1,r2,r10,r14 scratch - - Note: do not read from a[] after here, it may overlap with r[] - */ - ldr r0, [sp, #0] - add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 - ldmia r1, {r2,r7,r8,r9,r10,r11,r12} - add r1, r0, #3*4 - stmia r1, {r2,r7,r8,r9,r10} - - bic r2, r3, field_not_M @ r[8] = c & M - str r2, [r0, #8*4] - mov r3, r3, lsr #26 @ c >>= 26 - orr r3, r3, r4, asl #6 - mov r4, r4, lsr #26 - mov r14, field_R1 @ c += u8 * R1 - umlal r3, r4, r11, r14 - movw r14, field_R0 @ c += d * R0 - umlal r3, r4, r5, r14 - adds r3, r3, r12 @ c += t9 - adc r4, r4, #0 - - add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 - ldmia r1, {r7,r8,r9} - - ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) - str r2, [r0, #9*4] - mov r3, r3, lsr #22 @ c >>= 22 - orr r3, r3, r4, asl #10 - mov r4, r4, lsr #22 - movw r14, field_R1 << 4 @ c += d * (R1 << 4) - umlal r3, r4, r5, r14 - - movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) - umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) - adds r5, r5, r7 @ d.lo += t0 - mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) - adc r6, r6, 0 @ d.hi += carry - - bic r2, r5, field_not_M @ r[0] = d & M - str r2, [r0, #0*4] - - mov r5, r5, lsr #26 @ d >>= 26 - orr r5, r5, r6, asl #6 - mov r6, r6, lsr #26 - - movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) - umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) - adds r5, r5, r8 @ d.lo += t1 - adc r6, r6, #0 @ d.hi += carry - adds r5, r5, r1 @ d.lo += tmp.lo - mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) - adc r6, r6, r2 @ d.hi += carry + tmp.hi - - bic r2, r5, field_not_M @ r[1] = d & M - str r2, [r0, #1*4] - mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) - orr r5, r5, r6, asl #6 - - add r5, r5, r9 @ d += t2 - str r5, [r0, #2*4] @ r[2] = d - - add sp, sp, #48 - ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size secp256k1_fe_sqr_inner, .-secp256k1_fe_sqr_inner - diff --git a/external/libwally-core/src/secp256k1/src/basic-config.h b/external/libwally-core/src/secp256k1/src/basic-config.h deleted file mode 100644 index c4c16eb7c..000000000 --- a/external/libwally-core/src/secp256k1/src/basic-config.h +++ /dev/null @@ -1,32 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_BASIC_CONFIG_ -#define _SECP256K1_BASIC_CONFIG_ - -#ifdef USE_BASIC_CONFIG - -#undef USE_ASM_X86_64 -#undef USE_ENDOMORPHISM -#undef USE_FIELD_10X26 -#undef USE_FIELD_5X52 -#undef USE_FIELD_INV_BUILTIN -#undef USE_FIELD_INV_NUM -#undef USE_NUM_GMP -#undef USE_NUM_NONE -#undef USE_SCALAR_4X64 -#undef USE_SCALAR_8X32 -#undef USE_SCALAR_INV_BUILTIN -#undef USE_SCALAR_INV_NUM - -#define USE_NUM_NONE 1 -#define USE_FIELD_INV_BUILTIN 1 -#define USE_SCALAR_INV_BUILTIN 1 -#define USE_FIELD_10X26 1 -#define USE_SCALAR_8X32 1 - -#endif // USE_BASIC_CONFIG -#endif // _SECP256K1_BASIC_CONFIG_ diff --git a/external/libwally-core/src/secp256k1/src/bench.h b/external/libwally-core/src/secp256k1/src/bench.h deleted file mode 100644 index 3a71b4aaf..000000000 --- a/external/libwally-core/src/secp256k1/src/bench.h +++ /dev/null @@ -1,66 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_BENCH_H_ -#define _SECP256K1_BENCH_H_ - -#include -#include -#include "sys/time.h" - -static double gettimedouble(void) { - struct timeval tv; - gettimeofday(&tv, NULL); - return tv.tv_usec * 0.000001 + tv.tv_sec; -} - -void print_number(double x) { - double y = x; - int c = 0; - if (y < 0.0) { - y = -y; - } - while (y < 100.0) { - y *= 10.0; - c++; - } - printf("%.*f", c, x); -} - -void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) { - int i; - double min = HUGE_VAL; - double sum = 0.0; - double max = 0.0; - for (i = 0; i < count; i++) { - double begin, total; - if (setup != NULL) { - setup(data); - } - begin = gettimedouble(); - benchmark(data); - total = gettimedouble() - begin; - if (teardown != NULL) { - teardown(data); - } - if (total < min) { - min = total; - } - if (total > max) { - max = total; - } - sum += total; - } - printf("%s: min ", name); - print_number(min * 1000000.0 / iter); - printf("us / avg "); - print_number((sum / count) * 1000000.0 / iter); - printf("us / max "); - print_number(max * 1000000.0 / iter); - printf("us\n"); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/bench_ecdh.c b/external/libwally-core/src/secp256k1/src/bench_ecdh.c deleted file mode 100644 index cde5e2dbb..000000000 --- a/external/libwally-core/src/secp256k1/src/bench_ecdh.c +++ /dev/null @@ -1,54 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include - -#include "include/secp256k1.h" -#include "include/secp256k1_ecdh.h" -#include "util.h" -#include "bench.h" - -typedef struct { - secp256k1_context *ctx; - secp256k1_pubkey point; - unsigned char scalar[32]; -} bench_ecdh_t; - -static void bench_ecdh_setup(void* arg) { - int i; - bench_ecdh_t *data = (bench_ecdh_t*)arg; - const unsigned char point[] = { - 0x03, - 0x54, 0x94, 0xc1, 0x5d, 0x32, 0x09, 0x97, 0x06, - 0xc2, 0x39, 0x5f, 0x94, 0x34, 0x87, 0x45, 0xfd, - 0x75, 0x7c, 0xe3, 0x0e, 0x4e, 0x8c, 0x90, 0xfb, - 0xa2, 0xba, 0xd1, 0x84, 0xf8, 0x83, 0xc6, 0x9f - }; - - /* create a context with no capabilities */ - data->ctx = secp256k1_context_create(SECP256K1_FLAGS_TYPE_CONTEXT); - for (i = 0; i < 32; i++) { - data->scalar[i] = i + 1; - } - CHECK(secp256k1_ec_pubkey_parse(data->ctx, &data->point, point, sizeof(point)) == 1); -} - -static void bench_ecdh(void* arg) { - int i; - unsigned char res[32]; - bench_ecdh_t *data = (bench_ecdh_t*)arg; - - for (i = 0; i < 20000; i++) { - CHECK(secp256k1_ecdh(data->ctx, res, &data->point, data->scalar) == 1); - } -} - -int main(void) { - bench_ecdh_t data; - - run_benchmark("ecdh", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, 20000); - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/bench_internal.c b/external/libwally-core/src/secp256k1/src/bench_internal.c deleted file mode 100644 index 0809f77bd..000000000 --- a/external/libwally-core/src/secp256k1/src/bench_internal.c +++ /dev/null @@ -1,382 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ -#include - -#include "include/secp256k1.h" - -#include "util.h" -#include "hash_impl.h" -#include "num_impl.h" -#include "field_impl.h" -#include "group_impl.h" -#include "scalar_impl.h" -#include "ecmult_const_impl.h" -#include "ecmult_impl.h" -#include "bench.h" -#include "secp256k1.c" - -typedef struct { - secp256k1_scalar scalar_x, scalar_y; - secp256k1_fe fe_x, fe_y; - secp256k1_ge ge_x, ge_y; - secp256k1_gej gej_x, gej_y; - unsigned char data[64]; - int wnaf[256]; -} bench_inv_t; - -void bench_setup(void* arg) { - bench_inv_t *data = (bench_inv_t*)arg; - - static const unsigned char init_x[32] = { - 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13, - 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35, - 0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, - 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83 - }; - - static const unsigned char init_y[32] = { - 0x82, 0x83, 0x85, 0x87, 0x8b, 0x8d, 0x81, 0x83, - 0x97, 0xad, 0xaf, 0xb5, 0xb9, 0xbb, 0xbf, 0xc5, - 0xdb, 0xdd, 0xe3, 0xe7, 0xe9, 0xef, 0xf3, 0xf9, - 0x11, 0x15, 0x17, 0x1b, 0x1d, 0xb1, 0xbf, 0xd3 - }; - - secp256k1_scalar_set_b32(&data->scalar_x, init_x, NULL); - secp256k1_scalar_set_b32(&data->scalar_y, init_y, NULL); - secp256k1_fe_set_b32(&data->fe_x, init_x); - secp256k1_fe_set_b32(&data->fe_y, init_y); - CHECK(secp256k1_ge_set_xo_var(&data->ge_x, &data->fe_x, 0)); - CHECK(secp256k1_ge_set_xo_var(&data->ge_y, &data->fe_y, 1)); - secp256k1_gej_set_ge(&data->gej_x, &data->ge_x); - secp256k1_gej_set_ge(&data->gej_y, &data->ge_y); - memcpy(data->data, init_x, 32); - memcpy(data->data + 32, init_y, 32); -} - -void bench_scalar_add(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 2000000; i++) { - secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); - } -} - -void bench_scalar_negate(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 2000000; i++) { - secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x); - } -} - -void bench_scalar_sqr(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 200000; i++) { - secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x); - } -} - -void bench_scalar_mul(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 200000; i++) { - secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y); - } -} - -#ifdef USE_ENDOMORPHISM -void bench_scalar_split(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 20000; i++) { - secp256k1_scalar l, r; - secp256k1_scalar_split_lambda(&l, &r, &data->scalar_x); - secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); - } -} -#endif - -void bench_scalar_inverse(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 2000; i++) { - secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x); - secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); - } -} - -void bench_scalar_inverse_var(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 2000; i++) { - secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x); - secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); - } -} - -void bench_field_normalize(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 2000000; i++) { - secp256k1_fe_normalize(&data->fe_x); - } -} - -void bench_field_normalize_weak(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 2000000; i++) { - secp256k1_fe_normalize_weak(&data->fe_x); - } -} - -void bench_field_mul(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 200000; i++) { - secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y); - } -} - -void bench_field_sqr(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 200000; i++) { - secp256k1_fe_sqr(&data->fe_x, &data->fe_x); - } -} - -void bench_field_inverse(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 20000; i++) { - secp256k1_fe_inv(&data->fe_x, &data->fe_x); - secp256k1_fe_add(&data->fe_x, &data->fe_y); - } -} - -void bench_field_inverse_var(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 20000; i++) { - secp256k1_fe_inv_var(&data->fe_x, &data->fe_x); - secp256k1_fe_add(&data->fe_x, &data->fe_y); - } -} - -void bench_field_sqrt(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 20000; i++) { - secp256k1_fe_sqrt(&data->fe_x, &data->fe_x); - secp256k1_fe_add(&data->fe_x, &data->fe_y); - } -} - -void bench_group_double_var(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 200000; i++) { - secp256k1_gej_double_var(&data->gej_x, &data->gej_x, NULL); - } -} - -void bench_group_add_var(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 200000; i++) { - secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y, NULL); - } -} - -void bench_group_add_affine(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 200000; i++) { - secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y); - } -} - -void bench_group_add_affine_var(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 200000; i++) { - secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y, NULL); - } -} - -void bench_group_jacobi_var(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 20000; i++) { - secp256k1_gej_has_quad_y_var(&data->gej_x); - } -} - -void bench_ecmult_wnaf(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 20000; i++) { - secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A); - secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); - } -} - -void bench_wnaf_const(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - - for (i = 0; i < 20000; i++) { - secp256k1_wnaf_const(data->wnaf, data->scalar_x, WINDOW_A); - secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); - } -} - - -void bench_sha256(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_sha256_t sha; - - for (i = 0; i < 20000; i++) { - secp256k1_sha256_initialize(&sha); - secp256k1_sha256_write(&sha, data->data, 32); - secp256k1_sha256_finalize(&sha, data->data); - } -} - -void bench_hmac_sha256(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_hmac_sha256_t hmac; - - for (i = 0; i < 20000; i++) { - secp256k1_hmac_sha256_initialize(&hmac, data->data, 32); - secp256k1_hmac_sha256_write(&hmac, data->data, 32); - secp256k1_hmac_sha256_finalize(&hmac, data->data); - } -} - -void bench_rfc6979_hmac_sha256(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_rfc6979_hmac_sha256_t rng; - - for (i = 0; i < 20000; i++) { - secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 64); - secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32); - } -} - -void bench_context_verify(void* arg) { - int i; - (void)arg; - for (i = 0; i < 20; i++) { - secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_VERIFY)); - } -} - -void bench_context_sign(void* arg) { - int i; - (void)arg; - for (i = 0; i < 200; i++) { - secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_SIGN)); - } -} - -#ifndef USE_NUM_NONE -void bench_num_jacobi(void* arg) { - int i; - bench_inv_t *data = (bench_inv_t*)arg; - secp256k1_num nx, norder; - - secp256k1_scalar_get_num(&nx, &data->scalar_x); - secp256k1_scalar_order_get_num(&norder); - secp256k1_scalar_get_num(&norder, &data->scalar_y); - - for (i = 0; i < 200000; i++) { - secp256k1_num_jacobi(&nx, &norder); - } -} -#endif - -int have_flag(int argc, char** argv, char *flag) { - char** argm = argv + argc; - argv++; - if (argv == argm) { - return 1; - } - while (argv != NULL && argv != argm) { - if (strcmp(*argv, flag) == 0) { - return 1; - } - argv++; - } - return 0; -} - -int main(int argc, char **argv) { - bench_inv_t data; - if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000); - if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000); - if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "sqr")) run_benchmark("scalar_sqr", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000); - if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "mul")) run_benchmark("scalar_mul", bench_scalar_mul, bench_setup, NULL, &data, 10, 200000); -#ifdef USE_ENDOMORPHISM - if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "split")) run_benchmark("scalar_split", bench_scalar_split, bench_setup, NULL, &data, 10, 20000); -#endif - if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse", bench_scalar_inverse, bench_setup, NULL, &data, 10, 2000); - if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse_var", bench_scalar_inverse_var, bench_setup, NULL, &data, 10, 2000); - - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize", bench_field_normalize, bench_setup, NULL, &data, 10, 2000000); - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize_weak", bench_field_normalize_weak, bench_setup, NULL, &data, 10, 2000000); - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqr")) run_benchmark("field_sqr", bench_field_sqr, bench_setup, NULL, &data, 10, 200000); - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000); - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000); - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000); - if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt", bench_field_sqrt, bench_setup, NULL, &data, 10, 20000); - - if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000); - if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000); - if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000); - if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000); - if (have_flag(argc, argv, "group") || have_flag(argc, argv, "jacobi")) run_benchmark("group_jacobi_var", bench_group_jacobi_var, bench_setup, NULL, &data, 10, 20000); - - if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("wnaf_const", bench_wnaf_const, bench_setup, NULL, &data, 10, 20000); - if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000); - - if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, 20000); - if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "hmac")) run_benchmark("hash_hmac_sha256", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000); - if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "rng6979")) run_benchmark("hash_rfc6979_hmac_sha256", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000); - - if (have_flag(argc, argv, "context") || have_flag(argc, argv, "verify")) run_benchmark("context_verify", bench_context_verify, bench_setup, NULL, &data, 10, 20); - if (have_flag(argc, argv, "context") || have_flag(argc, argv, "sign")) run_benchmark("context_sign", bench_context_sign, bench_setup, NULL, &data, 10, 200); - -#ifndef USE_NUM_NONE - if (have_flag(argc, argv, "num") || have_flag(argc, argv, "jacobi")) run_benchmark("num_jacobi", bench_num_jacobi, bench_setup, NULL, &data, 10, 200000); -#endif - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/bench_rangeproof.c b/external/libwally-core/src/secp256k1/src/bench_rangeproof.c deleted file mode 100644 index 54776b72f..000000000 --- a/external/libwally-core/src/secp256k1/src/bench_rangeproof.c +++ /dev/null @@ -1,65 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014, 2015 Pieter Wuille, Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include - -#include "include/secp256k1_rangeproof.h" -#include "util.h" -#include "bench.h" - -typedef struct { - secp256k1_context* ctx; - unsigned char commit[33]; - unsigned char proof[5134]; - unsigned char blind[32]; - int len; - int min_bits; - uint64_t v; -} bench_rangeproof_t; - -static void bench_rangeproof_setup(void* arg) { - int i; - uint64_t minv; - uint64_t maxv; - bench_rangeproof_t *data = (bench_rangeproof_t*)arg; - - data->v = 0; - for (i = 0; i < 32; i++) data->blind[i] = i + 1; - CHECK(secp256k1_pedersen_commit(data->ctx, data->commit, data->blind, data->v)); - data->len = 5134; - CHECK(secp256k1_rangeproof_sign(data->ctx, data->proof, &data->len, 0, data->commit, data->blind, data->commit, 0, data->min_bits, data->v)); - CHECK(secp256k1_rangeproof_verify(data->ctx, &minv, &maxv, data->commit, data->proof, data->len)); -} - -static void bench_rangeproof(void* arg) { - int i; - bench_rangeproof_t *data = (bench_rangeproof_t*)arg; - - for (i = 0; i < 1000; i++) { - int j; - uint64_t minv; - uint64_t maxv; - j = secp256k1_rangeproof_verify(data->ctx, &minv, &maxv, data->commit, data->proof, data->len); - for (j = 0; j < 4; j++) { - data->proof[j + 2 + 32 *((data->min_bits + 1) >> 1) - 4] = (i >> 8)&255; - } - } -} - -int main(void) { - bench_rangeproof_t data; - - data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - secp256k1_pedersen_context_initialize(data.ctx); - secp256k1_rangeproof_context_initialize(data.ctx); - - data.min_bits = 32; - - run_benchmark("rangeproof_verify_bit", bench_rangeproof, bench_rangeproof_setup, NULL, &data, 10, 1000 * data.min_bits); - - secp256k1_context_destroy(data.ctx); - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/bench_recover.c b/external/libwally-core/src/secp256k1/src/bench_recover.c deleted file mode 100644 index 6489378cc..000000000 --- a/external/libwally-core/src/secp256k1/src/bench_recover.c +++ /dev/null @@ -1,60 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include "include/secp256k1.h" -#include "include/secp256k1_recovery.h" -#include "util.h" -#include "bench.h" - -typedef struct { - secp256k1_context *ctx; - unsigned char msg[32]; - unsigned char sig[64]; -} bench_recover_t; - -void bench_recover(void* arg) { - int i; - bench_recover_t *data = (bench_recover_t*)arg; - secp256k1_pubkey pubkey; - unsigned char pubkeyc[33]; - - for (i = 0; i < 20000; i++) { - int j; - size_t pubkeylen = 33; - secp256k1_ecdsa_recoverable_signature sig; - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(data->ctx, &sig, data->sig, i % 2)); - CHECK(secp256k1_ecdsa_recover(data->ctx, &pubkey, &sig, data->msg)); - CHECK(secp256k1_ec_pubkey_serialize(data->ctx, pubkeyc, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED)); - for (j = 0; j < 32; j++) { - data->sig[j + 32] = data->msg[j]; /* Move former message to S. */ - data->msg[j] = data->sig[j]; /* Move former R to message. */ - data->sig[j] = pubkeyc[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ - } - } -} - -void bench_recover_setup(void* arg) { - int i; - bench_recover_t *data = (bench_recover_t*)arg; - - for (i = 0; i < 32; i++) { - data->msg[i] = 1 + i; - } - for (i = 0; i < 64; i++) { - data->sig[i] = 65 + i; - } -} - -int main(void) { - bench_recover_t data; - - data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); - - run_benchmark("ecdsa_recover", bench_recover, bench_recover_setup, NULL, &data, 10, 20000); - - secp256k1_context_destroy(data.ctx); - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/bench_schnorr_verify.c b/external/libwally-core/src/secp256k1/src/bench_schnorr_verify.c deleted file mode 100644 index 5f137dda2..000000000 --- a/external/libwally-core/src/secp256k1/src/bench_schnorr_verify.c +++ /dev/null @@ -1,73 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include -#include - -#include "include/secp256k1.h" -#include "include/secp256k1_schnorr.h" -#include "util.h" -#include "bench.h" - -typedef struct { - unsigned char key[32]; - unsigned char sig[64]; - unsigned char pubkey[33]; - size_t pubkeylen; -} benchmark_schnorr_sig_t; - -typedef struct { - secp256k1_context *ctx; - unsigned char msg[32]; - benchmark_schnorr_sig_t sigs[64]; - int numsigs; -} benchmark_schnorr_verify_t; - -static void benchmark_schnorr_init(void* arg) { - int i, k; - benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg; - - for (i = 0; i < 32; i++) { - data->msg[i] = 1 + i; - } - for (k = 0; k < data->numsigs; k++) { - secp256k1_pubkey pubkey; - for (i = 0; i < 32; i++) { - data->sigs[k].key[i] = 33 + i + k; - } - secp256k1_schnorr_sign(data->ctx, data->sigs[k].sig, data->msg, data->sigs[k].key, NULL, NULL); - data->sigs[k].pubkeylen = 33; - CHECK(secp256k1_ec_pubkey_create(data->ctx, &pubkey, data->sigs[k].key)); - CHECK(secp256k1_ec_pubkey_serialize(data->ctx, data->sigs[k].pubkey, &data->sigs[k].pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED)); - } -} - -static void benchmark_schnorr_verify(void* arg) { - int i; - benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg; - - for (i = 0; i < 20000 / data->numsigs; i++) { - secp256k1_pubkey pubkey; - data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF); - CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->sigs[0].pubkey, data->sigs[0].pubkeylen)); - CHECK(secp256k1_schnorr_verify(data->ctx, data->sigs[0].sig, data->msg, &pubkey) == ((i & 0xFF) == 0)); - data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF); - } -} - - - -int main(void) { - benchmark_schnorr_verify_t data; - - data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - - data.numsigs = 1; - run_benchmark("schnorr_verify", benchmark_schnorr_verify, benchmark_schnorr_init, NULL, &data, 10, 20000); - - secp256k1_context_destroy(data.ctx); - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/bench_sign.c b/external/libwally-core/src/secp256k1/src/bench_sign.c deleted file mode 100644 index ed7224d75..000000000 --- a/external/libwally-core/src/secp256k1/src/bench_sign.c +++ /dev/null @@ -1,56 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include "include/secp256k1.h" -#include "util.h" -#include "bench.h" - -typedef struct { - secp256k1_context* ctx; - unsigned char msg[32]; - unsigned char key[32]; -} bench_sign_t; - -static void bench_sign_setup(void* arg) { - int i; - bench_sign_t *data = (bench_sign_t*)arg; - - for (i = 0; i < 32; i++) { - data->msg[i] = i + 1; - } - for (i = 0; i < 32; i++) { - data->key[i] = i + 65; - } -} - -static void bench_sign(void* arg) { - int i; - bench_sign_t *data = (bench_sign_t*)arg; - - unsigned char sig[74]; - for (i = 0; i < 20000; i++) { - size_t siglen = 74; - int j; - secp256k1_ecdsa_signature signature; - CHECK(secp256k1_ecdsa_sign(data->ctx, &signature, data->msg, data->key, NULL, NULL)); - CHECK(secp256k1_ecdsa_signature_serialize_der(data->ctx, sig, &siglen, &signature)); - for (j = 0; j < 32; j++) { - data->msg[j] = sig[j]; - data->key[j] = sig[j + 32]; - } - } -} - -int main(void) { - bench_sign_t data; - - data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); - - run_benchmark("ecdsa_sign", bench_sign, bench_sign_setup, NULL, &data, 10, 20000); - - secp256k1_context_destroy(data.ctx); - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/bench_verify.c b/external/libwally-core/src/secp256k1/src/bench_verify.c deleted file mode 100644 index 418defa0a..000000000 --- a/external/libwally-core/src/secp256k1/src/bench_verify.c +++ /dev/null @@ -1,112 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include -#include - -#include "include/secp256k1.h" -#include "util.h" -#include "bench.h" - -#ifdef ENABLE_OPENSSL_TESTS -#include -#include -#include -#endif - -typedef struct { - secp256k1_context *ctx; - unsigned char msg[32]; - unsigned char key[32]; - unsigned char sig[72]; - size_t siglen; - unsigned char pubkey[33]; - size_t pubkeylen; -#ifdef ENABLE_OPENSSL_TESTS - EC_GROUP* ec_group; -#endif -} benchmark_verify_t; - -static void benchmark_verify(void* arg) { - int i; - benchmark_verify_t* data = (benchmark_verify_t*)arg; - - for (i = 0; i < 20000; i++) { - secp256k1_pubkey pubkey; - secp256k1_ecdsa_signature sig; - data->sig[data->siglen - 1] ^= (i & 0xFF); - data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); - data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); - CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->pubkey, data->pubkeylen) == 1); - CHECK(secp256k1_ecdsa_signature_parse_der(data->ctx, &sig, data->sig, data->siglen) == 1); - CHECK(secp256k1_ecdsa_verify(data->ctx, &sig, data->msg, &pubkey) == (i == 0)); - data->sig[data->siglen - 1] ^= (i & 0xFF); - data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); - data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); - } -} - -#ifdef ENABLE_OPENSSL_TESTS -static void benchmark_verify_openssl(void* arg) { - int i; - benchmark_verify_t* data = (benchmark_verify_t*)arg; - - for (i = 0; i < 20000; i++) { - data->sig[data->siglen - 1] ^= (i & 0xFF); - data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); - data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); - { - EC_KEY *pkey = EC_KEY_new(); - const unsigned char *pubkey = &data->pubkey[0]; - int result; - - CHECK(pkey != NULL); - result = EC_KEY_set_group(pkey, data->ec_group); - CHECK(result); - result = (o2i_ECPublicKey(&pkey, &pubkey, data->pubkeylen)) != NULL; - CHECK(result); - result = ECDSA_verify(0, &data->msg[0], sizeof(data->msg), &data->sig[0], data->siglen, pkey) == (i == 0); - CHECK(result); - EC_KEY_free(pkey); - } - data->sig[data->siglen - 1] ^= (i & 0xFF); - data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); - data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); - } -} -#endif - -int main(void) { - int i; - secp256k1_pubkey pubkey; - secp256k1_ecdsa_signature sig; - benchmark_verify_t data; - - data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - - for (i = 0; i < 32; i++) { - data.msg[i] = 1 + i; - } - for (i = 0; i < 32; i++) { - data.key[i] = 33 + i; - } - data.siglen = 72; - CHECK(secp256k1_ecdsa_sign(data.ctx, &sig, data.msg, data.key, NULL, NULL)); - CHECK(secp256k1_ecdsa_signature_serialize_der(data.ctx, data.sig, &data.siglen, &sig)); - CHECK(secp256k1_ec_pubkey_create(data.ctx, &pubkey, data.key)); - data.pubkeylen = 33; - CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1); - - run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); -#ifdef ENABLE_OPENSSL_TESTS - data.ec_group = EC_GROUP_new_by_curve_name(NID_secp256k1); - run_benchmark("ecdsa_verify_openssl", benchmark_verify_openssl, NULL, NULL, &data, 10, 20000); - EC_GROUP_free(data.ec_group); -#endif - - secp256k1_context_destroy(data.ctx); - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/ecdsa.h b/external/libwally-core/src/secp256k1/src/ecdsa.h deleted file mode 100644 index 54ae101b9..000000000 --- a/external/libwally-core/src/secp256k1/src/ecdsa.h +++ /dev/null @@ -1,21 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECDSA_ -#define _SECP256K1_ECDSA_ - -#include - -#include "scalar.h" -#include "group.h" -#include "ecmult.h" - -static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *r, secp256k1_scalar *s, const unsigned char *sig, size_t size); -static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar *r, const secp256k1_scalar *s); -static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar* r, const secp256k1_scalar* s, const secp256k1_ge *pubkey, const secp256k1_scalar *message); -static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/ecdsa_impl.h b/external/libwally-core/src/secp256k1/src/ecdsa_impl.h deleted file mode 100644 index d110b4bb1..000000000 --- a/external/libwally-core/src/secp256k1/src/ecdsa_impl.h +++ /dev/null @@ -1,303 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - - -#ifndef _SECP256K1_ECDSA_IMPL_H_ -#define _SECP256K1_ECDSA_IMPL_H_ - -#include "scalar.h" -#include "field.h" -#include "group.h" -#include "ecmult.h" -#include "ecmult_gen.h" -#include "ecdsa.h" - -/** Group order for secp256k1 defined as 'n' in "Standards for Efficient Cryptography" (SEC2) 2.7.1 - * sage: for t in xrange(1023, -1, -1): - * .. p = 2**256 - 2**32 - t - * .. if p.is_prime(): - * .. print '%x'%p - * .. break - * 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f' - * sage: a = 0 - * sage: b = 7 - * sage: F = FiniteField (p) - * sage: '%x' % (EllipticCurve ([F (a), F (b)]).order()) - * 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141' - */ -static const secp256k1_fe secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( - 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, - 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL -); - -/** Difference between field and order, values 'p' and 'n' values defined in - * "Standards for Efficient Cryptography" (SEC2) 2.7.1. - * sage: p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F - * sage: a = 0 - * sage: b = 7 - * sage: F = FiniteField (p) - * sage: '%x' % (p - EllipticCurve ([F (a), F (b)]).order()) - * '14551231950b75fc4402da1722fc9baee' - */ -static const secp256k1_fe secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( - 0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL -); - -static int secp256k1_der_read_len(const unsigned char **sigp, const unsigned char *sigend) { - int lenleft, b1; - size_t ret = 0; - if (*sigp >= sigend) { - return -1; - } - b1 = *((*sigp)++); - if (b1 == 0xFF) { - /* X.690-0207 8.1.3.5.c the value 0xFF shall not be used. */ - return -1; - } - if ((b1 & 0x80) == 0) { - /* X.690-0207 8.1.3.4 short form length octets */ - return b1; - } - if (b1 == 0x80) { - /* Indefinite length is not allowed in DER. */ - return -1; - } - /* X.690-207 8.1.3.5 long form length octets */ - lenleft = b1 & 0x7F; - if (lenleft > sigend - *sigp) { - return -1; - } - if (**sigp == 0) { - /* Not the shortest possible length encoding. */ - return -1; - } - if ((size_t)lenleft > sizeof(size_t)) { - /* The resulting length would exceed the range of a size_t, so - * certainly longer than the passed array size. - */ - return -1; - } - while (lenleft > 0) { - if ((ret >> ((sizeof(size_t) - 1) * 8)) != 0) { - } - ret = (ret << 8) | **sigp; - if (ret + lenleft > (size_t)(sigend - *sigp)) { - /* Result exceeds the length of the passed array. */ - return -1; - } - (*sigp)++; - lenleft--; - } - if (ret < 128) { - /* Not the shortest possible length encoding. */ - return -1; - } - return ret; -} - -static int secp256k1_der_parse_integer(secp256k1_scalar *r, const unsigned char **sig, const unsigned char *sigend) { - int overflow = 0; - unsigned char ra[32] = {0}; - int rlen; - - if (*sig == sigend || **sig != 0x02) { - /* Not a primitive integer (X.690-0207 8.3.1). */ - return 0; - } - (*sig)++; - rlen = secp256k1_der_read_len(sig, sigend); - if (rlen <= 0 || (*sig) + rlen > sigend) { - /* Exceeds bounds or not at least length 1 (X.690-0207 8.3.1). */ - return 0; - } - if (**sig == 0x00 && rlen > 1 && (((*sig)[1]) & 0x80) == 0x00) { - /* Excessive 0x00 padding. */ - return 0; - } - if (**sig == 0xFF && rlen > 1 && (((*sig)[1]) & 0x80) == 0x80) { - /* Excessive 0xFF padding. */ - return 0; - } - if ((**sig & 0x80) == 0x80) { - /* Negative. */ - overflow = 1; - } - while (rlen > 0 && **sig == 0) { - /* Skip leading zero bytes */ - rlen--; - (*sig)++; - } - if (rlen > 32) { - overflow = 1; - } - if (!overflow) { - memcpy(ra + 32 - rlen, *sig, rlen); - secp256k1_scalar_set_b32(r, ra, &overflow); - } - if (overflow) { - secp256k1_scalar_set_int(r, 0); - } - (*sig) += rlen; - return 1; -} - -static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *rr, secp256k1_scalar *rs, const unsigned char *sig, size_t size) { - const unsigned char *sigend = sig + size; - int rlen; - if (sig == sigend || *(sig++) != 0x30) { - /* The encoding doesn't start with a constructed sequence (X.690-0207 8.9.1). */ - return 0; - } - rlen = secp256k1_der_read_len(&sig, sigend); - if (rlen < 0 || sig + rlen > sigend) { - /* Tuple exceeds bounds */ - return 0; - } - if (sig + rlen != sigend) { - /* Garbage after tuple. */ - return 0; - } - - if (!secp256k1_der_parse_integer(rr, &sig, sigend)) { - return 0; - } - if (!secp256k1_der_parse_integer(rs, &sig, sigend)) { - return 0; - } - - if (sig != sigend) { - /* Trailing garbage inside tuple. */ - return 0; - } - - return 1; -} - -static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar* ar, const secp256k1_scalar* as) { - unsigned char r[33] = {0}, s[33] = {0}; - unsigned char *rp = r, *sp = s; - size_t lenR = 33, lenS = 33; - secp256k1_scalar_get_b32(&r[1], ar); - secp256k1_scalar_get_b32(&s[1], as); - while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; } - while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; } - if (*size < 6+lenS+lenR) { - *size = 6 + lenS + lenR; - return 0; - } - *size = 6 + lenS + lenR; - sig[0] = 0x30; - sig[1] = 4 + lenS + lenR; - sig[2] = 0x02; - sig[3] = lenR; - memcpy(sig+4, rp, lenR); - sig[4+lenR] = 0x02; - sig[5+lenR] = lenS; - memcpy(sig+lenR+6, sp, lenS); - return 1; -} - -static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar *sigs, const secp256k1_ge *pubkey, const secp256k1_scalar *message) { - unsigned char c[32]; - secp256k1_scalar sn, u1, u2; - secp256k1_fe xr; - secp256k1_gej pubkeyj; - secp256k1_gej pr; - - if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { - return 0; - } - - secp256k1_scalar_inverse_var(&sn, sigs); - secp256k1_scalar_mul(&u1, &sn, message); - secp256k1_scalar_mul(&u2, &sn, sigr); - secp256k1_gej_set_ge(&pubkeyj, pubkey); - secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1); - if (secp256k1_gej_is_infinity(&pr)) { - return 0; - } - secp256k1_scalar_get_b32(c, sigr); - secp256k1_fe_set_b32(&xr, c); - - /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n) - * in xr. Naively, we would extract the x coordinate from pr (requiring a inversion modulo p), - * compute the remainder modulo n, and compare it to xr. However: - * - * xr == X(pr) mod n - * <=> exists h. (xr + h * n < p && xr + h * n == X(pr)) - * [Since 2 * n > p, h can only be 0 or 1] - * <=> (xr == X(pr)) || (xr + n < p && xr + n == X(pr)) - * [In Jacobian coordinates, X(pr) is pr.x / pr.z^2 mod p] - * <=> (xr == pr.x / pr.z^2 mod p) || (xr + n < p && xr + n == pr.x / pr.z^2 mod p) - * [Multiplying both sides of the equations by pr.z^2 mod p] - * <=> (xr * pr.z^2 mod p == pr.x) || (xr + n < p && (xr + n) * pr.z^2 mod p == pr.x) - * - * Thus, we can avoid the inversion, but we have to check both cases separately. - * secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test. - */ - if (secp256k1_gej_eq_x_var(&xr, &pr)) { - /* xr * pr.z^2 mod p == pr.x, so the signature is valid. */ - return 1; - } - if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) { - /* xr + n >= p, so we can skip testing the second case. */ - return 0; - } - secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe); - if (secp256k1_gej_eq_x_var(&xr, &pr)) { - /* (xr + n) * pr.z^2 mod p == pr.x, so the signature is valid. */ - return 1; - } - return 0; -} - -static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) { - unsigned char b[32]; - secp256k1_gej rp; - secp256k1_ge r; - secp256k1_scalar n; - int overflow = 0; - - secp256k1_ecmult_gen(ctx, &rp, nonce); - secp256k1_ge_set_gej(&r, &rp); - secp256k1_fe_normalize(&r.x); - secp256k1_fe_normalize(&r.y); - secp256k1_fe_get_b32(b, &r.x); - secp256k1_scalar_set_b32(sigr, b, &overflow); - if (secp256k1_scalar_is_zero(sigr)) { - /* P.x = order is on the curve, so technically sig->r could end up zero, which would be an invalid signature. - * This branch is cryptographically unreachable as hitting it requires finding the discrete log of P.x = N. - */ - secp256k1_gej_clear(&rp); - secp256k1_ge_clear(&r); - return 0; - } - if (recid) { - /* The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log - * of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria. - */ - *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); - } - secp256k1_scalar_mul(&n, sigr, seckey); - secp256k1_scalar_add(&n, &n, message); - secp256k1_scalar_inverse(sigs, nonce); - secp256k1_scalar_mul(sigs, sigs, &n); - secp256k1_scalar_clear(&n); - secp256k1_gej_clear(&rp); - secp256k1_ge_clear(&r); - if (secp256k1_scalar_is_zero(sigs)) { - return 0; - } - if (secp256k1_scalar_is_high(sigs)) { - secp256k1_scalar_negate(sigs, sigs); - if (recid) { - *recid ^= 1; - } - } - return 1; -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/eckey.h b/external/libwally-core/src/secp256k1/src/eckey.h deleted file mode 100644 index 42739a3be..000000000 --- a/external/libwally-core/src/secp256k1/src/eckey.h +++ /dev/null @@ -1,25 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECKEY_ -#define _SECP256K1_ECKEY_ - -#include - -#include "group.h" -#include "scalar.h" -#include "ecmult.h" -#include "ecmult_gen.h" - -static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size); -static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed); - -static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak); -static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); -static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak); -static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/eckey_impl.h b/external/libwally-core/src/secp256k1/src/eckey_impl.h deleted file mode 100644 index ce38071ac..000000000 --- a/external/libwally-core/src/secp256k1/src/eckey_impl.h +++ /dev/null @@ -1,99 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECKEY_IMPL_H_ -#define _SECP256K1_ECKEY_IMPL_H_ - -#include "eckey.h" - -#include "scalar.h" -#include "field.h" -#include "group.h" -#include "ecmult_gen.h" - -static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) { - if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { - secp256k1_fe x; - return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03); - } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { - secp256k1_fe x, y; - if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { - return 0; - } - secp256k1_ge_set_xy(elem, &x, &y); - if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) { - return 0; - } - return secp256k1_ge_is_valid_var(elem); - } else { - return 0; - } -} - -static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed) { - if (secp256k1_ge_is_infinity(elem)) { - return 0; - } - secp256k1_fe_normalize_var(&elem->x); - secp256k1_fe_normalize_var(&elem->y); - secp256k1_fe_get_b32(&pub[1], &elem->x); - if (compressed) { - *size = 33; - pub[0] = 0x02 | (secp256k1_fe_is_odd(&elem->y) ? 0x01 : 0x00); - } else { - *size = 65; - pub[0] = 0x04; - secp256k1_fe_get_b32(&pub[33], &elem->y); - } - return 1; -} - -static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak) { - secp256k1_scalar_add(key, key, tweak); - if (secp256k1_scalar_is_zero(key)) { - return 0; - } - return 1; -} - -static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { - secp256k1_gej pt; - secp256k1_scalar one; - secp256k1_gej_set_ge(&pt, key); - secp256k1_scalar_set_int(&one, 1); - secp256k1_ecmult(ctx, &pt, &pt, &one, tweak); - - if (secp256k1_gej_is_infinity(&pt)) { - return 0; - } - secp256k1_ge_set_gej(key, &pt); - return 1; -} - -static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak) { - if (secp256k1_scalar_is_zero(tweak)) { - return 0; - } - - secp256k1_scalar_mul(key, key, tweak); - return 1; -} - -static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { - secp256k1_scalar zero; - secp256k1_gej pt; - if (secp256k1_scalar_is_zero(tweak)) { - return 0; - } - - secp256k1_scalar_set_int(&zero, 0); - secp256k1_gej_set_ge(&pt, key); - secp256k1_ecmult(ctx, &pt, &pt, tweak, &zero); - secp256k1_ge_set_gej(key, &pt); - return 1; -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/ecmult.h b/external/libwally-core/src/secp256k1/src/ecmult.h deleted file mode 100644 index 20484134f..000000000 --- a/external/libwally-core/src/secp256k1/src/ecmult.h +++ /dev/null @@ -1,31 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECMULT_ -#define _SECP256K1_ECMULT_ - -#include "num.h" -#include "group.h" - -typedef struct { - /* For accelerating the computation of a*P + b*G: */ - secp256k1_ge_storage (*pre_g)[]; /* odd multiples of the generator */ -#ifdef USE_ENDOMORPHISM - secp256k1_ge_storage (*pre_g_128)[]; /* odd multiples of 2^128*generator */ -#endif -} secp256k1_ecmult_context; - -static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx); -static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb); -static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, - const secp256k1_ecmult_context *src, const secp256k1_callback *cb); -static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx); -static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx); - -/** Double multiply: R = na*A + ng*G */ -static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/ecmult_const.h b/external/libwally-core/src/secp256k1/src/ecmult_const.h deleted file mode 100644 index 2b0097655..000000000 --- a/external/libwally-core/src/secp256k1/src/ecmult_const.h +++ /dev/null @@ -1,15 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Andrew Poelstra * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECMULT_CONST_ -#define _SECP256K1_ECMULT_CONST_ - -#include "scalar.h" -#include "group.h" - -static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/ecmult_const_impl.h b/external/libwally-core/src/secp256k1/src/ecmult_const_impl.h deleted file mode 100644 index 7a6a25318..000000000 --- a/external/libwally-core/src/secp256k1/src/ecmult_const_impl.h +++ /dev/null @@ -1,239 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECMULT_CONST_IMPL_ -#define _SECP256K1_ECMULT_CONST_IMPL_ - -#include "scalar.h" -#include "group.h" -#include "ecmult_const.h" -#include "ecmult_impl.h" - -#ifdef USE_ENDOMORPHISM - #define WNAF_BITS 128 -#else - #define WNAF_BITS 256 -#endif -#define WNAF_SIZE(w) ((WNAF_BITS + (w) - 1) / (w)) - -/* This is like `ECMULT_TABLE_GET_GE` but is constant time */ -#define ECMULT_CONST_TABLE_GET_GE(r,pre,n,w) do { \ - int m; \ - int abs_n = (n) * (((n) > 0) * 2 - 1); \ - int idx_n = abs_n / 2; \ - secp256k1_fe neg_y; \ - VERIFY_CHECK(((n) & 1) == 1); \ - VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ - VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ - VERIFY_SETUP(secp256k1_fe_clear(&(r)->x)); \ - VERIFY_SETUP(secp256k1_fe_clear(&(r)->y)); \ - for (m = 0; m < ECMULT_TABLE_SIZE(w); m++) { \ - /* This loop is used to avoid secret data in array indices. See - * the comment in ecmult_gen_impl.h for rationale. */ \ - secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == idx_n); \ - secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == idx_n); \ - } \ - (r)->infinity = 0; \ - secp256k1_fe_negate(&neg_y, &(r)->y, 1); \ - secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \ -} while(0) - - -/** Convert a number to WNAF notation. The number becomes represented by sum(2^{wi} * wnaf[i], i=0..return_val) - * with the following guarantees: - * - each wnaf[i] an odd integer between -(1 << w) and (1 << w) - * - each wnaf[i] is nonzero - * - the number of words set is returned; this is always (WNAF_BITS + w - 1) / w - * - * Adapted from `The Width-w NAF Method Provides Small Memory and Fast Elliptic Scalar - * Multiplications Secure against Side Channel Attacks`, Okeya and Tagaki. M. Joye (Ed.) - * CT-RSA 2003, LNCS 2612, pp. 328-443, 2003. Springer-Verlagy Berlin Heidelberg 2003 - * - * Numbers reference steps of `Algorithm SPA-resistant Width-w NAF with Odd Scalar` on pp. 335 - */ -static int secp256k1_wnaf_const(int *wnaf, secp256k1_scalar s, int w) { - int global_sign; - int skew = 0; - int word = 0; - - /* 1 2 3 */ - int u_last; - int u; - - int flip; - int bit; - secp256k1_scalar neg_s; - int not_neg_one; - /* Note that we cannot handle even numbers by negating them to be odd, as is - * done in other implementations, since if our scalars were specified to have - * width < 256 for performance reasons, their negations would have width 256 - * and we'd lose any performance benefit. Instead, we use a technique from - * Section 4.2 of the Okeya/Tagaki paper, which is to add either 1 (for even) - * or 2 (for odd) to the number we are encoding, returning a skew value indicating - * this, and having the caller compensate after doing the multiplication. */ - - /* Negative numbers will be negated to keep their bit representation below the maximum width */ - flip = secp256k1_scalar_is_high(&s); - /* We add 1 to even numbers, 2 to odd ones, noting that negation flips parity */ - bit = flip ^ (s.d[0] & 1); - /* We check for negative one, since adding 2 to it will cause an overflow */ - secp256k1_scalar_negate(&neg_s, &s); - not_neg_one = !secp256k1_scalar_is_one(&neg_s); - secp256k1_scalar_cadd_bit(&s, bit, not_neg_one); - /* If we had negative one, flip == 1, s.d[0] == 0, bit == 1, so caller expects - * that we added two to it and flipped it. In fact for -1 these operations are - * identical. We only flipped, but since skewing is required (in the sense that - * the skew must be 1 or 2, never zero) and flipping is not, we need to change - * our flags to claim that we only skewed. */ - global_sign = secp256k1_scalar_cond_negate(&s, flip); - global_sign *= not_neg_one * 2 - 1; - skew = 1 << bit; - - /* 4 */ - u_last = secp256k1_scalar_shr_int(&s, w); - while (word * w < WNAF_BITS) { - int sign; - int even; - - /* 4.1 4.4 */ - u = secp256k1_scalar_shr_int(&s, w); - /* 4.2 */ - even = ((u & 1) == 0); - sign = 2 * (u_last > 0) - 1; - u += sign * even; - u_last -= sign * even * (1 << w); - - /* 4.3, adapted for global sign change */ - wnaf[word++] = u_last * global_sign; - - u_last = u; - } - wnaf[word] = u * global_sign; - - VERIFY_CHECK(secp256k1_scalar_is_zero(&s)); - VERIFY_CHECK(word == WNAF_SIZE(w)); - return skew; -} - - -static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *scalar) { - secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; - secp256k1_ge tmpa; - secp256k1_fe Z; - - int skew_1; - int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)]; -#ifdef USE_ENDOMORPHISM - secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; - int wnaf_lam[1 + WNAF_SIZE(WINDOW_A - 1)]; - int skew_lam; - secp256k1_scalar q_1, q_lam; -#endif - - int i; - secp256k1_scalar sc = *scalar; - - /* build wnaf representation for q. */ -#ifdef USE_ENDOMORPHISM - /* split q into q_1 and q_lam (where q = q_1 + q_lam*lambda, and q_1 and q_lam are ~128 bit) */ - secp256k1_scalar_split_lambda(&q_1, &q_lam, &sc); - skew_1 = secp256k1_wnaf_const(wnaf_1, q_1, WINDOW_A - 1); - skew_lam = secp256k1_wnaf_const(wnaf_lam, q_lam, WINDOW_A - 1); -#else - skew_1 = secp256k1_wnaf_const(wnaf_1, sc, WINDOW_A - 1); -#endif - - /* Calculate odd multiples of a. - * All multiples are brought to the same Z 'denominator', which is stored - * in Z. Due to secp256k1' isomorphism we can do all operations pretending - * that the Z coordinate was 1, use affine addition formulae, and correct - * the Z coordinate of the result once at the end. - */ - secp256k1_gej_set_ge(r, a); - secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, r); - for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { - secp256k1_fe_normalize_weak(&pre_a[i].y); - } -#ifdef USE_ENDOMORPHISM - for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { - secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); - } -#endif - - /* first loop iteration (separated out so we can directly set r, rather - * than having it start at infinity, get doubled several times, then have - * its new value added to it) */ - i = wnaf_1[WNAF_SIZE(WINDOW_A - 1)]; - VERIFY_CHECK(i != 0); - ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A); - secp256k1_gej_set_ge(r, &tmpa); -#ifdef USE_ENDOMORPHISM - i = wnaf_lam[WNAF_SIZE(WINDOW_A - 1)]; - VERIFY_CHECK(i != 0); - ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, i, WINDOW_A); - secp256k1_gej_add_ge(r, r, &tmpa); -#endif - /* remaining loop iterations */ - for (i = WNAF_SIZE(WINDOW_A - 1) - 1; i >= 0; i--) { - int n; - int j; - for (j = 0; j < WINDOW_A - 1; ++j) { - secp256k1_gej_double_nonzero(r, r, NULL); - } - - n = wnaf_1[i]; - ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); - VERIFY_CHECK(n != 0); - secp256k1_gej_add_ge(r, r, &tmpa); -#ifdef USE_ENDOMORPHISM - n = wnaf_lam[i]; - ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); - VERIFY_CHECK(n != 0); - secp256k1_gej_add_ge(r, r, &tmpa); -#endif - } - - secp256k1_fe_mul(&r->z, &r->z, &Z); - - { - /* Correct for wNAF skew */ - secp256k1_ge correction = *a; - secp256k1_ge_storage correction_1_stor; -#ifdef USE_ENDOMORPHISM - secp256k1_ge_storage correction_lam_stor; -#endif - secp256k1_ge_storage a2_stor; - secp256k1_gej tmpj; - secp256k1_gej_set_ge(&tmpj, &correction); - secp256k1_gej_double_var(&tmpj, &tmpj, NULL); - secp256k1_ge_set_gej(&correction, &tmpj); - secp256k1_ge_to_storage(&correction_1_stor, a); -#ifdef USE_ENDOMORPHISM - secp256k1_ge_to_storage(&correction_lam_stor, a); -#endif - secp256k1_ge_to_storage(&a2_stor, &correction); - - /* For odd numbers this is 2a (so replace it), for even ones a (so no-op) */ - secp256k1_ge_storage_cmov(&correction_1_stor, &a2_stor, skew_1 == 2); -#ifdef USE_ENDOMORPHISM - secp256k1_ge_storage_cmov(&correction_lam_stor, &a2_stor, skew_lam == 2); -#endif - - /* Apply the correction */ - secp256k1_ge_from_storage(&correction, &correction_1_stor); - secp256k1_ge_neg(&correction, &correction); - secp256k1_gej_add_ge(r, r, &correction); - -#ifdef USE_ENDOMORPHISM - secp256k1_ge_from_storage(&correction, &correction_lam_stor); - secp256k1_ge_neg(&correction, &correction); - secp256k1_ge_mul_lambda(&correction, &correction); - secp256k1_gej_add_ge(r, r, &correction); -#endif - } -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/ecmult_gen.h b/external/libwally-core/src/secp256k1/src/ecmult_gen.h deleted file mode 100644 index eb2cc9ead..000000000 --- a/external/libwally-core/src/secp256k1/src/ecmult_gen.h +++ /dev/null @@ -1,43 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECMULT_GEN_ -#define _SECP256K1_ECMULT_GEN_ - -#include "scalar.h" -#include "group.h" - -typedef struct { - /* For accelerating the computation of a*G: - * To harden against timing attacks, use the following mechanism: - * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63. - * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where: - * * U_i = U * 2^i (for i=0..62) - * * U_i = U * (1-2^63) (for i=63) - * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0. - * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is - * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63). - * None of the resulting prec group elements have a known scalar, and neither do any of - * the intermediate sums while computing a*G. - */ - secp256k1_ge_storage (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ - secp256k1_scalar blind; - secp256k1_gej initial; -} secp256k1_ecmult_gen_context; - -static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx); -static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, const secp256k1_callback* cb); -static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, - const secp256k1_ecmult_gen_context* src, const secp256k1_callback* cb); -static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx); -static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx); - -/** Multiply with the generator: R = a*G */ -static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context* ctx, secp256k1_gej *r, const secp256k1_scalar *a); - -static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/ecmult_gen_impl.h b/external/libwally-core/src/secp256k1/src/ecmult_gen_impl.h deleted file mode 100644 index 35f254607..000000000 --- a/external/libwally-core/src/secp256k1/src/ecmult_gen_impl.h +++ /dev/null @@ -1,210 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECMULT_GEN_IMPL_H_ -#define _SECP256K1_ECMULT_GEN_IMPL_H_ - -#include "scalar.h" -#include "group.h" -#include "ecmult_gen.h" -#include "hash_impl.h" -#ifdef USE_ECMULT_STATIC_PRECOMPUTATION -#include "ecmult_static_context.h" -#endif -static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context *ctx) { - ctx->prec = NULL; -} - -static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx, const secp256k1_callback* cb) { -#ifndef USE_ECMULT_STATIC_PRECOMPUTATION - secp256k1_ge prec[1024]; - secp256k1_gej gj; - secp256k1_gej nums_gej; - int i, j; -#endif - - if (ctx->prec != NULL) { - return; - } -#ifndef USE_ECMULT_STATIC_PRECOMPUTATION - ctx->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*ctx->prec)); - - /* get the generator */ - secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); - - /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ - { - static const unsigned char nums_b32[33] = "The scalar for this x is unknown"; - secp256k1_fe nums_x; - secp256k1_ge nums_ge; - int r; - r = secp256k1_fe_set_b32(&nums_x, nums_b32); - (void)r; - VERIFY_CHECK(r); - r = secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0); - (void)r; - VERIFY_CHECK(r); - secp256k1_gej_set_ge(&nums_gej, &nums_ge); - /* Add G to make the bits in x uniformly distributed. */ - secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g, NULL); - } - - /* compute prec. */ - { - secp256k1_gej precj[1024]; /* Jacobian versions of prec. */ - secp256k1_gej gbase; - secp256k1_gej numsbase; - gbase = gj; /* 16^j * G */ - numsbase = nums_gej; /* 2^j * nums. */ - for (j = 0; j < 64; j++) { - /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ - precj[j*16] = numsbase; - for (i = 1; i < 16; i++) { - secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase, NULL); - } - /* Multiply gbase by 16. */ - for (i = 0; i < 4; i++) { - secp256k1_gej_double_var(&gbase, &gbase, NULL); - } - /* Multiply numbase by 2. */ - secp256k1_gej_double_var(&numsbase, &numsbase, NULL); - if (j == 62) { - /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ - secp256k1_gej_neg(&numsbase, &numsbase); - secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej, NULL); - } - } - secp256k1_ge_set_all_gej_var(prec, precj, 1024, cb); - } - for (j = 0; j < 64; j++) { - for (i = 0; i < 16; i++) { - secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]); - } - } -#else - (void)cb; - ctx->prec = (secp256k1_ge_storage (*)[64][16])secp256k1_ecmult_static_context; -#endif - secp256k1_ecmult_gen_blind(ctx, NULL); -} - -static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx) { - return ctx->prec != NULL; -} - -static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, - const secp256k1_ecmult_gen_context *src, const secp256k1_callback* cb) { - if (src->prec == NULL) { - dst->prec = NULL; - } else { -#ifndef USE_ECMULT_STATIC_PRECOMPUTATION - dst->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*dst->prec)); - memcpy(dst->prec, src->prec, sizeof(*dst->prec)); -#else - (void)cb; - dst->prec = src->prec; -#endif - dst->initial = src->initial; - dst->blind = src->blind; - } -} - -static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) { -#ifndef USE_ECMULT_STATIC_PRECOMPUTATION - free(ctx->prec); -#endif - secp256k1_scalar_clear(&ctx->blind); - secp256k1_gej_clear(&ctx->initial); - ctx->prec = NULL; -} - -static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp256k1_gej *r, const secp256k1_scalar *gn) { - secp256k1_ge add; - secp256k1_ge_storage adds; - secp256k1_scalar gnb; - int bits; - int i, j; - memset(&adds, 0, sizeof(adds)); - *r = ctx->initial; - /* Blind scalar/point multiplication by computing (n-b)G + bG instead of nG. */ - secp256k1_scalar_add(&gnb, gn, &ctx->blind); - add.infinity = 0; - for (j = 0; j < 64; j++) { - bits = secp256k1_scalar_get_bits(&gnb, j * 4, 4); - for (i = 0; i < 16; i++) { - /** This uses a conditional move to avoid any secret data in array indexes. - * _Any_ use of secret indexes has been demonstrated to result in timing - * sidechannels, even when the cache-line access patterns are uniform. - * See also: - * "A word of warning", CHES 2013 Rump Session, by Daniel J. Bernstein and Peter Schwabe - * (https://cryptojedi.org/peter/data/chesrump-20130822.pdf) and - * "Cache Attacks and Countermeasures: the Case of AES", RSA 2006, - * by Dag Arne Osvik, Adi Shamir, and Eran Tromer - * (http://www.tau.ac.il/~tromer/papers/cache.pdf) - */ - secp256k1_ge_storage_cmov(&adds, &(*ctx->prec)[j][i], i == bits); - } - secp256k1_ge_from_storage(&add, &adds); - secp256k1_gej_add_ge(r, r, &add); - } - bits = 0; - secp256k1_ge_clear(&add); - secp256k1_scalar_clear(&gnb); -} - -/* Setup blinding values for secp256k1_ecmult_gen. */ -static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32) { - secp256k1_scalar b; - secp256k1_gej gb; - secp256k1_fe s; - unsigned char nonce32[32]; - secp256k1_rfc6979_hmac_sha256_t rng; - int retry; - unsigned char keydata[64] = {0}; - if (seed32 == NULL) { - /* When seed is NULL, reset the initial point and blinding value. */ - secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g); - secp256k1_gej_neg(&ctx->initial, &ctx->initial); - secp256k1_scalar_set_int(&ctx->blind, 1); - } - /* The prior blinding value (if not reset) is chained forward by including it in the hash. */ - secp256k1_scalar_get_b32(nonce32, &ctx->blind); - /** Using a CSPRNG allows a failure free interface, avoids needing large amounts of random data, - * and guards against weak or adversarial seeds. This is a simpler and safer interface than - * asking the caller for blinding values directly and expecting them to retry on failure. - */ - memcpy(keydata, nonce32, 32); - if (seed32 != NULL) { - memcpy(keydata + 32, seed32, 32); - } - secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, seed32 ? 64 : 32); - memset(keydata, 0, sizeof(keydata)); - /* Retry for out of range results to achieve uniformity. */ - do { - secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); - retry = !secp256k1_fe_set_b32(&s, nonce32); - retry |= secp256k1_fe_is_zero(&s); - } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > Fp. */ - /* Randomize the projection to defend against multiplier sidechannels. */ - secp256k1_gej_rescale(&ctx->initial, &s); - secp256k1_fe_clear(&s); - do { - secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); - secp256k1_scalar_set_b32(&b, nonce32, &retry); - /* A blinding value of 0 works, but would undermine the projection hardening. */ - retry |= secp256k1_scalar_is_zero(&b); - } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > order. */ - secp256k1_rfc6979_hmac_sha256_finalize(&rng); - memset(nonce32, 0, 32); - secp256k1_ecmult_gen(ctx, &gb, &b); - secp256k1_scalar_negate(&b, &b); - ctx->blind = b; - ctx->initial = gb; - secp256k1_scalar_clear(&b); - secp256k1_gej_clear(&gb); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/ecmult_impl.h b/external/libwally-core/src/secp256k1/src/ecmult_impl.h deleted file mode 100644 index d1e83bd6d..000000000 --- a/external/libwally-core/src/secp256k1/src/ecmult_impl.h +++ /dev/null @@ -1,391 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_ECMULT_IMPL_H_ -#define _SECP256K1_ECMULT_IMPL_H_ - -#include "group.h" -#include "scalar.h" -#include "ecmult.h" - -#include - -/* optimal for 128-bit and 256-bit exponents. */ -#define WINDOW_A 5 - -/** larger numbers may result in slightly better performance, at the cost of - exponentially larger precomputed tables. */ -#ifdef USE_ENDOMORPHISM -/** Two tables for window size 15: 1.375 MiB. */ -#define WINDOW_G 15 -#else -/** One table for window size 16: 1.375 MiB. */ -#define WINDOW_G 16 -#endif - -/** The number of entries a table with precomputed multiples needs to have. */ -#define ECMULT_TABLE_SIZE(w) (1 << ((w)-2)) - -/** Fill a table 'prej' with precomputed odd multiples of a. Prej will contain - * the values [1*a,3*a,...,(2*n-1)*a], so it space for n values. zr[0] will - * contain prej[0].z / a.z. The other zr[i] values = prej[i].z / prej[i-1].z. - * Prej's Z values are undefined, except for the last value. - */ -static void secp256k1_ecmult_odd_multiples_table(int n, secp256k1_gej *prej, secp256k1_fe *zr, const secp256k1_gej *a) { - secp256k1_gej d; - secp256k1_ge a_ge, d_ge; - int i; - - VERIFY_CHECK(!a->infinity); - - secp256k1_gej_double_var(&d, a, NULL); - - /* - * Perform the additions on an isomorphism where 'd' is affine: drop the z coordinate - * of 'd', and scale the 1P starting value's x/y coordinates without changing its z. - */ - d_ge.x = d.x; - d_ge.y = d.y; - d_ge.infinity = 0; - - secp256k1_ge_set_gej_zinv(&a_ge, a, &d.z); - prej[0].x = a_ge.x; - prej[0].y = a_ge.y; - prej[0].z = a->z; - prej[0].infinity = 0; - - zr[0] = d.z; - for (i = 1; i < n; i++) { - secp256k1_gej_add_ge_var(&prej[i], &prej[i-1], &d_ge, &zr[i]); - } - - /* - * Each point in 'prej' has a z coordinate too small by a factor of 'd.z'. Only - * the final point's z coordinate is actually used though, so just update that. - */ - secp256k1_fe_mul(&prej[n-1].z, &prej[n-1].z, &d.z); -} - -/** Fill a table 'pre' with precomputed odd multiples of a. - * - * There are two versions of this function: - * - secp256k1_ecmult_odd_multiples_table_globalz_windowa which brings its - * resulting point set to a single constant Z denominator, stores the X and Y - * coordinates as ge_storage points in pre, and stores the global Z in rz. - * It only operates on tables sized for WINDOW_A wnaf multiples. - * - secp256k1_ecmult_odd_multiples_table_storage_var, which converts its - * resulting point set to actually affine points, and stores those in pre. - * It operates on tables of any size, but uses heap-allocated temporaries. - * - * To compute a*P + b*G, we compute a table for P using the first function, - * and for G using the second (which requires an inverse, but it only needs to - * happen once). - */ -static void secp256k1_ecmult_odd_multiples_table_globalz_windowa(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a) { - secp256k1_gej prej[ECMULT_TABLE_SIZE(WINDOW_A)]; - secp256k1_fe zr[ECMULT_TABLE_SIZE(WINDOW_A)]; - - /* Compute the odd multiples in Jacobian form. */ - secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), prej, zr, a); - /* Bring them to the same Z denominator. */ - secp256k1_ge_globalz_set_table_gej(ECMULT_TABLE_SIZE(WINDOW_A), pre, globalz, prej, zr); -} - -static void secp256k1_ecmult_odd_multiples_table_storage_var(int n, secp256k1_ge_storage *pre, const secp256k1_gej *a, const secp256k1_callback *cb) { - secp256k1_gej *prej = (secp256k1_gej*)checked_malloc(cb, sizeof(secp256k1_gej) * n); - secp256k1_ge *prea = (secp256k1_ge*)checked_malloc(cb, sizeof(secp256k1_ge) * n); - secp256k1_fe *zr = (secp256k1_fe*)checked_malloc(cb, sizeof(secp256k1_fe) * n); - int i; - - /* Compute the odd multiples in Jacobian form. */ - secp256k1_ecmult_odd_multiples_table(n, prej, zr, a); - /* Convert them in batch to affine coordinates. */ - secp256k1_ge_set_table_gej_var(prea, prej, zr, n); - /* Convert them to compact storage form. */ - for (i = 0; i < n; i++) { - secp256k1_ge_to_storage(&pre[i], &prea[i]); - } - - free(prea); - free(prej); - free(zr); -} - -/** The following two macro retrieves a particular odd multiple from a table - * of precomputed multiples. */ -#define ECMULT_TABLE_GET_GE(r,pre,n,w) do { \ - VERIFY_CHECK(((n) & 1) == 1); \ - VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ - VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ - if ((n) > 0) { \ - *(r) = (pre)[((n)-1)/2]; \ - } else { \ - secp256k1_ge_neg((r), &(pre)[(-(n)-1)/2]); \ - } \ -} while(0) - -#define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \ - VERIFY_CHECK(((n) & 1) == 1); \ - VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ - VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ - if ((n) > 0) { \ - secp256k1_ge_from_storage((r), &(pre)[((n)-1)/2]); \ - } else { \ - secp256k1_ge_from_storage((r), &(pre)[(-(n)-1)/2]); \ - secp256k1_ge_neg((r), (r)); \ - } \ -} while(0) - -static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx) { - ctx->pre_g = NULL; -#ifdef USE_ENDOMORPHISM - ctx->pre_g_128 = NULL; -#endif -} - -static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb) { - secp256k1_gej gj; - - if (ctx->pre_g != NULL) { - return; - } - - /* get the generator */ - secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); - - ctx->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); - - /* precompute the tables with odd multiples */ - secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g, &gj, cb); - -#ifdef USE_ENDOMORPHISM - { - secp256k1_gej g_128j; - int i; - - ctx->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); - - /* calculate 2^128*generator */ - g_128j = gj; - for (i = 0; i < 128; i++) { - secp256k1_gej_double_var(&g_128j, &g_128j, NULL); - } - secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g_128, &g_128j, cb); - } -#endif -} - -static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, - const secp256k1_ecmult_context *src, const secp256k1_callback *cb) { - if (src->pre_g == NULL) { - dst->pre_g = NULL; - } else { - size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); - dst->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); - memcpy(dst->pre_g, src->pre_g, size); - } -#ifdef USE_ENDOMORPHISM - if (src->pre_g_128 == NULL) { - dst->pre_g_128 = NULL; - } else { - size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); - dst->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); - memcpy(dst->pre_g_128, src->pre_g_128, size); - } -#endif -} - -static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx) { - return ctx->pre_g != NULL; -} - -static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx) { - free(ctx->pre_g); -#ifdef USE_ENDOMORPHISM - free(ctx->pre_g_128); -#endif - secp256k1_ecmult_context_init(ctx); -} - -/** Convert a number to WNAF notation. The number becomes represented by sum(2^i * wnaf[i], i=0..bits), - * with the following guarantees: - * - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1) - * - two non-zero entries in wnaf are separated by at least w-1 zeroes. - * - the number of set values in wnaf is returned. This number is at most 256, and at most one more - * than the number of bits in the (absolute value) of the input. - */ -static int secp256k1_ecmult_wnaf(int *wnaf, int len, const secp256k1_scalar *a, int w) { - secp256k1_scalar s = *a; - int last_set_bit = -1; - int bit = 0; - int sign = 1; - int carry = 0; - - VERIFY_CHECK(wnaf != NULL); - VERIFY_CHECK(0 <= len && len <= 256); - VERIFY_CHECK(a != NULL); - VERIFY_CHECK(2 <= w && w <= 31); - - memset(wnaf, 0, len * sizeof(wnaf[0])); - - if (secp256k1_scalar_get_bits(&s, 255, 1)) { - secp256k1_scalar_negate(&s, &s); - sign = -1; - } - - while (bit < len) { - int now; - int word; - if (secp256k1_scalar_get_bits(&s, bit, 1) == (unsigned int)carry) { - bit++; - continue; - } - - now = w; - if (now > len - bit) { - now = len - bit; - } - - word = secp256k1_scalar_get_bits_var(&s, bit, now) + carry; - - carry = (word >> (w-1)) & 1; - word -= carry << w; - - wnaf[bit] = sign * word; - last_set_bit = bit; - - bit += now; - } -#ifdef VERIFY - CHECK(carry == 0); - while (bit < 256) { - CHECK(secp256k1_scalar_get_bits(&s, bit++, 1) == 0); - } -#endif - return last_set_bit + 1; -} - -static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng) { - secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; - secp256k1_ge tmpa; - secp256k1_fe Z; -#ifdef USE_ENDOMORPHISM - secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; - secp256k1_scalar na_1, na_lam; - /* Splitted G factors. */ - secp256k1_scalar ng_1, ng_128; - int wnaf_na_1[130]; - int wnaf_na_lam[130]; - int bits_na_1; - int bits_na_lam; - int wnaf_ng_1[129]; - int bits_ng_1; - int wnaf_ng_128[129]; - int bits_ng_128; -#else - int wnaf_na[256]; - int bits_na; - int wnaf_ng[256]; - int bits_ng; -#endif - int i; - int bits; - -#ifdef USE_ENDOMORPHISM - /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */ - secp256k1_scalar_split_lambda(&na_1, &na_lam, na); - - /* build wnaf representation for na_1 and na_lam. */ - bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, 130, &na_1, WINDOW_A); - bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, 130, &na_lam, WINDOW_A); - VERIFY_CHECK(bits_na_1 <= 130); - VERIFY_CHECK(bits_na_lam <= 130); - bits = bits_na_1; - if (bits_na_lam > bits) { - bits = bits_na_lam; - } -#else - /* build wnaf representation for na. */ - bits_na = secp256k1_ecmult_wnaf(wnaf_na, 256, na, WINDOW_A); - bits = bits_na; -#endif - - /* Calculate odd multiples of a. - * All multiples are brought to the same Z 'denominator', which is stored - * in Z. Due to secp256k1' isomorphism we can do all operations pretending - * that the Z coordinate was 1, use affine addition formulae, and correct - * the Z coordinate of the result once at the end. - * The exception is the precomputed G table points, which are actually - * affine. Compared to the base used for other points, they have a Z ratio - * of 1/Z, so we can use secp256k1_gej_add_zinv_var, which uses the same - * isomorphism to efficiently add with a known Z inverse. - */ - secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, a); - -#ifdef USE_ENDOMORPHISM - for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { - secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); - } - - /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */ - secp256k1_scalar_split_128(&ng_1, &ng_128, ng); - - /* Build wnaf representation for ng_1 and ng_128 */ - bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, 129, &ng_1, WINDOW_G); - bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, 129, &ng_128, WINDOW_G); - if (bits_ng_1 > bits) { - bits = bits_ng_1; - } - if (bits_ng_128 > bits) { - bits = bits_ng_128; - } -#else - bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, 256, ng, WINDOW_G); - if (bits_ng > bits) { - bits = bits_ng; - } -#endif - - secp256k1_gej_set_infinity(r); - - for (i = bits - 1; i >= 0; i--) { - int n; - secp256k1_gej_double_var(r, r, NULL); -#ifdef USE_ENDOMORPHISM - if (i < bits_na_1 && (n = wnaf_na_1[i])) { - ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); - secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); - } - if (i < bits_na_lam && (n = wnaf_na_lam[i])) { - ECMULT_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); - secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); - } - if (i < bits_ng_1 && (n = wnaf_ng_1[i])) { - ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); - secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); - } - if (i < bits_ng_128 && (n = wnaf_ng_128[i])) { - ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G); - secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); - } -#else - if (i < bits_na && (n = wnaf_na[i])) { - ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); - secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); - } - if (i < bits_ng && (n = wnaf_ng[i])) { - ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); - secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); - } -#endif - } - - if (!r->infinity) { - secp256k1_fe_mul(&r->z, &r->z, &Z); - } -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/field.h b/external/libwally-core/src/secp256k1/src/field.h deleted file mode 100644 index 4daefc43a..000000000 --- a/external/libwally-core/src/secp256k1/src/field.h +++ /dev/null @@ -1,127 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_FIELD_ -#define _SECP256K1_FIELD_ - -/** Field element module. - * - * Field elements can be represented in several ways, but code accessing - * it (and implementations) need to take certain properties into account: - * - Each field element can be normalized or not. - * - Each field element has a magnitude, which represents how far away - * its representation is away from normalization. Normalized elements - * always have a magnitude of 1, but a magnitude of 1 doesn't imply - * normality. - */ - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#if defined(USE_FIELD_10X26) -#include "field_10x26.h" -#elif defined(USE_FIELD_5X52) -#include "field_5x52.h" -#else -#error "Please select field implementation" -#endif - -/** Normalize a field element. */ -static void secp256k1_fe_normalize(secp256k1_fe *r); - -/** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */ -static void secp256k1_fe_normalize_weak(secp256k1_fe *r); - -/** Normalize a field element, without constant-time guarantee. */ -static void secp256k1_fe_normalize_var(secp256k1_fe *r); - -/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field - * implementation may optionally normalize the input, but this should not be relied upon. */ -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r); - -/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field - * implementation may optionally normalize the input, but this should not be relied upon. */ -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r); - -/** Set a field element equal to a small integer. Resulting field element is normalized. */ -static void secp256k1_fe_set_int(secp256k1_fe *r, int a); - -/** Verify whether a field element is zero. Requires the input to be normalized. */ -static int secp256k1_fe_is_zero(const secp256k1_fe *a); - -/** Check the "oddness" of a field element. Requires the input to be normalized. */ -static int secp256k1_fe_is_odd(const secp256k1_fe *a); - -/** Compare two field elements. Requires magnitude-1 inputs. */ -static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b); - -/** Same as secp256k1_fe_equal, but may be variable time. */ -static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b); - -/** Compare two field elements. Requires both inputs to be normalized */ -static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b); - -/** Set a field element equal to 32-byte big endian value. If successful, the resulting field element is normalized. */ -static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a); - -/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a); - -/** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input - * as an argument. The magnitude of the output is one higher. */ -static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m); - -/** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that - * small integer. */ -static void secp256k1_fe_mul_int(secp256k1_fe *r, int a); - -/** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */ -static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a); - -/** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8. - * The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b); - -/** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8. - * The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a); - -/** If a has a square root, it is computed in r and 1 is returned. If a does not - * have a square root, the root of its negation is computed and 0 is returned. - * The input's magnitude can be at most 8. The output magnitude is 1 (but not - * guaranteed to be normalized). The result in r will always be a square - * itself. */ -static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a); - -/** Checks whether a field element is a quadratic residue. */ -static int secp256k1_fe_is_quad_var(const secp256k1_fe *a); - -/** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be - * at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */ -static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a); - -/** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */ -static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a); - -/** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be - * at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and - * outputs must not overlap in memory. */ -static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len); - -/** Convert a field element to the storage type. */ -static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a); - -/** Convert a field element back from the storage type. */ -static void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a); - -/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag); - -/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/field_10x26.h b/external/libwally-core/src/secp256k1/src/field_10x26.h deleted file mode 100644 index 61ee1e096..000000000 --- a/external/libwally-core/src/secp256k1/src/field_10x26.h +++ /dev/null @@ -1,47 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_FIELD_REPR_ -#define _SECP256K1_FIELD_REPR_ - -#include - -typedef struct { - /* X = sum(i=0..9, elem[i]*2^26) mod n */ - uint32_t n[10]; -#ifdef VERIFY - int magnitude; - int normalized; -#endif -} secp256k1_fe; - -/* Unpacks a constant into a overlapping multi-limbed FE element. */ -#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ - (d0) & 0x3FFFFFFUL, \ - (((uint32_t)d0) >> 26) | (((uint32_t)(d1) & 0xFFFFFUL) << 6), \ - (((uint32_t)d1) >> 20) | (((uint32_t)(d2) & 0x3FFFUL) << 12), \ - (((uint32_t)d2) >> 14) | (((uint32_t)(d3) & 0xFFUL) << 18), \ - (((uint32_t)d3) >> 8) | (((uint32_t)(d4) & 0x3UL) << 24), \ - (((uint32_t)d4) >> 2) & 0x3FFFFFFUL, \ - (((uint32_t)d4) >> 28) | (((uint32_t)(d5) & 0x3FFFFFUL) << 4), \ - (((uint32_t)d5) >> 22) | (((uint32_t)(d6) & 0xFFFFUL) << 10), \ - (((uint32_t)d6) >> 16) | (((uint32_t)(d7) & 0x3FFUL) << 16), \ - (((uint32_t)d7) >> 10) \ -} - -#ifdef VERIFY -#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} -#else -#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} -#endif - -typedef struct { - uint32_t n[8]; -} secp256k1_fe_storage; - -#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }} -#define SECP256K1_FE_STORAGE_CONST_GET(d) d.n[7], d.n[6], d.n[5], d.n[4],d.n[3], d.n[2], d.n[1], d.n[0] -#endif diff --git a/external/libwally-core/src/secp256k1/src/field_10x26_impl.h b/external/libwally-core/src/secp256k1/src/field_10x26_impl.h deleted file mode 100644 index 7b8c07960..000000000 --- a/external/libwally-core/src/secp256k1/src/field_10x26_impl.h +++ /dev/null @@ -1,1144 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ -#define _SECP256K1_FIELD_REPR_IMPL_H_ - -#include "util.h" -#include "num.h" -#include "field.h" - -#ifdef VERIFY -static void secp256k1_fe_verify(const secp256k1_fe *a) { - const uint32_t *d = a->n; - int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; - r &= (d[0] <= 0x3FFFFFFUL * m); - r &= (d[1] <= 0x3FFFFFFUL * m); - r &= (d[2] <= 0x3FFFFFFUL * m); - r &= (d[3] <= 0x3FFFFFFUL * m); - r &= (d[4] <= 0x3FFFFFFUL * m); - r &= (d[5] <= 0x3FFFFFFUL * m); - r &= (d[6] <= 0x3FFFFFFUL * m); - r &= (d[7] <= 0x3FFFFFFUL * m); - r &= (d[8] <= 0x3FFFFFFUL * m); - r &= (d[9] <= 0x03FFFFFUL * m); - r &= (a->magnitude >= 0); - r &= (a->magnitude <= 32); - if (a->normalized) { - r &= (a->magnitude <= 1); - if (r && (d[9] == 0x03FFFFFUL)) { - uint32_t mid = d[8] & d[7] & d[6] & d[5] & d[4] & d[3] & d[2]; - if (mid == 0x3FFFFFFUL) { - r &= ((d[1] + 0x40UL + ((d[0] + 0x3D1UL) >> 26)) <= 0x3FFFFFFUL); - } - } - } - VERIFY_CHECK(r == 1); -} -#else -static void secp256k1_fe_verify(const secp256k1_fe *a) { - (void)a; -} -#endif - -static void secp256k1_fe_normalize(secp256k1_fe *r) { - uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], - t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; - - /* Reduce t9 at the start so there will be at most a single carry from the first pass */ - uint32_t m; - uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x3D1UL; t1 += (x << 6); - t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; - t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; - t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; - t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; - t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; - t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; - t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; - t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; - t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; - - /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t9 >> 23 == 0); - - /* At most a single final reduction is needed; check if the value is >= the field characteristic */ - x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) - & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); - - /* Apply the final reduction (for constant-time behaviour, we do it always) */ - t0 += x * 0x3D1UL; t1 += (x << 6); - t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; - t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; - t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; - t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; - t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; - t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; - t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; - t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; - t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; - - /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ - VERIFY_CHECK(t9 >> 22 == x); - - /* Mask off the possible multiple of 2^256 from the final reduction */ - t9 &= 0x03FFFFFUL; - - r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; - r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; - -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; - secp256k1_fe_verify(r); -#endif -} - -static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { - uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], - t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; - - /* Reduce t9 at the start so there will be at most a single carry from the first pass */ - uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x3D1UL; t1 += (x << 6); - t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; - t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; - t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; - t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; - t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; - t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; - t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; - t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; - t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; - - /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t9 >> 23 == 0); - - r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; - r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; - -#ifdef VERIFY - r->magnitude = 1; - secp256k1_fe_verify(r); -#endif -} - -static void secp256k1_fe_normalize_var(secp256k1_fe *r) { - uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], - t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; - - /* Reduce t9 at the start so there will be at most a single carry from the first pass */ - uint32_t m; - uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x3D1UL; t1 += (x << 6); - t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; - t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; - t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; - t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; - t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; - t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; - t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; - t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; - t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; - - /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t9 >> 23 == 0); - - /* At most a single final reduction is needed; check if the value is >= the field characteristic */ - x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) - & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); - - if (x) { - t0 += 0x3D1UL; t1 += (x << 6); - t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; - t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; - t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; - t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; - t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; - t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; - t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; - t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; - t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; - - /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ - VERIFY_CHECK(t9 >> 22 == x); - - /* Mask off the possible multiple of 2^256 from the final reduction */ - t9 &= 0x03FFFFFUL; - } - - r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; - r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; - -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; - secp256k1_fe_verify(r); -#endif -} - -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { - uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], - t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; - - /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ - uint32_t z0, z1; - - /* Reduce t9 at the start so there will be at most a single carry from the first pass */ - uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x3D1UL; t1 += (x << 6); - t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; z0 = t0; z1 = t0 ^ 0x3D0UL; - t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; - t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; - t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; - t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; - t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; - t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; - t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; - t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; - z0 |= t9; z1 &= t9 ^ 0x3C00000UL; - - /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t9 >> 23 == 0); - - return (z0 == 0) | (z1 == 0x3FFFFFFUL); -} - -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { - uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; - uint32_t z0, z1; - uint32_t x; - - t0 = r->n[0]; - t9 = r->n[9]; - - /* Reduce t9 at the start so there will be at most a single carry from the first pass */ - x = t9 >> 22; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x3D1UL; - - /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ - z0 = t0 & 0x3FFFFFFUL; - z1 = z0 ^ 0x3D0UL; - - /* Fast return path should catch the majority of cases */ - if ((z0 != 0UL) & (z1 != 0x3FFFFFFUL)) { - return 0; - } - - t1 = r->n[1]; - t2 = r->n[2]; - t3 = r->n[3]; - t4 = r->n[4]; - t5 = r->n[5]; - t6 = r->n[6]; - t7 = r->n[7]; - t8 = r->n[8]; - - t9 &= 0x03FFFFFUL; - t1 += (x << 6); - - t1 += (t0 >> 26); - t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; - t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; - t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; - t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; - t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; - t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; - t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; - t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; - z0 |= t9; z1 &= t9 ^ 0x3C00000UL; - - /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t9 >> 23 == 0); - - return (z0 == 0) | (z1 == 0x3FFFFFFUL); -} - -SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { - r->n[0] = a; - r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; - secp256k1_fe_verify(r); -#endif -} - -SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { - const uint32_t *t = a->n; -#ifdef VERIFY - VERIFY_CHECK(a->normalized); - secp256k1_fe_verify(a); -#endif - return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0; -} - -SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { -#ifdef VERIFY - VERIFY_CHECK(a->normalized); - secp256k1_fe_verify(a); -#endif - return a->n[0] & 1; -} - -SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { - int i; -#ifdef VERIFY - a->magnitude = 0; - a->normalized = 1; -#endif - for (i=0; i<10; i++) { - a->n[i] = 0; - } -} - -static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { - int i; -#ifdef VERIFY - VERIFY_CHECK(a->normalized); - VERIFY_CHECK(b->normalized); - secp256k1_fe_verify(a); - secp256k1_fe_verify(b); -#endif - for (i = 9; i >= 0; i--) { - if (a->n[i] > b->n[i]) { - return 1; - } - if (a->n[i] < b->n[i]) { - return -1; - } - } - return 0; -} - -static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { - int i; - r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; - r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; - for (i=0; i<32; i++) { - int j; - for (j=0; j<4; j++) { - int limb = (8*i+2*j)/26; - int shift = (8*i+2*j)%26; - r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift; - } - } - if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) { - return 0; - } -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; - secp256k1_fe_verify(r); -#endif - return 1; -} - -/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { - int i; -#ifdef VERIFY - VERIFY_CHECK(a->normalized); - secp256k1_fe_verify(a); -#endif - for (i=0; i<32; i++) { - int j; - int c = 0; - for (j=0; j<4; j++) { - int limb = (8*i+2*j)/26; - int shift = (8*i+2*j)%26; - c |= ((a->n[limb] >> shift) & 0x3) << (2 * j); - } - r[31-i] = c; - } -} - -SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { -#ifdef VERIFY - VERIFY_CHECK(a->magnitude <= m); - secp256k1_fe_verify(a); -#endif - r->n[0] = 0x3FFFC2FUL * 2 * (m + 1) - a->n[0]; - r->n[1] = 0x3FFFFBFUL * 2 * (m + 1) - a->n[1]; - r->n[2] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[2]; - r->n[3] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[3]; - r->n[4] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[4]; - r->n[5] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[5]; - r->n[6] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[6]; - r->n[7] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[7]; - r->n[8] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[8]; - r->n[9] = 0x03FFFFFUL * 2 * (m + 1) - a->n[9]; -#ifdef VERIFY - r->magnitude = m + 1; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { - r->n[0] *= a; - r->n[1] *= a; - r->n[2] *= a; - r->n[3] *= a; - r->n[4] *= a; - r->n[5] *= a; - r->n[6] *= a; - r->n[7] *= a; - r->n[8] *= a; - r->n[9] *= a; -#ifdef VERIFY - r->magnitude *= a; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { -#ifdef VERIFY - secp256k1_fe_verify(a); -#endif - r->n[0] += a->n[0]; - r->n[1] += a->n[1]; - r->n[2] += a->n[2]; - r->n[3] += a->n[3]; - r->n[4] += a->n[4]; - r->n[5] += a->n[5]; - r->n[6] += a->n[6]; - r->n[7] += a->n[7]; - r->n[8] += a->n[8]; - r->n[9] += a->n[9]; -#ifdef VERIFY - r->magnitude += a->magnitude; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -#if defined(USE_EXTERNAL_ASM) - -/* External assembler implementation */ -void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b); -void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a); - -#else - -#ifdef VERIFY -#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) -#else -#define VERIFY_BITS(x, n) do { } while(0) -#endif - -SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b) { - uint64_t c, d; - uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; - uint32_t t9, t1, t0, t2, t3, t4, t5, t6, t7; - const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; - - VERIFY_BITS(a[0], 30); - VERIFY_BITS(a[1], 30); - VERIFY_BITS(a[2], 30); - VERIFY_BITS(a[3], 30); - VERIFY_BITS(a[4], 30); - VERIFY_BITS(a[5], 30); - VERIFY_BITS(a[6], 30); - VERIFY_BITS(a[7], 30); - VERIFY_BITS(a[8], 30); - VERIFY_BITS(a[9], 26); - VERIFY_BITS(b[0], 30); - VERIFY_BITS(b[1], 30); - VERIFY_BITS(b[2], 30); - VERIFY_BITS(b[3], 30); - VERIFY_BITS(b[4], 30); - VERIFY_BITS(b[5], 30); - VERIFY_BITS(b[6], 30); - VERIFY_BITS(b[7], 30); - VERIFY_BITS(b[8], 30); - VERIFY_BITS(b[9], 26); - - /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. - * px is a shorthand for sum(a[i]*b[x-i], i=0..x). - * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. - */ - - d = (uint64_t)a[0] * b[9] - + (uint64_t)a[1] * b[8] - + (uint64_t)a[2] * b[7] - + (uint64_t)a[3] * b[6] - + (uint64_t)a[4] * b[5] - + (uint64_t)a[5] * b[4] - + (uint64_t)a[6] * b[3] - + (uint64_t)a[7] * b[2] - + (uint64_t)a[8] * b[1] - + (uint64_t)a[9] * b[0]; - /* VERIFY_BITS(d, 64); */ - /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ - t9 = d & M; d >>= 26; - VERIFY_BITS(t9, 26); - VERIFY_BITS(d, 38); - /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ - - c = (uint64_t)a[0] * b[0]; - VERIFY_BITS(c, 60); - /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ - d += (uint64_t)a[1] * b[9] - + (uint64_t)a[2] * b[8] - + (uint64_t)a[3] * b[7] - + (uint64_t)a[4] * b[6] - + (uint64_t)a[5] * b[5] - + (uint64_t)a[6] * b[4] - + (uint64_t)a[7] * b[3] - + (uint64_t)a[8] * b[2] - + (uint64_t)a[9] * b[1]; - VERIFY_BITS(d, 63); - /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ - u0 = d & M; d >>= 26; c += u0 * R0; - VERIFY_BITS(u0, 26); - VERIFY_BITS(d, 37); - VERIFY_BITS(c, 61); - /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ - t0 = c & M; c >>= 26; c += u0 * R1; - VERIFY_BITS(t0, 26); - VERIFY_BITS(c, 37); - /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ - /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ - - c += (uint64_t)a[0] * b[1] - + (uint64_t)a[1] * b[0]; - VERIFY_BITS(c, 62); - /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ - d += (uint64_t)a[2] * b[9] - + (uint64_t)a[3] * b[8] - + (uint64_t)a[4] * b[7] - + (uint64_t)a[5] * b[6] - + (uint64_t)a[6] * b[5] - + (uint64_t)a[7] * b[4] - + (uint64_t)a[8] * b[3] - + (uint64_t)a[9] * b[2]; - VERIFY_BITS(d, 63); - /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ - u1 = d & M; d >>= 26; c += u1 * R0; - VERIFY_BITS(u1, 26); - VERIFY_BITS(d, 37); - VERIFY_BITS(c, 63); - /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ - t1 = c & M; c >>= 26; c += u1 * R1; - VERIFY_BITS(t1, 26); - VERIFY_BITS(c, 38); - /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ - /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ - - c += (uint64_t)a[0] * b[2] - + (uint64_t)a[1] * b[1] - + (uint64_t)a[2] * b[0]; - VERIFY_BITS(c, 62); - /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - d += (uint64_t)a[3] * b[9] - + (uint64_t)a[4] * b[8] - + (uint64_t)a[5] * b[7] - + (uint64_t)a[6] * b[6] - + (uint64_t)a[7] * b[5] - + (uint64_t)a[8] * b[4] - + (uint64_t)a[9] * b[3]; - VERIFY_BITS(d, 63); - /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - u2 = d & M; d >>= 26; c += u2 * R0; - VERIFY_BITS(u2, 26); - VERIFY_BITS(d, 37); - VERIFY_BITS(c, 63); - /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - t2 = c & M; c >>= 26; c += u2 * R1; - VERIFY_BITS(t2, 26); - VERIFY_BITS(c, 38); - /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - - c += (uint64_t)a[0] * b[3] - + (uint64_t)a[1] * b[2] - + (uint64_t)a[2] * b[1] - + (uint64_t)a[3] * b[0]; - VERIFY_BITS(c, 63); - /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - d += (uint64_t)a[4] * b[9] - + (uint64_t)a[5] * b[8] - + (uint64_t)a[6] * b[7] - + (uint64_t)a[7] * b[6] - + (uint64_t)a[8] * b[5] - + (uint64_t)a[9] * b[4]; - VERIFY_BITS(d, 63); - /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - u3 = d & M; d >>= 26; c += u3 * R0; - VERIFY_BITS(u3, 26); - VERIFY_BITS(d, 37); - /* VERIFY_BITS(c, 64); */ - /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - t3 = c & M; c >>= 26; c += u3 * R1; - VERIFY_BITS(t3, 26); - VERIFY_BITS(c, 39); - /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - - c += (uint64_t)a[0] * b[4] - + (uint64_t)a[1] * b[3] - + (uint64_t)a[2] * b[2] - + (uint64_t)a[3] * b[1] - + (uint64_t)a[4] * b[0]; - VERIFY_BITS(c, 63); - /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - d += (uint64_t)a[5] * b[9] - + (uint64_t)a[6] * b[8] - + (uint64_t)a[7] * b[7] - + (uint64_t)a[8] * b[6] - + (uint64_t)a[9] * b[5]; - VERIFY_BITS(d, 62); - /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - u4 = d & M; d >>= 26; c += u4 * R0; - VERIFY_BITS(u4, 26); - VERIFY_BITS(d, 36); - /* VERIFY_BITS(c, 64); */ - /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - t4 = c & M; c >>= 26; c += u4 * R1; - VERIFY_BITS(t4, 26); - VERIFY_BITS(c, 39); - /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - - c += (uint64_t)a[0] * b[5] - + (uint64_t)a[1] * b[4] - + (uint64_t)a[2] * b[3] - + (uint64_t)a[3] * b[2] - + (uint64_t)a[4] * b[1] - + (uint64_t)a[5] * b[0]; - VERIFY_BITS(c, 63); - /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - d += (uint64_t)a[6] * b[9] - + (uint64_t)a[7] * b[8] - + (uint64_t)a[8] * b[7] - + (uint64_t)a[9] * b[6]; - VERIFY_BITS(d, 62); - /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - u5 = d & M; d >>= 26; c += u5 * R0; - VERIFY_BITS(u5, 26); - VERIFY_BITS(d, 36); - /* VERIFY_BITS(c, 64); */ - /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - t5 = c & M; c >>= 26; c += u5 * R1; - VERIFY_BITS(t5, 26); - VERIFY_BITS(c, 39); - /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - - c += (uint64_t)a[0] * b[6] - + (uint64_t)a[1] * b[5] - + (uint64_t)a[2] * b[4] - + (uint64_t)a[3] * b[3] - + (uint64_t)a[4] * b[2] - + (uint64_t)a[5] * b[1] - + (uint64_t)a[6] * b[0]; - VERIFY_BITS(c, 63); - /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - d += (uint64_t)a[7] * b[9] - + (uint64_t)a[8] * b[8] - + (uint64_t)a[9] * b[7]; - VERIFY_BITS(d, 61); - /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - u6 = d & M; d >>= 26; c += u6 * R0; - VERIFY_BITS(u6, 26); - VERIFY_BITS(d, 35); - /* VERIFY_BITS(c, 64); */ - /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - t6 = c & M; c >>= 26; c += u6 * R1; - VERIFY_BITS(t6, 26); - VERIFY_BITS(c, 39); - /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - - c += (uint64_t)a[0] * b[7] - + (uint64_t)a[1] * b[6] - + (uint64_t)a[2] * b[5] - + (uint64_t)a[3] * b[4] - + (uint64_t)a[4] * b[3] - + (uint64_t)a[5] * b[2] - + (uint64_t)a[6] * b[1] - + (uint64_t)a[7] * b[0]; - /* VERIFY_BITS(c, 64); */ - VERIFY_CHECK(c <= 0x8000007C00000007ULL); - /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - d += (uint64_t)a[8] * b[9] - + (uint64_t)a[9] * b[8]; - VERIFY_BITS(d, 58); - /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - u7 = d & M; d >>= 26; c += u7 * R0; - VERIFY_BITS(u7, 26); - VERIFY_BITS(d, 32); - /* VERIFY_BITS(c, 64); */ - VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); - /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - t7 = c & M; c >>= 26; c += u7 * R1; - VERIFY_BITS(t7, 26); - VERIFY_BITS(c, 38); - /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - - c += (uint64_t)a[0] * b[8] - + (uint64_t)a[1] * b[7] - + (uint64_t)a[2] * b[6] - + (uint64_t)a[3] * b[5] - + (uint64_t)a[4] * b[4] - + (uint64_t)a[5] * b[3] - + (uint64_t)a[6] * b[2] - + (uint64_t)a[7] * b[1] - + (uint64_t)a[8] * b[0]; - /* VERIFY_BITS(c, 64); */ - VERIFY_CHECK(c <= 0x9000007B80000008ULL); - /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - d += (uint64_t)a[9] * b[9]; - VERIFY_BITS(d, 57); - /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - u8 = d & M; d >>= 26; c += u8 * R0; - VERIFY_BITS(u8, 26); - VERIFY_BITS(d, 31); - /* VERIFY_BITS(c, 64); */ - VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - - r[3] = t3; - VERIFY_BITS(r[3], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[4] = t4; - VERIFY_BITS(r[4], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[5] = t5; - VERIFY_BITS(r[5], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[6] = t6; - VERIFY_BITS(r[6], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[7] = t7; - VERIFY_BITS(r[7], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - - r[8] = c & M; c >>= 26; c += u8 * R1; - VERIFY_BITS(r[8], 26); - VERIFY_BITS(c, 39); - /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += d * R0 + t9; - VERIFY_BITS(c, 45); - /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); - VERIFY_BITS(r[9], 22); - VERIFY_BITS(c, 46); - /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - - d = c * (R0 >> 4) + t0; - VERIFY_BITS(d, 56); - /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[0] = d & M; d >>= 26; - VERIFY_BITS(r[0], 26); - VERIFY_BITS(d, 30); - /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - d += c * (R1 >> 4) + t1; - VERIFY_BITS(d, 53); - VERIFY_CHECK(d <= 0x10000003FFFFBFULL); - /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[1] = d & M; d >>= 26; - VERIFY_BITS(r[1], 26); - VERIFY_BITS(d, 27); - VERIFY_CHECK(d <= 0x4000000ULL); - /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - d += t2; - VERIFY_BITS(d, 27); - /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[2] = d; - VERIFY_BITS(r[2], 27); - /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ -} - -SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a) { - uint64_t c, d; - uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; - uint32_t t9, t0, t1, t2, t3, t4, t5, t6, t7; - const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; - - VERIFY_BITS(a[0], 30); - VERIFY_BITS(a[1], 30); - VERIFY_BITS(a[2], 30); - VERIFY_BITS(a[3], 30); - VERIFY_BITS(a[4], 30); - VERIFY_BITS(a[5], 30); - VERIFY_BITS(a[6], 30); - VERIFY_BITS(a[7], 30); - VERIFY_BITS(a[8], 30); - VERIFY_BITS(a[9], 26); - - /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. - * px is a shorthand for sum(a[i]*a[x-i], i=0..x). - * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. - */ - - d = (uint64_t)(a[0]*2) * a[9] - + (uint64_t)(a[1]*2) * a[8] - + (uint64_t)(a[2]*2) * a[7] - + (uint64_t)(a[3]*2) * a[6] - + (uint64_t)(a[4]*2) * a[5]; - /* VERIFY_BITS(d, 64); */ - /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ - t9 = d & M; d >>= 26; - VERIFY_BITS(t9, 26); - VERIFY_BITS(d, 38); - /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ - - c = (uint64_t)a[0] * a[0]; - VERIFY_BITS(c, 60); - /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ - d += (uint64_t)(a[1]*2) * a[9] - + (uint64_t)(a[2]*2) * a[8] - + (uint64_t)(a[3]*2) * a[7] - + (uint64_t)(a[4]*2) * a[6] - + (uint64_t)a[5] * a[5]; - VERIFY_BITS(d, 63); - /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ - u0 = d & M; d >>= 26; c += u0 * R0; - VERIFY_BITS(u0, 26); - VERIFY_BITS(d, 37); - VERIFY_BITS(c, 61); - /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ - t0 = c & M; c >>= 26; c += u0 * R1; - VERIFY_BITS(t0, 26); - VERIFY_BITS(c, 37); - /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ - /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ - - c += (uint64_t)(a[0]*2) * a[1]; - VERIFY_BITS(c, 62); - /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ - d += (uint64_t)(a[2]*2) * a[9] - + (uint64_t)(a[3]*2) * a[8] - + (uint64_t)(a[4]*2) * a[7] - + (uint64_t)(a[5]*2) * a[6]; - VERIFY_BITS(d, 63); - /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ - u1 = d & M; d >>= 26; c += u1 * R0; - VERIFY_BITS(u1, 26); - VERIFY_BITS(d, 37); - VERIFY_BITS(c, 63); - /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ - t1 = c & M; c >>= 26; c += u1 * R1; - VERIFY_BITS(t1, 26); - VERIFY_BITS(c, 38); - /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ - /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ - - c += (uint64_t)(a[0]*2) * a[2] - + (uint64_t)a[1] * a[1]; - VERIFY_BITS(c, 62); - /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - d += (uint64_t)(a[3]*2) * a[9] - + (uint64_t)(a[4]*2) * a[8] - + (uint64_t)(a[5]*2) * a[7] - + (uint64_t)a[6] * a[6]; - VERIFY_BITS(d, 63); - /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - u2 = d & M; d >>= 26; c += u2 * R0; - VERIFY_BITS(u2, 26); - VERIFY_BITS(d, 37); - VERIFY_BITS(c, 63); - /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - t2 = c & M; c >>= 26; c += u2 * R1; - VERIFY_BITS(t2, 26); - VERIFY_BITS(c, 38); - /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ - - c += (uint64_t)(a[0]*2) * a[3] - + (uint64_t)(a[1]*2) * a[2]; - VERIFY_BITS(c, 63); - /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - d += (uint64_t)(a[4]*2) * a[9] - + (uint64_t)(a[5]*2) * a[8] - + (uint64_t)(a[6]*2) * a[7]; - VERIFY_BITS(d, 63); - /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - u3 = d & M; d >>= 26; c += u3 * R0; - VERIFY_BITS(u3, 26); - VERIFY_BITS(d, 37); - /* VERIFY_BITS(c, 64); */ - /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - t3 = c & M; c >>= 26; c += u3 * R1; - VERIFY_BITS(t3, 26); - VERIFY_BITS(c, 39); - /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ - - c += (uint64_t)(a[0]*2) * a[4] - + (uint64_t)(a[1]*2) * a[3] - + (uint64_t)a[2] * a[2]; - VERIFY_BITS(c, 63); - /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - d += (uint64_t)(a[5]*2) * a[9] - + (uint64_t)(a[6]*2) * a[8] - + (uint64_t)a[7] * a[7]; - VERIFY_BITS(d, 62); - /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - u4 = d & M; d >>= 26; c += u4 * R0; - VERIFY_BITS(u4, 26); - VERIFY_BITS(d, 36); - /* VERIFY_BITS(c, 64); */ - /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - t4 = c & M; c >>= 26; c += u4 * R1; - VERIFY_BITS(t4, 26); - VERIFY_BITS(c, 39); - /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ - - c += (uint64_t)(a[0]*2) * a[5] - + (uint64_t)(a[1]*2) * a[4] - + (uint64_t)(a[2]*2) * a[3]; - VERIFY_BITS(c, 63); - /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - d += (uint64_t)(a[6]*2) * a[9] - + (uint64_t)(a[7]*2) * a[8]; - VERIFY_BITS(d, 62); - /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - u5 = d & M; d >>= 26; c += u5 * R0; - VERIFY_BITS(u5, 26); - VERIFY_BITS(d, 36); - /* VERIFY_BITS(c, 64); */ - /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - t5 = c & M; c >>= 26; c += u5 * R1; - VERIFY_BITS(t5, 26); - VERIFY_BITS(c, 39); - /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ - - c += (uint64_t)(a[0]*2) * a[6] - + (uint64_t)(a[1]*2) * a[5] - + (uint64_t)(a[2]*2) * a[4] - + (uint64_t)a[3] * a[3]; - VERIFY_BITS(c, 63); - /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - d += (uint64_t)(a[7]*2) * a[9] - + (uint64_t)a[8] * a[8]; - VERIFY_BITS(d, 61); - /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - u6 = d & M; d >>= 26; c += u6 * R0; - VERIFY_BITS(u6, 26); - VERIFY_BITS(d, 35); - /* VERIFY_BITS(c, 64); */ - /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - t6 = c & M; c >>= 26; c += u6 * R1; - VERIFY_BITS(t6, 26); - VERIFY_BITS(c, 39); - /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ - - c += (uint64_t)(a[0]*2) * a[7] - + (uint64_t)(a[1]*2) * a[6] - + (uint64_t)(a[2]*2) * a[5] - + (uint64_t)(a[3]*2) * a[4]; - /* VERIFY_BITS(c, 64); */ - VERIFY_CHECK(c <= 0x8000007C00000007ULL); - /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - d += (uint64_t)(a[8]*2) * a[9]; - VERIFY_BITS(d, 58); - /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - u7 = d & M; d >>= 26; c += u7 * R0; - VERIFY_BITS(u7, 26); - VERIFY_BITS(d, 32); - /* VERIFY_BITS(c, 64); */ - VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); - /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - t7 = c & M; c >>= 26; c += u7 * R1; - VERIFY_BITS(t7, 26); - VERIFY_BITS(c, 38); - /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ - - c += (uint64_t)(a[0]*2) * a[8] - + (uint64_t)(a[1]*2) * a[7] - + (uint64_t)(a[2]*2) * a[6] - + (uint64_t)(a[3]*2) * a[5] - + (uint64_t)a[4] * a[4]; - /* VERIFY_BITS(c, 64); */ - VERIFY_CHECK(c <= 0x9000007B80000008ULL); - /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - d += (uint64_t)a[9] * a[9]; - VERIFY_BITS(d, 57); - /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - u8 = d & M; d >>= 26; c += u8 * R0; - VERIFY_BITS(u8, 26); - VERIFY_BITS(d, 31); - /* VERIFY_BITS(c, 64); */ - VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - - r[3] = t3; - VERIFY_BITS(r[3], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[4] = t4; - VERIFY_BITS(r[4], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[5] = t5; - VERIFY_BITS(r[5], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[6] = t6; - VERIFY_BITS(r[6], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[7] = t7; - VERIFY_BITS(r[7], 26); - /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - - r[8] = c & M; c >>= 26; c += u8 * R1; - VERIFY_BITS(r[8], 26); - VERIFY_BITS(c, 39); - /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += d * R0 + t9; - VERIFY_BITS(c, 45); - /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); - VERIFY_BITS(r[9], 22); - VERIFY_BITS(c, 46); - /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - - d = c * (R0 >> 4) + t0; - VERIFY_BITS(d, 56); - /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[0] = d & M; d >>= 26; - VERIFY_BITS(r[0], 26); - VERIFY_BITS(d, 30); - /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - d += c * (R1 >> 4) + t1; - VERIFY_BITS(d, 53); - VERIFY_CHECK(d <= 0x10000003FFFFBFULL); - /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[1] = d & M; d >>= 26; - VERIFY_BITS(r[1], 26); - VERIFY_BITS(d, 27); - VERIFY_CHECK(d <= 0x4000000ULL); - /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - d += t2; - VERIFY_BITS(d, 27); - /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[2] = d; - VERIFY_BITS(r[2], 27); - /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ -} -#endif - -static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { -#ifdef VERIFY - VERIFY_CHECK(a->magnitude <= 8); - VERIFY_CHECK(b->magnitude <= 8); - secp256k1_fe_verify(a); - secp256k1_fe_verify(b); - VERIFY_CHECK(r != b); -#endif - secp256k1_fe_mul_inner(r->n, a->n, b->n); -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { -#ifdef VERIFY - VERIFY_CHECK(a->magnitude <= 8); - secp256k1_fe_verify(a); -#endif - secp256k1_fe_sqr_inner(r->n, a->n); -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { - uint32_t mask0, mask1; - mask0 = flag + ~((uint32_t)0); - mask1 = ~mask0; - r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); - r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); - r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); - r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); - r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); - r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); - r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); - r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); - r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); - r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); -#ifdef VERIFY - if (a->magnitude > r->magnitude) { - r->magnitude = a->magnitude; - } - r->normalized &= a->normalized; -#endif -} - -static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { - uint32_t mask0, mask1; - mask0 = flag + ~((uint32_t)0); - mask1 = ~mask0; - r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); - r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); - r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); - r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); - r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); - r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); - r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); - r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); -} - -static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { -#ifdef VERIFY - VERIFY_CHECK(a->normalized); -#endif - r->n[0] = a->n[0] | a->n[1] << 26; - r->n[1] = a->n[1] >> 6 | a->n[2] << 20; - r->n[2] = a->n[2] >> 12 | a->n[3] << 14; - r->n[3] = a->n[3] >> 18 | a->n[4] << 8; - r->n[4] = a->n[4] >> 24 | a->n[5] << 2 | a->n[6] << 28; - r->n[5] = a->n[6] >> 4 | a->n[7] << 22; - r->n[6] = a->n[7] >> 10 | a->n[8] << 16; - r->n[7] = a->n[8] >> 16 | a->n[9] << 10; -} - -static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { - r->n[0] = a->n[0] & 0x3FFFFFFUL; - r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL); - r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL); - r->n[3] = a->n[2] >> 14 | ((a->n[3] << 18) & 0x3FFFFFFUL); - r->n[4] = a->n[3] >> 8 | ((a->n[4] << 24) & 0x3FFFFFFUL); - r->n[5] = (a->n[4] >> 2) & 0x3FFFFFFUL; - r->n[6] = a->n[4] >> 28 | ((a->n[5] << 4) & 0x3FFFFFFUL); - r->n[7] = a->n[5] >> 22 | ((a->n[6] << 10) & 0x3FFFFFFUL); - r->n[8] = a->n[6] >> 16 | ((a->n[7] << 16) & 0x3FFFFFFUL); - r->n[9] = a->n[7] >> 10; -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; -#endif -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/field_5x52.h b/external/libwally-core/src/secp256k1/src/field_5x52.h deleted file mode 100644 index 8e69a560d..000000000 --- a/external/libwally-core/src/secp256k1/src/field_5x52.h +++ /dev/null @@ -1,47 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_FIELD_REPR_ -#define _SECP256K1_FIELD_REPR_ - -#include - -typedef struct { - /* X = sum(i=0..4, elem[i]*2^52) mod n */ - uint64_t n[5]; -#ifdef VERIFY - int magnitude; - int normalized; -#endif -} secp256k1_fe; - -/* Unpacks a constant into a overlapping multi-limbed FE element. */ -#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ - (d0) | (((uint64_t)(d1) & 0xFFFFFUL) << 32), \ - ((uint64_t)(d1) >> 20) | (((uint64_t)(d2)) << 12) | (((uint64_t)(d3) & 0xFFUL) << 44), \ - ((uint64_t)(d3) >> 8) | (((uint64_t)(d4) & 0xFFFFFFFUL) << 24), \ - ((uint64_t)(d4) >> 28) | (((uint64_t)(d5)) << 4) | (((uint64_t)(d6) & 0xFFFFUL) << 36), \ - ((uint64_t)(d6) >> 16) | (((uint64_t)(d7)) << 16) \ -} - -#ifdef VERIFY -#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} -#else -#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} -#endif - -typedef struct { - uint64_t n[4]; -} secp256k1_fe_storage; - -#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \ - (d0) | (((uint64_t)(d1)) << 32), \ - (d2) | (((uint64_t)(d3)) << 32), \ - (d4) | (((uint64_t)(d5)) << 32), \ - (d6) | (((uint64_t)(d7)) << 32) \ -}} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/field_5x52_asm_impl.h b/external/libwally-core/src/secp256k1/src/field_5x52_asm_impl.h deleted file mode 100644 index 98cc004bf..000000000 --- a/external/libwally-core/src/secp256k1/src/field_5x52_asm_impl.h +++ /dev/null @@ -1,502 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013-2014 Diederik Huys, Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -/** - * Changelog: - * - March 2013, Diederik Huys: original version - * - November 2014, Pieter Wuille: updated to use Peter Dettman's parallel multiplication algorithm - * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly - */ - -#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ -#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ - -SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { -/** - * Registers: rdx:rax = multiplication accumulator - * r9:r8 = c - * r15:rcx = d - * r10-r14 = a0-a4 - * rbx = b - * rdi = r - * rsi = a / t? - */ - uint64_t tmp1, tmp2, tmp3; -__asm__ __volatile__( - "movq 0(%%rsi),%%r10\n" - "movq 8(%%rsi),%%r11\n" - "movq 16(%%rsi),%%r12\n" - "movq 24(%%rsi),%%r13\n" - "movq 32(%%rsi),%%r14\n" - - /* d += a3 * b0 */ - "movq 0(%%rbx),%%rax\n" - "mulq %%r13\n" - "movq %%rax,%%rcx\n" - "movq %%rdx,%%r15\n" - /* d += a2 * b1 */ - "movq 8(%%rbx),%%rax\n" - "mulq %%r12\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a1 * b2 */ - "movq 16(%%rbx),%%rax\n" - "mulq %%r11\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d = a0 * b3 */ - "movq 24(%%rbx),%%rax\n" - "mulq %%r10\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* c = a4 * b4 */ - "movq 32(%%rbx),%%rax\n" - "mulq %%r14\n" - "movq %%rax,%%r8\n" - "movq %%rdx,%%r9\n" - /* d += (c & M) * R */ - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* c >>= 52 (%%r8 only) */ - "shrdq $52,%%r9,%%r8\n" - /* t3 (tmp1) = d & M */ - "movq %%rcx,%%rsi\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rsi\n" - "movq %%rsi,%q1\n" - /* d >>= 52 */ - "shrdq $52,%%r15,%%rcx\n" - "xorq %%r15,%%r15\n" - /* d += a4 * b0 */ - "movq 0(%%rbx),%%rax\n" - "mulq %%r14\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a3 * b1 */ - "movq 8(%%rbx),%%rax\n" - "mulq %%r13\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a2 * b2 */ - "movq 16(%%rbx),%%rax\n" - "mulq %%r12\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a1 * b3 */ - "movq 24(%%rbx),%%rax\n" - "mulq %%r11\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a0 * b4 */ - "movq 32(%%rbx),%%rax\n" - "mulq %%r10\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += c * R */ - "movq %%r8,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* t4 = d & M (%%rsi) */ - "movq %%rcx,%%rsi\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rsi\n" - /* d >>= 52 */ - "shrdq $52,%%r15,%%rcx\n" - "xorq %%r15,%%r15\n" - /* tx = t4 >> 48 (tmp3) */ - "movq %%rsi,%%rax\n" - "shrq $48,%%rax\n" - "movq %%rax,%q3\n" - /* t4 &= (M >> 4) (tmp2) */ - "movq $0xffffffffffff,%%rax\n" - "andq %%rax,%%rsi\n" - "movq %%rsi,%q2\n" - /* c = a0 * b0 */ - "movq 0(%%rbx),%%rax\n" - "mulq %%r10\n" - "movq %%rax,%%r8\n" - "movq %%rdx,%%r9\n" - /* d += a4 * b1 */ - "movq 8(%%rbx),%%rax\n" - "mulq %%r14\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a3 * b2 */ - "movq 16(%%rbx),%%rax\n" - "mulq %%r13\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a2 * b3 */ - "movq 24(%%rbx),%%rax\n" - "mulq %%r12\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a1 * b4 */ - "movq 32(%%rbx),%%rax\n" - "mulq %%r11\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* u0 = d & M (%%rsi) */ - "movq %%rcx,%%rsi\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rsi\n" - /* d >>= 52 */ - "shrdq $52,%%r15,%%rcx\n" - "xorq %%r15,%%r15\n" - /* u0 = (u0 << 4) | tx (%%rsi) */ - "shlq $4,%%rsi\n" - "movq %q3,%%rax\n" - "orq %%rax,%%rsi\n" - /* c += u0 * (R >> 4) */ - "movq $0x1000003d1,%%rax\n" - "mulq %%rsi\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* r[0] = c & M */ - "movq %%r8,%%rax\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rax\n" - "movq %%rax,0(%%rdi)\n" - /* c >>= 52 */ - "shrdq $52,%%r9,%%r8\n" - "xorq %%r9,%%r9\n" - /* c += a1 * b0 */ - "movq 0(%%rbx),%%rax\n" - "mulq %%r11\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* c += a0 * b1 */ - "movq 8(%%rbx),%%rax\n" - "mulq %%r10\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* d += a4 * b2 */ - "movq 16(%%rbx),%%rax\n" - "mulq %%r14\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a3 * b3 */ - "movq 24(%%rbx),%%rax\n" - "mulq %%r13\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a2 * b4 */ - "movq 32(%%rbx),%%rax\n" - "mulq %%r12\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* c += (d & M) * R */ - "movq %%rcx,%%rax\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* d >>= 52 */ - "shrdq $52,%%r15,%%rcx\n" - "xorq %%r15,%%r15\n" - /* r[1] = c & M */ - "movq %%r8,%%rax\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rax\n" - "movq %%rax,8(%%rdi)\n" - /* c >>= 52 */ - "shrdq $52,%%r9,%%r8\n" - "xorq %%r9,%%r9\n" - /* c += a2 * b0 */ - "movq 0(%%rbx),%%rax\n" - "mulq %%r12\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* c += a1 * b1 */ - "movq 8(%%rbx),%%rax\n" - "mulq %%r11\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* c += a0 * b2 (last use of %%r10 = a0) */ - "movq 16(%%rbx),%%rax\n" - "mulq %%r10\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* fetch t3 (%%r10, overwrites a0), t4 (%%rsi) */ - "movq %q2,%%rsi\n" - "movq %q1,%%r10\n" - /* d += a4 * b3 */ - "movq 24(%%rbx),%%rax\n" - "mulq %%r14\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* d += a3 * b4 */ - "movq 32(%%rbx),%%rax\n" - "mulq %%r13\n" - "addq %%rax,%%rcx\n" - "adcq %%rdx,%%r15\n" - /* c += (d & M) * R */ - "movq %%rcx,%%rax\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* d >>= 52 (%%rcx only) */ - "shrdq $52,%%r15,%%rcx\n" - /* r[2] = c & M */ - "movq %%r8,%%rax\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rax\n" - "movq %%rax,16(%%rdi)\n" - /* c >>= 52 */ - "shrdq $52,%%r9,%%r8\n" - "xorq %%r9,%%r9\n" - /* c += t3 */ - "addq %%r10,%%r8\n" - /* c += d * R */ - "movq %%rcx,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* r[3] = c & M */ - "movq %%r8,%%rax\n" - "movq $0xfffffffffffff,%%rdx\n" - "andq %%rdx,%%rax\n" - "movq %%rax,24(%%rdi)\n" - /* c >>= 52 (%%r8 only) */ - "shrdq $52,%%r9,%%r8\n" - /* c += t4 (%%r8 only) */ - "addq %%rsi,%%r8\n" - /* r[4] = c */ - "movq %%r8,32(%%rdi)\n" -: "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) -: "b"(b), "D"(r) -: "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" -); -} - -SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { -/** - * Registers: rdx:rax = multiplication accumulator - * r9:r8 = c - * rcx:rbx = d - * r10-r14 = a0-a4 - * r15 = M (0xfffffffffffff) - * rdi = r - * rsi = a / t? - */ - uint64_t tmp1, tmp2, tmp3; -__asm__ __volatile__( - "movq 0(%%rsi),%%r10\n" - "movq 8(%%rsi),%%r11\n" - "movq 16(%%rsi),%%r12\n" - "movq 24(%%rsi),%%r13\n" - "movq 32(%%rsi),%%r14\n" - "movq $0xfffffffffffff,%%r15\n" - - /* d = (a0*2) * a3 */ - "leaq (%%r10,%%r10,1),%%rax\n" - "mulq %%r13\n" - "movq %%rax,%%rbx\n" - "movq %%rdx,%%rcx\n" - /* d += (a1*2) * a2 */ - "leaq (%%r11,%%r11,1),%%rax\n" - "mulq %%r12\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* c = a4 * a4 */ - "movq %%r14,%%rax\n" - "mulq %%r14\n" - "movq %%rax,%%r8\n" - "movq %%rdx,%%r9\n" - /* d += (c & M) * R */ - "andq %%r15,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* c >>= 52 (%%r8 only) */ - "shrdq $52,%%r9,%%r8\n" - /* t3 (tmp1) = d & M */ - "movq %%rbx,%%rsi\n" - "andq %%r15,%%rsi\n" - "movq %%rsi,%q1\n" - /* d >>= 52 */ - "shrdq $52,%%rcx,%%rbx\n" - "xorq %%rcx,%%rcx\n" - /* a4 *= 2 */ - "addq %%r14,%%r14\n" - /* d += a0 * a4 */ - "movq %%r10,%%rax\n" - "mulq %%r14\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* d+= (a1*2) * a3 */ - "leaq (%%r11,%%r11,1),%%rax\n" - "mulq %%r13\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* d += a2 * a2 */ - "movq %%r12,%%rax\n" - "mulq %%r12\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* d += c * R */ - "movq %%r8,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* t4 = d & M (%%rsi) */ - "movq %%rbx,%%rsi\n" - "andq %%r15,%%rsi\n" - /* d >>= 52 */ - "shrdq $52,%%rcx,%%rbx\n" - "xorq %%rcx,%%rcx\n" - /* tx = t4 >> 48 (tmp3) */ - "movq %%rsi,%%rax\n" - "shrq $48,%%rax\n" - "movq %%rax,%q3\n" - /* t4 &= (M >> 4) (tmp2) */ - "movq $0xffffffffffff,%%rax\n" - "andq %%rax,%%rsi\n" - "movq %%rsi,%q2\n" - /* c = a0 * a0 */ - "movq %%r10,%%rax\n" - "mulq %%r10\n" - "movq %%rax,%%r8\n" - "movq %%rdx,%%r9\n" - /* d += a1 * a4 */ - "movq %%r11,%%rax\n" - "mulq %%r14\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* d += (a2*2) * a3 */ - "leaq (%%r12,%%r12,1),%%rax\n" - "mulq %%r13\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* u0 = d & M (%%rsi) */ - "movq %%rbx,%%rsi\n" - "andq %%r15,%%rsi\n" - /* d >>= 52 */ - "shrdq $52,%%rcx,%%rbx\n" - "xorq %%rcx,%%rcx\n" - /* u0 = (u0 << 4) | tx (%%rsi) */ - "shlq $4,%%rsi\n" - "movq %q3,%%rax\n" - "orq %%rax,%%rsi\n" - /* c += u0 * (R >> 4) */ - "movq $0x1000003d1,%%rax\n" - "mulq %%rsi\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* r[0] = c & M */ - "movq %%r8,%%rax\n" - "andq %%r15,%%rax\n" - "movq %%rax,0(%%rdi)\n" - /* c >>= 52 */ - "shrdq $52,%%r9,%%r8\n" - "xorq %%r9,%%r9\n" - /* a0 *= 2 */ - "addq %%r10,%%r10\n" - /* c += a0 * a1 */ - "movq %%r10,%%rax\n" - "mulq %%r11\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* d += a2 * a4 */ - "movq %%r12,%%rax\n" - "mulq %%r14\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* d += a3 * a3 */ - "movq %%r13,%%rax\n" - "mulq %%r13\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* c += (d & M) * R */ - "movq %%rbx,%%rax\n" - "andq %%r15,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* d >>= 52 */ - "shrdq $52,%%rcx,%%rbx\n" - "xorq %%rcx,%%rcx\n" - /* r[1] = c & M */ - "movq %%r8,%%rax\n" - "andq %%r15,%%rax\n" - "movq %%rax,8(%%rdi)\n" - /* c >>= 52 */ - "shrdq $52,%%r9,%%r8\n" - "xorq %%r9,%%r9\n" - /* c += a0 * a2 (last use of %%r10) */ - "movq %%r10,%%rax\n" - "mulq %%r12\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* fetch t3 (%%r10, overwrites a0),t4 (%%rsi) */ - "movq %q2,%%rsi\n" - "movq %q1,%%r10\n" - /* c += a1 * a1 */ - "movq %%r11,%%rax\n" - "mulq %%r11\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* d += a3 * a4 */ - "movq %%r13,%%rax\n" - "mulq %%r14\n" - "addq %%rax,%%rbx\n" - "adcq %%rdx,%%rcx\n" - /* c += (d & M) * R */ - "movq %%rbx,%%rax\n" - "andq %%r15,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* d >>= 52 (%%rbx only) */ - "shrdq $52,%%rcx,%%rbx\n" - /* r[2] = c & M */ - "movq %%r8,%%rax\n" - "andq %%r15,%%rax\n" - "movq %%rax,16(%%rdi)\n" - /* c >>= 52 */ - "shrdq $52,%%r9,%%r8\n" - "xorq %%r9,%%r9\n" - /* c += t3 */ - "addq %%r10,%%r8\n" - /* c += d * R */ - "movq %%rbx,%%rax\n" - "movq $0x1000003d10,%%rdx\n" - "mulq %%rdx\n" - "addq %%rax,%%r8\n" - "adcq %%rdx,%%r9\n" - /* r[3] = c & M */ - "movq %%r8,%%rax\n" - "andq %%r15,%%rax\n" - "movq %%rax,24(%%rdi)\n" - /* c >>= 52 (%%r8 only) */ - "shrdq $52,%%r9,%%r8\n" - /* c += t4 (%%r8 only) */ - "addq %%rsi,%%r8\n" - /* r[4] = c */ - "movq %%r8,32(%%rdi)\n" -: "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) -: "D"(r) -: "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" -); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/field_5x52_impl.h b/external/libwally-core/src/secp256k1/src/field_5x52_impl.h deleted file mode 100644 index 7a99eb21e..000000000 --- a/external/libwally-core/src/secp256k1/src/field_5x52_impl.h +++ /dev/null @@ -1,455 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ -#define _SECP256K1_FIELD_REPR_IMPL_H_ - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#include "util.h" -#include "num.h" -#include "field.h" - -#if defined(USE_ASM_X86_64) -#include "field_5x52_asm_impl.h" -#else -#include "field_5x52_int128_impl.h" -#endif - -/** Implements arithmetic modulo FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F, - * represented as 5 uint64_t's in base 2^52. The values are allowed to contain >52 each. In particular, - * each FieldElem has a 'magnitude' associated with it. Internally, a magnitude M means each element - * is at most M*(2^53-1), except the most significant one, which is limited to M*(2^49-1). All operations - * accept any input with magnitude at most M, and have different rules for propagating magnitude to their - * output. - */ - -#ifdef VERIFY -static void secp256k1_fe_verify(const secp256k1_fe *a) { - const uint64_t *d = a->n; - int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; - /* secp256k1 'p' value defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ - r &= (d[0] <= 0xFFFFFFFFFFFFFULL * m); - r &= (d[1] <= 0xFFFFFFFFFFFFFULL * m); - r &= (d[2] <= 0xFFFFFFFFFFFFFULL * m); - r &= (d[3] <= 0xFFFFFFFFFFFFFULL * m); - r &= (d[4] <= 0x0FFFFFFFFFFFFULL * m); - r &= (a->magnitude >= 0); - r &= (a->magnitude <= 2048); - if (a->normalized) { - r &= (a->magnitude <= 1); - if (r && (d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) { - r &= (d[0] < 0xFFFFEFFFFFC2FULL); - } - } - VERIFY_CHECK(r == 1); -} -#else -static void secp256k1_fe_verify(const secp256k1_fe *a) { - (void)a; -} -#endif - -static void secp256k1_fe_normalize(secp256k1_fe *r) { - uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; - - /* Reduce t4 at the start so there will be at most a single carry from the first pass */ - uint64_t m; - uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x1000003D1ULL; - t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; - t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; - t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; - t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; - - /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t4 >> 49 == 0); - - /* At most a single final reduction is needed; check if the value is >= the field characteristic */ - x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) - & (t0 >= 0xFFFFEFFFFFC2FULL)); - - /* Apply the final reduction (for constant-time behaviour, we do it always) */ - t0 += x * 0x1000003D1ULL; - t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; - t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; - t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; - t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; - - /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ - VERIFY_CHECK(t4 >> 48 == x); - - /* Mask off the possible multiple of 2^256 from the final reduction */ - t4 &= 0x0FFFFFFFFFFFFULL; - - r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; - -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; - secp256k1_fe_verify(r); -#endif -} - -static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { - uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; - - /* Reduce t4 at the start so there will be at most a single carry from the first pass */ - uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x1000003D1ULL; - t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; - t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; - t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; - t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; - - /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t4 >> 49 == 0); - - r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; - -#ifdef VERIFY - r->magnitude = 1; - secp256k1_fe_verify(r); -#endif -} - -static void secp256k1_fe_normalize_var(secp256k1_fe *r) { - uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; - - /* Reduce t4 at the start so there will be at most a single carry from the first pass */ - uint64_t m; - uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x1000003D1ULL; - t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; - t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; - t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; - t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; - - /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t4 >> 49 == 0); - - /* At most a single final reduction is needed; check if the value is >= the field characteristic */ - x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) - & (t0 >= 0xFFFFEFFFFFC2FULL)); - - if (x) { - t0 += 0x1000003D1ULL; - t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; - t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; - t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; - t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; - - /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ - VERIFY_CHECK(t4 >> 48 == x); - - /* Mask off the possible multiple of 2^256 from the final reduction */ - t4 &= 0x0FFFFFFFFFFFFULL; - } - - r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; - -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; - secp256k1_fe_verify(r); -#endif -} - -static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { - uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; - - /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ - uint64_t z0, z1; - - /* Reduce t4 at the start so there will be at most a single carry from the first pass */ - uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x1000003D1ULL; - t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; z0 = t0; z1 = t0 ^ 0x1000003D0ULL; - t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; - t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; - t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; - z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; - - /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t4 >> 49 == 0); - - return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); -} - -static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { - uint64_t t0, t1, t2, t3, t4; - uint64_t z0, z1; - uint64_t x; - - t0 = r->n[0]; - t4 = r->n[4]; - - /* Reduce t4 at the start so there will be at most a single carry from the first pass */ - x = t4 >> 48; - - /* The first pass ensures the magnitude is 1, ... */ - t0 += x * 0x1000003D1ULL; - - /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ - z0 = t0 & 0xFFFFFFFFFFFFFULL; - z1 = z0 ^ 0x1000003D0ULL; - - /* Fast return path should catch the majority of cases */ - if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL)) { - return 0; - } - - t1 = r->n[1]; - t2 = r->n[2]; - t3 = r->n[3]; - - t4 &= 0x0FFFFFFFFFFFFULL; - - t1 += (t0 >> 52); - t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; - t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; - t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; - z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; - - /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ - VERIFY_CHECK(t4 >> 49 == 0); - - return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); -} - -SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { - r->n[0] = a; - r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; - secp256k1_fe_verify(r); -#endif -} - -SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { - const uint64_t *t = a->n; -#ifdef VERIFY - VERIFY_CHECK(a->normalized); - secp256k1_fe_verify(a); -#endif - return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0; -} - -SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { -#ifdef VERIFY - VERIFY_CHECK(a->normalized); - secp256k1_fe_verify(a); -#endif - return a->n[0] & 1; -} - -SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { - int i; -#ifdef VERIFY - a->magnitude = 0; - a->normalized = 1; -#endif - for (i=0; i<5; i++) { - a->n[i] = 0; - } -} - -static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { - int i; -#ifdef VERIFY - VERIFY_CHECK(a->normalized); - VERIFY_CHECK(b->normalized); - secp256k1_fe_verify(a); - secp256k1_fe_verify(b); -#endif - for (i = 4; i >= 0; i--) { - if (a->n[i] > b->n[i]) { - return 1; - } - if (a->n[i] < b->n[i]) { - return -1; - } - } - return 0; -} - -static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { - int i; - r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; - for (i=0; i<32; i++) { - int j; - for (j=0; j<2; j++) { - int limb = (8*i+4*j)/52; - int shift = (8*i+4*j)%52; - r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift; - } - } - if (r->n[4] == 0x0FFFFFFFFFFFFULL && (r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL && r->n[0] >= 0xFFFFEFFFFFC2FULL) { - return 0; - } -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; - secp256k1_fe_verify(r); -#endif - return 1; -} - -/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ -static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { - int i; -#ifdef VERIFY - VERIFY_CHECK(a->normalized); - secp256k1_fe_verify(a); -#endif - for (i=0; i<32; i++) { - int j; - int c = 0; - for (j=0; j<2; j++) { - int limb = (8*i+4*j)/52; - int shift = (8*i+4*j)%52; - c |= ((a->n[limb] >> shift) & 0xF) << (4 * j); - } - r[31-i] = c; - } -} - -SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { -#ifdef VERIFY - VERIFY_CHECK(a->magnitude <= m); - secp256k1_fe_verify(a); -#endif - r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->n[0]; - r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[1]; - r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[2]; - r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[3]; - r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->n[4]; -#ifdef VERIFY - r->magnitude = m + 1; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { - r->n[0] *= a; - r->n[1] *= a; - r->n[2] *= a; - r->n[3] *= a; - r->n[4] *= a; -#ifdef VERIFY - r->magnitude *= a; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { -#ifdef VERIFY - secp256k1_fe_verify(a); -#endif - r->n[0] += a->n[0]; - r->n[1] += a->n[1]; - r->n[2] += a->n[2]; - r->n[3] += a->n[3]; - r->n[4] += a->n[4]; -#ifdef VERIFY - r->magnitude += a->magnitude; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { -#ifdef VERIFY - VERIFY_CHECK(a->magnitude <= 8); - VERIFY_CHECK(b->magnitude <= 8); - secp256k1_fe_verify(a); - secp256k1_fe_verify(b); - VERIFY_CHECK(r != b); -#endif - secp256k1_fe_mul_inner(r->n, a->n, b->n); -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { -#ifdef VERIFY - VERIFY_CHECK(a->magnitude <= 8); - secp256k1_fe_verify(a); -#endif - secp256k1_fe_sqr_inner(r->n, a->n); -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 0; - secp256k1_fe_verify(r); -#endif -} - -static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { - uint64_t mask0, mask1; - mask0 = flag + ~((uint64_t)0); - mask1 = ~mask0; - r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); - r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); - r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); - r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); - r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); -#ifdef VERIFY - if (a->magnitude > r->magnitude) { - r->magnitude = a->magnitude; - } - r->normalized &= a->normalized; -#endif -} - -static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { - uint64_t mask0, mask1; - mask0 = flag + ~((uint64_t)0); - mask1 = ~mask0; - r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); - r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); - r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); - r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); -} - -static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { -#ifdef VERIFY - VERIFY_CHECK(a->normalized); -#endif - r->n[0] = a->n[0] | a->n[1] << 52; - r->n[1] = a->n[1] >> 12 | a->n[2] << 40; - r->n[2] = a->n[2] >> 24 | a->n[3] << 28; - r->n[3] = a->n[3] >> 36 | a->n[4] << 16; -} - -static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { - r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL; - r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL); - r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL); - r->n[3] = a->n[2] >> 28 | ((a->n[3] << 36) & 0xFFFFFFFFFFFFFULL); - r->n[4] = a->n[3] >> 16; -#ifdef VERIFY - r->magnitude = 1; - r->normalized = 1; -#endif -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/field_5x52_int128_impl.h b/external/libwally-core/src/secp256k1/src/field_5x52_int128_impl.h deleted file mode 100644 index 0bf22bdd3..000000000 --- a/external/libwally-core/src/secp256k1/src/field_5x52_int128_impl.h +++ /dev/null @@ -1,277 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ -#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ - -#include - -#ifdef VERIFY -#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) -#else -#define VERIFY_BITS(x, n) do { } while(0) -#endif - -SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { - uint128_t c, d; - uint64_t t3, t4, tx, u0; - uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; - const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; - - VERIFY_BITS(a[0], 56); - VERIFY_BITS(a[1], 56); - VERIFY_BITS(a[2], 56); - VERIFY_BITS(a[3], 56); - VERIFY_BITS(a[4], 52); - VERIFY_BITS(b[0], 56); - VERIFY_BITS(b[1], 56); - VERIFY_BITS(b[2], 56); - VERIFY_BITS(b[3], 56); - VERIFY_BITS(b[4], 52); - VERIFY_CHECK(r != b); - - /* [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. - * px is a shorthand for sum(a[i]*b[x-i], i=0..x). - * Note that [x 0 0 0 0 0] = [x*R]. - */ - - d = (uint128_t)a0 * b[3] - + (uint128_t)a1 * b[2] - + (uint128_t)a2 * b[1] - + (uint128_t)a3 * b[0]; - VERIFY_BITS(d, 114); - /* [d 0 0 0] = [p3 0 0 0] */ - c = (uint128_t)a4 * b[4]; - VERIFY_BITS(c, 112); - /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ - d += (c & M) * R; c >>= 52; - VERIFY_BITS(d, 115); - VERIFY_BITS(c, 60); - /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ - t3 = d & M; d >>= 52; - VERIFY_BITS(t3, 52); - VERIFY_BITS(d, 63); - /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ - - d += (uint128_t)a0 * b[4] - + (uint128_t)a1 * b[3] - + (uint128_t)a2 * b[2] - + (uint128_t)a3 * b[1] - + (uint128_t)a4 * b[0]; - VERIFY_BITS(d, 115); - /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ - d += c * R; - VERIFY_BITS(d, 116); - /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ - t4 = d & M; d >>= 52; - VERIFY_BITS(t4, 52); - VERIFY_BITS(d, 64); - /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ - tx = (t4 >> 48); t4 &= (M >> 4); - VERIFY_BITS(tx, 4); - VERIFY_BITS(t4, 48); - /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ - - c = (uint128_t)a0 * b[0]; - VERIFY_BITS(c, 112); - /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ - d += (uint128_t)a1 * b[4] - + (uint128_t)a2 * b[3] - + (uint128_t)a3 * b[2] - + (uint128_t)a4 * b[1]; - VERIFY_BITS(d, 115); - /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - u0 = d & M; d >>= 52; - VERIFY_BITS(u0, 52); - VERIFY_BITS(d, 63); - /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - u0 = (u0 << 4) | tx; - VERIFY_BITS(u0, 56); - /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - c += (uint128_t)u0 * (R >> 4); - VERIFY_BITS(c, 115); - /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - r[0] = c & M; c >>= 52; - VERIFY_BITS(r[0], 52); - VERIFY_BITS(c, 61); - /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ - - c += (uint128_t)a0 * b[1] - + (uint128_t)a1 * b[0]; - VERIFY_BITS(c, 114); - /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ - d += (uint128_t)a2 * b[4] - + (uint128_t)a3 * b[3] - + (uint128_t)a4 * b[2]; - VERIFY_BITS(d, 114); - /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ - c += (d & M) * R; d >>= 52; - VERIFY_BITS(c, 115); - VERIFY_BITS(d, 62); - /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ - r[1] = c & M; c >>= 52; - VERIFY_BITS(r[1], 52); - VERIFY_BITS(c, 63); - /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ - - c += (uint128_t)a0 * b[2] - + (uint128_t)a1 * b[1] - + (uint128_t)a2 * b[0]; - VERIFY_BITS(c, 114); - /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ - d += (uint128_t)a3 * b[4] - + (uint128_t)a4 * b[3]; - VERIFY_BITS(d, 114); - /* [d 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += (d & M) * R; d >>= 52; - VERIFY_BITS(c, 115); - VERIFY_BITS(d, 62); - /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - - /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[2] = c & M; c >>= 52; - VERIFY_BITS(r[2], 52); - VERIFY_BITS(c, 63); - /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += d * R + t3; - VERIFY_BITS(c, 100); - /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[3] = c & M; c >>= 52; - VERIFY_BITS(r[3], 52); - VERIFY_BITS(c, 48); - /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += t4; - VERIFY_BITS(c, 49); - /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[4] = c; - VERIFY_BITS(r[4], 49); - /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ -} - -SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { - uint128_t c, d; - uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; - int64_t t3, t4, tx, u0; - const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; - - VERIFY_BITS(a[0], 56); - VERIFY_BITS(a[1], 56); - VERIFY_BITS(a[2], 56); - VERIFY_BITS(a[3], 56); - VERIFY_BITS(a[4], 52); - - /** [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. - * px is a shorthand for sum(a[i]*a[x-i], i=0..x). - * Note that [x 0 0 0 0 0] = [x*R]. - */ - - d = (uint128_t)(a0*2) * a3 - + (uint128_t)(a1*2) * a2; - VERIFY_BITS(d, 114); - /* [d 0 0 0] = [p3 0 0 0] */ - c = (uint128_t)a4 * a4; - VERIFY_BITS(c, 112); - /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ - d += (c & M) * R; c >>= 52; - VERIFY_BITS(d, 115); - VERIFY_BITS(c, 60); - /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ - t3 = d & M; d >>= 52; - VERIFY_BITS(t3, 52); - VERIFY_BITS(d, 63); - /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ - - a4 *= 2; - d += (uint128_t)a0 * a4 - + (uint128_t)(a1*2) * a3 - + (uint128_t)a2 * a2; - VERIFY_BITS(d, 115); - /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ - d += c * R; - VERIFY_BITS(d, 116); - /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ - t4 = d & M; d >>= 52; - VERIFY_BITS(t4, 52); - VERIFY_BITS(d, 64); - /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ - tx = (t4 >> 48); t4 &= (M >> 4); - VERIFY_BITS(tx, 4); - VERIFY_BITS(t4, 48); - /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ - - c = (uint128_t)a0 * a0; - VERIFY_BITS(c, 112); - /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ - d += (uint128_t)a1 * a4 - + (uint128_t)(a2*2) * a3; - VERIFY_BITS(d, 114); - /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - u0 = d & M; d >>= 52; - VERIFY_BITS(u0, 52); - VERIFY_BITS(d, 62); - /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - u0 = (u0 << 4) | tx; - VERIFY_BITS(u0, 56); - /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - c += (uint128_t)u0 * (R >> 4); - VERIFY_BITS(c, 113); - /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ - r[0] = c & M; c >>= 52; - VERIFY_BITS(r[0], 52); - VERIFY_BITS(c, 61); - /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ - - a0 *= 2; - c += (uint128_t)a0 * a1; - VERIFY_BITS(c, 114); - /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ - d += (uint128_t)a2 * a4 - + (uint128_t)a3 * a3; - VERIFY_BITS(d, 114); - /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ - c += (d & M) * R; d >>= 52; - VERIFY_BITS(c, 115); - VERIFY_BITS(d, 62); - /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ - r[1] = c & M; c >>= 52; - VERIFY_BITS(r[1], 52); - VERIFY_BITS(c, 63); - /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ - - c += (uint128_t)a0 * a2 - + (uint128_t)a1 * a1; - VERIFY_BITS(c, 114); - /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ - d += (uint128_t)a3 * a4; - VERIFY_BITS(d, 114); - /* [d 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += (d & M) * R; d >>= 52; - VERIFY_BITS(c, 115); - VERIFY_BITS(d, 62); - /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[2] = c & M; c >>= 52; - VERIFY_BITS(r[2], 52); - VERIFY_BITS(c, 63); - /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - - c += d * R + t3; - VERIFY_BITS(c, 100); - /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[3] = c & M; c >>= 52; - VERIFY_BITS(r[3], 52); - VERIFY_BITS(c, 48); - /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - c += t4; - VERIFY_BITS(c, 49); - /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ - r[4] = c; - VERIFY_BITS(r[4], 49); - /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/field_impl.h b/external/libwally-core/src/secp256k1/src/field_impl.h deleted file mode 100644 index 5127b279b..000000000 --- a/external/libwally-core/src/secp256k1/src/field_impl.h +++ /dev/null @@ -1,315 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_FIELD_IMPL_H_ -#define _SECP256K1_FIELD_IMPL_H_ - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#include "util.h" - -#if defined(USE_FIELD_10X26) -#include "field_10x26_impl.h" -#elif defined(USE_FIELD_5X52) -#include "field_5x52_impl.h" -#else -#error "Please select field implementation" -#endif - -SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { - secp256k1_fe na; - secp256k1_fe_negate(&na, a, 1); - secp256k1_fe_add(&na, b); - return secp256k1_fe_normalizes_to_zero(&na); -} - -SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b) { - secp256k1_fe na; - secp256k1_fe_negate(&na, a, 1); - secp256k1_fe_add(&na, b); - return secp256k1_fe_normalizes_to_zero_var(&na); -} - -static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) { - /** Given that p is congruent to 3 mod 4, we can compute the square root of - * a mod p as the (p+1)/4'th power of a. - * - * As (p+1)/4 is an even number, it will have the same result for a and for - * (-a). Only one of these two numbers actually has a square root however, - * so we test at the end by squaring and comparing to the input. - * Also because (p+1)/4 is an even number, the computed square root is - * itself always a square (a ** ((p+1)/4) is the square of a ** ((p+1)/8)). - */ - secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; - int j; - - /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in - * { 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: - * 1, [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] - */ - - secp256k1_fe_sqr(&x2, a); - secp256k1_fe_mul(&x2, &x2, a); - - secp256k1_fe_sqr(&x3, &x2); - secp256k1_fe_mul(&x3, &x3, a); - - x6 = x3; - for (j=0; j<3; j++) { - secp256k1_fe_sqr(&x6, &x6); - } - secp256k1_fe_mul(&x6, &x6, &x3); - - x9 = x6; - for (j=0; j<3; j++) { - secp256k1_fe_sqr(&x9, &x9); - } - secp256k1_fe_mul(&x9, &x9, &x3); - - x11 = x9; - for (j=0; j<2; j++) { - secp256k1_fe_sqr(&x11, &x11); - } - secp256k1_fe_mul(&x11, &x11, &x2); - - x22 = x11; - for (j=0; j<11; j++) { - secp256k1_fe_sqr(&x22, &x22); - } - secp256k1_fe_mul(&x22, &x22, &x11); - - x44 = x22; - for (j=0; j<22; j++) { - secp256k1_fe_sqr(&x44, &x44); - } - secp256k1_fe_mul(&x44, &x44, &x22); - - x88 = x44; - for (j=0; j<44; j++) { - secp256k1_fe_sqr(&x88, &x88); - } - secp256k1_fe_mul(&x88, &x88, &x44); - - x176 = x88; - for (j=0; j<88; j++) { - secp256k1_fe_sqr(&x176, &x176); - } - secp256k1_fe_mul(&x176, &x176, &x88); - - x220 = x176; - for (j=0; j<44; j++) { - secp256k1_fe_sqr(&x220, &x220); - } - secp256k1_fe_mul(&x220, &x220, &x44); - - x223 = x220; - for (j=0; j<3; j++) { - secp256k1_fe_sqr(&x223, &x223); - } - secp256k1_fe_mul(&x223, &x223, &x3); - - /* The final result is then assembled using a sliding window over the blocks. */ - - t1 = x223; - for (j=0; j<23; j++) { - secp256k1_fe_sqr(&t1, &t1); - } - secp256k1_fe_mul(&t1, &t1, &x22); - for (j=0; j<6; j++) { - secp256k1_fe_sqr(&t1, &t1); - } - secp256k1_fe_mul(&t1, &t1, &x2); - secp256k1_fe_sqr(&t1, &t1); - secp256k1_fe_sqr(r, &t1); - - /* Check that a square root was actually calculated */ - - secp256k1_fe_sqr(&t1, r); - return secp256k1_fe_equal(&t1, a); -} - -static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a) { - secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; - int j; - - /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in - * { 1, 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: - * [1], [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] - */ - - secp256k1_fe_sqr(&x2, a); - secp256k1_fe_mul(&x2, &x2, a); - - secp256k1_fe_sqr(&x3, &x2); - secp256k1_fe_mul(&x3, &x3, a); - - x6 = x3; - for (j=0; j<3; j++) { - secp256k1_fe_sqr(&x6, &x6); - } - secp256k1_fe_mul(&x6, &x6, &x3); - - x9 = x6; - for (j=0; j<3; j++) { - secp256k1_fe_sqr(&x9, &x9); - } - secp256k1_fe_mul(&x9, &x9, &x3); - - x11 = x9; - for (j=0; j<2; j++) { - secp256k1_fe_sqr(&x11, &x11); - } - secp256k1_fe_mul(&x11, &x11, &x2); - - x22 = x11; - for (j=0; j<11; j++) { - secp256k1_fe_sqr(&x22, &x22); - } - secp256k1_fe_mul(&x22, &x22, &x11); - - x44 = x22; - for (j=0; j<22; j++) { - secp256k1_fe_sqr(&x44, &x44); - } - secp256k1_fe_mul(&x44, &x44, &x22); - - x88 = x44; - for (j=0; j<44; j++) { - secp256k1_fe_sqr(&x88, &x88); - } - secp256k1_fe_mul(&x88, &x88, &x44); - - x176 = x88; - for (j=0; j<88; j++) { - secp256k1_fe_sqr(&x176, &x176); - } - secp256k1_fe_mul(&x176, &x176, &x88); - - x220 = x176; - for (j=0; j<44; j++) { - secp256k1_fe_sqr(&x220, &x220); - } - secp256k1_fe_mul(&x220, &x220, &x44); - - x223 = x220; - for (j=0; j<3; j++) { - secp256k1_fe_sqr(&x223, &x223); - } - secp256k1_fe_mul(&x223, &x223, &x3); - - /* The final result is then assembled using a sliding window over the blocks. */ - - t1 = x223; - for (j=0; j<23; j++) { - secp256k1_fe_sqr(&t1, &t1); - } - secp256k1_fe_mul(&t1, &t1, &x22); - for (j=0; j<5; j++) { - secp256k1_fe_sqr(&t1, &t1); - } - secp256k1_fe_mul(&t1, &t1, a); - for (j=0; j<3; j++) { - secp256k1_fe_sqr(&t1, &t1); - } - secp256k1_fe_mul(&t1, &t1, &x2); - for (j=0; j<2; j++) { - secp256k1_fe_sqr(&t1, &t1); - } - secp256k1_fe_mul(r, a, &t1); -} - -static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a) { -#if defined(USE_FIELD_INV_BUILTIN) - secp256k1_fe_inv(r, a); -#elif defined(USE_FIELD_INV_NUM) - secp256k1_num n, m; - static const secp256k1_fe negone = SECP256K1_FE_CONST( - 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, - 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xFFFFFC2EUL - ); - /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ - static const unsigned char prime[32] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F - }; - unsigned char b[32]; - int res; - secp256k1_fe c = *a; - secp256k1_fe_normalize_var(&c); - secp256k1_fe_get_b32(b, &c); - secp256k1_num_set_bin(&n, b, 32); - secp256k1_num_set_bin(&m, prime, 32); - secp256k1_num_mod_inverse(&n, &n, &m); - secp256k1_num_get_bin(b, 32, &n); - res = secp256k1_fe_set_b32(r, b); - (void)res; - VERIFY_CHECK(res); - /* Verify the result is the (unique) valid inverse using non-GMP code. */ - secp256k1_fe_mul(&c, &c, r); - secp256k1_fe_add(&c, &negone); - CHECK(secp256k1_fe_normalizes_to_zero_var(&c)); -#else -#error "Please select field inverse implementation" -#endif -} - -static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len) { - secp256k1_fe u; - size_t i; - if (len < 1) { - return; - } - - VERIFY_CHECK((r + len <= a) || (a + len <= r)); - - r[0] = a[0]; - - i = 0; - while (++i < len) { - secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]); - } - - secp256k1_fe_inv_var(&u, &r[--i]); - - while (i > 0) { - size_t j = i--; - secp256k1_fe_mul(&r[j], &r[i], &u); - secp256k1_fe_mul(&u, &u, &a[j]); - } - - r[0] = u; -} - -static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) { -#ifndef USE_NUM_NONE - unsigned char b[32]; - secp256k1_num n; - secp256k1_num m; - /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ - static const unsigned char prime[32] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F - }; - - secp256k1_fe c = *a; - secp256k1_fe_normalize_var(&c); - secp256k1_fe_get_b32(b, &c); - secp256k1_num_set_bin(&n, b, 32); - secp256k1_num_set_bin(&m, prime, 32); - return secp256k1_num_jacobi(&n, &m) >= 0; -#else - secp256k1_fe r; - return secp256k1_fe_sqrt(&r, a); -#endif -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/gen_context.c b/external/libwally-core/src/secp256k1/src/gen_context.c deleted file mode 100644 index 1835fd491..000000000 --- a/external/libwally-core/src/secp256k1/src/gen_context.c +++ /dev/null @@ -1,74 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014, 2015 Thomas Daede, Cory Fields * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#define USE_BASIC_CONFIG 1 - -#include "basic-config.h" -#include "include/secp256k1.h" -#include "field_impl.h" -#include "scalar_impl.h" -#include "group_impl.h" -#include "ecmult_gen_impl.h" - -static void default_error_callback_fn(const char* str, void* data) { - (void)data; - fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); - abort(); -} - -static const secp256k1_callback default_error_callback = { - default_error_callback_fn, - NULL -}; - -int main(int argc, char **argv) { - secp256k1_ecmult_gen_context ctx; - int inner; - int outer; - FILE* fp; - - (void)argc; - (void)argv; - - fp = fopen("src/ecmult_static_context.h","w"); - if (fp == NULL) { - fprintf(stderr, "Could not open src/ecmult_static_context.h for writing!\n"); - return -1; - } - - fprintf(fp, "#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); - fprintf(fp, "#define _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); - fprintf(fp, "#include \"group.h\"\n"); - fprintf(fp, "#define SC SECP256K1_GE_STORAGE_CONST\n"); - fprintf(fp, "static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = {\n"); - - secp256k1_ecmult_gen_context_init(&ctx); - secp256k1_ecmult_gen_context_build(&ctx, &default_error_callback); - for(outer = 0; outer != 64; outer++) { - fprintf(fp,"{\n"); - for(inner = 0; inner != 16; inner++) { - fprintf(fp," SC(%uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu)", SECP256K1_GE_STORAGE_CONST_GET((*ctx.prec)[outer][inner])); - if (inner != 15) { - fprintf(fp,",\n"); - } else { - fprintf(fp,"\n"); - } - } - if (outer != 63) { - fprintf(fp,"},\n"); - } else { - fprintf(fp,"}\n"); - } - } - fprintf(fp,"};\n"); - secp256k1_ecmult_gen_context_clear(&ctx); - - fprintf(fp, "#undef SC\n"); - fprintf(fp, "#endif\n"); - fclose(fp); - - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/group.h b/external/libwally-core/src/secp256k1/src/group.h deleted file mode 100644 index 4957b248f..000000000 --- a/external/libwally-core/src/secp256k1/src/group.h +++ /dev/null @@ -1,144 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_GROUP_ -#define _SECP256K1_GROUP_ - -#include "num.h" -#include "field.h" - -/** A group element of the secp256k1 curve, in affine coordinates. */ -typedef struct { - secp256k1_fe x; - secp256k1_fe y; - int infinity; /* whether this represents the point at infinity */ -} secp256k1_ge; - -#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), 0} -#define SECP256K1_GE_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} - -/** A group element of the secp256k1 curve, in jacobian coordinates. */ -typedef struct { - secp256k1_fe x; /* actual X: x/z^2 */ - secp256k1_fe y; /* actual Y: y/z^3 */ - secp256k1_fe z; - int infinity; /* whether this represents the point at infinity */ -} secp256k1_gej; - -#define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1), 0} -#define SECP256K1_GEJ_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} - -typedef struct { - secp256k1_fe_storage x; - secp256k1_fe_storage y; -} secp256k1_ge_storage; - -#define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_STORAGE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_STORAGE_CONST((i),(j),(k),(l),(m),(n),(o),(p))} - -#define SECP256K1_GE_STORAGE_CONST_GET(t) SECP256K1_FE_STORAGE_CONST_GET(t.x), SECP256K1_FE_STORAGE_CONST_GET(t.y) - -/** Set a group element equal to the point with given X and Y coordinates */ -static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y); - -/** Set a group element (affine) equal to the point with the given X coordinate - * and a Y coordinate that is a quadratic residue modulo p. The return value - * is true iff a coordinate with the given X coordinate exists. - */ -static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x); - -/** Set a group element (affine) equal to the point with the given X coordinate, and given oddness - * for Y. Return value indicates whether the result is valid. */ -static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd); - -/** Check whether a group element is the point at infinity. */ -static int secp256k1_ge_is_infinity(const secp256k1_ge *a); - -/** Check whether a group element is valid (i.e., on the curve). */ -static int secp256k1_ge_is_valid_var(const secp256k1_ge *a); - -static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a); - -/** Set a group element equal to another which is given in jacobian coordinates */ -static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a); - -/** Set a batch of group elements equal to the inputs given in jacobian coordinates */ -static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb); - -/** Set a batch of group elements equal to the inputs given in jacobian - * coordinates (with known z-ratios). zr must contain the known z-ratios such - * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. */ -static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len); - -/** Bring a batch inputs given in jacobian coordinates (with known z-ratios) to - * the same global z "denominator". zr must contain the known z-ratios such - * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. The x and y - * coordinates of the result are stored in r, the common z coordinate is - * stored in globalz. */ -static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr); - -/** Set a group element (jacobian) equal to the point at infinity. */ -static void secp256k1_gej_set_infinity(secp256k1_gej *r); - -/** Set a group element (jacobian) equal to another which is given in affine coordinates. */ -static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a); - -/** Compare the X coordinate of a group element (jacobian). */ -static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a); - -/** Set r equal to the inverse of a (i.e., mirrored around the X axis) */ -static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a); - -/** Check whether a group element is the point at infinity. */ -static int secp256k1_gej_is_infinity(const secp256k1_gej *a); - -/** Check whether a group element's y coordinate is a quadratic residue. */ -static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a); - -/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). - * a may not be zero. Constant time. */ -static void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); - -/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). */ -static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); - -/** Set r equal to the sum of a and b. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ -static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr); - -/** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */ -static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b); - -/** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient - than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time - guarantee, and b is allowed to be infinity. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ -static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr); - -/** Set r equal to the sum of a and b (with the inverse of b's Z coordinate passed as bzinv). */ -static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv); - -#ifdef USE_ENDOMORPHISM -/** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */ -static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a); -#endif - -/** Clear a secp256k1_gej to prevent leaking sensitive information. */ -static void secp256k1_gej_clear(secp256k1_gej *r); - -/** Clear a secp256k1_ge to prevent leaking sensitive information. */ -static void secp256k1_ge_clear(secp256k1_ge *r); - -/** Convert a group element to the storage type. */ -static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a); - -/** Convert a group element back from the storage type. */ -static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a); - -/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ -static void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag); - -/** Rescale a jacobian point by b which must be non-zero. Constant-time. */ -static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/group_impl.h b/external/libwally-core/src/secp256k1/src/group_impl.h deleted file mode 100644 index 18f2b3735..000000000 --- a/external/libwally-core/src/secp256k1/src/group_impl.h +++ /dev/null @@ -1,650 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_GROUP_IMPL_H_ -#define _SECP256K1_GROUP_IMPL_H_ - -#include "num.h" -#include "field.h" -#include "group.h" - -/** Generator for secp256k1, value 'g' defined in - * "Standards for Efficient Cryptography" (SEC2) 2.7.1. - */ -static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( - 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL, - 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL, - 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL, - 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL -); - -static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi) { - secp256k1_fe zi2; - secp256k1_fe zi3; - secp256k1_fe_sqr(&zi2, zi); - secp256k1_fe_mul(&zi3, &zi2, zi); - secp256k1_fe_mul(&r->x, &a->x, &zi2); - secp256k1_fe_mul(&r->y, &a->y, &zi3); - r->infinity = a->infinity; -} - -static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y) { - r->infinity = 0; - r->x = *x; - r->y = *y; -} - -static int secp256k1_ge_is_infinity(const secp256k1_ge *a) { - return a->infinity; -} - -static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a) { - *r = *a; - secp256k1_fe_normalize_weak(&r->y); - secp256k1_fe_negate(&r->y, &r->y, 1); -} - -static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) { - secp256k1_fe z2, z3; - r->infinity = a->infinity; - secp256k1_fe_inv(&a->z, &a->z); - secp256k1_fe_sqr(&z2, &a->z); - secp256k1_fe_mul(&z3, &a->z, &z2); - secp256k1_fe_mul(&a->x, &a->x, &z2); - secp256k1_fe_mul(&a->y, &a->y, &z3); - secp256k1_fe_set_int(&a->z, 1); - r->x = a->x; - r->y = a->y; -} - -static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) { - secp256k1_fe z2, z3; - r->infinity = a->infinity; - if (a->infinity) { - return; - } - secp256k1_fe_inv_var(&a->z, &a->z); - secp256k1_fe_sqr(&z2, &a->z); - secp256k1_fe_mul(&z3, &a->z, &z2); - secp256k1_fe_mul(&a->x, &a->x, &z2); - secp256k1_fe_mul(&a->y, &a->y, &z3); - secp256k1_fe_set_int(&a->z, 1); - r->x = a->x; - r->y = a->y; -} - -static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb) { - secp256k1_fe *az; - secp256k1_fe *azi; - size_t i; - size_t count = 0; - az = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * len); - for (i = 0; i < len; i++) { - if (!a[i].infinity) { - az[count++] = a[i].z; - } - } - - azi = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * count); - secp256k1_fe_inv_all_var(azi, az, count); - free(az); - - count = 0; - for (i = 0; i < len; i++) { - r[i].infinity = a[i].infinity; - if (!a[i].infinity) { - secp256k1_ge_set_gej_zinv(&r[i], &a[i], &azi[count++]); - } - } - free(azi); -} - -static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len) { - size_t i = len - 1; - secp256k1_fe zi; - - if (len > 0) { - /* Compute the inverse of the last z coordinate, and use it to compute the last affine output. */ - secp256k1_fe_inv(&zi, &a[i].z); - secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); - - /* Work out way backwards, using the z-ratios to scale the x/y values. */ - while (i > 0) { - secp256k1_fe_mul(&zi, &zi, &zr[i]); - i--; - secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); - } - } -} - -static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr) { - size_t i = len - 1; - secp256k1_fe zs; - - if (len > 0) { - /* The z of the final point gives us the "global Z" for the table. */ - r[i].x = a[i].x; - r[i].y = a[i].y; - *globalz = a[i].z; - r[i].infinity = 0; - zs = zr[i]; - - /* Work our way backwards, using the z-ratios to scale the x/y values. */ - while (i > 0) { - if (i != len - 1) { - secp256k1_fe_mul(&zs, &zs, &zr[i]); - } - i--; - secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zs); - } - } -} - -static void secp256k1_gej_set_infinity(secp256k1_gej *r) { - r->infinity = 1; - secp256k1_fe_set_int(&r->x, 0); - secp256k1_fe_set_int(&r->y, 0); - secp256k1_fe_set_int(&r->z, 0); -} - -static void secp256k1_gej_clear(secp256k1_gej *r) { - r->infinity = 0; - secp256k1_fe_clear(&r->x); - secp256k1_fe_clear(&r->y); - secp256k1_fe_clear(&r->z); -} - -static void secp256k1_ge_clear(secp256k1_ge *r) { - r->infinity = 0; - secp256k1_fe_clear(&r->x); - secp256k1_fe_clear(&r->y); -} - -static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) { - secp256k1_fe x2, x3, c; - r->x = *x; - secp256k1_fe_sqr(&x2, x); - secp256k1_fe_mul(&x3, x, &x2); - r->infinity = 0; - secp256k1_fe_set_int(&c, 7); - secp256k1_fe_add(&c, &x3); - return secp256k1_fe_sqrt(&r->y, &c); -} - -static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) { - if (!secp256k1_ge_set_xquad(r, x)) { - return 0; - } - secp256k1_fe_normalize_var(&r->y); - if (secp256k1_fe_is_odd(&r->y) != odd) { - secp256k1_fe_negate(&r->y, &r->y, 1); - } - return 1; - -} - -static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a) { - r->infinity = a->infinity; - r->x = a->x; - r->y = a->y; - secp256k1_fe_set_int(&r->z, 1); -} - -static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) { - secp256k1_fe r, r2; - VERIFY_CHECK(!a->infinity); - secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x); - r2 = a->x; secp256k1_fe_normalize_weak(&r2); - return secp256k1_fe_equal_var(&r, &r2); -} - -static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a) { - r->infinity = a->infinity; - r->x = a->x; - r->y = a->y; - r->z = a->z; - secp256k1_fe_normalize_weak(&r->y); - secp256k1_fe_negate(&r->y, &r->y, 1); -} - -static int secp256k1_gej_is_infinity(const secp256k1_gej *a) { - return a->infinity; -} - -static int secp256k1_gej_is_valid_var(const secp256k1_gej *a) { - secp256k1_fe y2, x3, z2, z6; - if (a->infinity) { - return 0; - } - /** y^2 = x^3 + 7 - * (Y/Z^3)^2 = (X/Z^2)^3 + 7 - * Y^2 / Z^6 = X^3 / Z^6 + 7 - * Y^2 = X^3 + 7*Z^6 - */ - secp256k1_fe_sqr(&y2, &a->y); - secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); - secp256k1_fe_sqr(&z2, &a->z); - secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2); - secp256k1_fe_mul_int(&z6, 7); - secp256k1_fe_add(&x3, &z6); - secp256k1_fe_normalize_weak(&x3); - return secp256k1_fe_equal_var(&y2, &x3); -} - -static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) { - secp256k1_fe y2, x3, c; - if (a->infinity) { - return 0; - } - /* y^2 = x^3 + 7 */ - secp256k1_fe_sqr(&y2, &a->y); - secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); - secp256k1_fe_set_int(&c, 7); - secp256k1_fe_add(&x3, &c); - secp256k1_fe_normalize_weak(&x3); - return secp256k1_fe_equal_var(&y2, &x3); -} - -static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { - /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate. - * - * Note that there is an implementation described at - * https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l - * which trades a multiply for a square, but in practice this is actually slower, - * mainly because it requires more normalizations. - */ - secp256k1_fe t1,t2,t3,t4; - /** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity, - * Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have - * y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p. - * - * Having said this, if this function receives a point on a sextic twist, e.g. by - * a fault attack, it is possible for y to be 0. This happens for y^2 = x^3 + 6, - * since -6 does have a cube root mod p. For this point, this function will not set - * the infinity flag even though the point doubles to infinity, and the result - * point will be gibberish (z = 0 but infinity = 0). - */ - r->infinity = a->infinity; - if (r->infinity) { - if (rzr != NULL) { - secp256k1_fe_set_int(rzr, 1); - } - return; - } - - if (rzr != NULL) { - *rzr = a->y; - secp256k1_fe_normalize_weak(rzr); - secp256k1_fe_mul_int(rzr, 2); - } - - secp256k1_fe_mul(&r->z, &a->z, &a->y); - secp256k1_fe_mul_int(&r->z, 2); /* Z' = 2*Y*Z (2) */ - secp256k1_fe_sqr(&t1, &a->x); - secp256k1_fe_mul_int(&t1, 3); /* T1 = 3*X^2 (3) */ - secp256k1_fe_sqr(&t2, &t1); /* T2 = 9*X^4 (1) */ - secp256k1_fe_sqr(&t3, &a->y); - secp256k1_fe_mul_int(&t3, 2); /* T3 = 2*Y^2 (2) */ - secp256k1_fe_sqr(&t4, &t3); - secp256k1_fe_mul_int(&t4, 2); /* T4 = 8*Y^4 (2) */ - secp256k1_fe_mul(&t3, &t3, &a->x); /* T3 = 2*X*Y^2 (1) */ - r->x = t3; - secp256k1_fe_mul_int(&r->x, 4); /* X' = 8*X*Y^2 (4) */ - secp256k1_fe_negate(&r->x, &r->x, 4); /* X' = -8*X*Y^2 (5) */ - secp256k1_fe_add(&r->x, &t2); /* X' = 9*X^4 - 8*X*Y^2 (6) */ - secp256k1_fe_negate(&t2, &t2, 1); /* T2 = -9*X^4 (2) */ - secp256k1_fe_mul_int(&t3, 6); /* T3 = 12*X*Y^2 (6) */ - secp256k1_fe_add(&t3, &t2); /* T3 = 12*X*Y^2 - 9*X^4 (8) */ - secp256k1_fe_mul(&r->y, &t1, &t3); /* Y' = 36*X^3*Y^2 - 27*X^6 (1) */ - secp256k1_fe_negate(&t2, &t4, 2); /* T2 = -8*Y^4 (3) */ - secp256k1_fe_add(&r->y, &t2); /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */ -} - -static SECP256K1_INLINE void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { - VERIFY_CHECK(!secp256k1_gej_is_infinity(a)); - secp256k1_gej_double_var(r, a, rzr); -} - -static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr) { - /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/add/negate */ - secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; - - if (a->infinity) { - VERIFY_CHECK(rzr == NULL); - *r = *b; - return; - } - - if (b->infinity) { - if (rzr != NULL) { - secp256k1_fe_set_int(rzr, 1); - } - *r = *a; - return; - } - - r->infinity = 0; - secp256k1_fe_sqr(&z22, &b->z); - secp256k1_fe_sqr(&z12, &a->z); - secp256k1_fe_mul(&u1, &a->x, &z22); - secp256k1_fe_mul(&u2, &b->x, &z12); - secp256k1_fe_mul(&s1, &a->y, &z22); secp256k1_fe_mul(&s1, &s1, &b->z); - secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); - secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); - secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); - if (secp256k1_fe_normalizes_to_zero_var(&h)) { - if (secp256k1_fe_normalizes_to_zero_var(&i)) { - secp256k1_gej_double_var(r, a, rzr); - } else { - if (rzr != NULL) { - secp256k1_fe_set_int(rzr, 0); - } - r->infinity = 1; - } - return; - } - secp256k1_fe_sqr(&i2, &i); - secp256k1_fe_sqr(&h2, &h); - secp256k1_fe_mul(&h3, &h, &h2); - secp256k1_fe_mul(&h, &h, &b->z); - if (rzr != NULL) { - *rzr = h; - } - secp256k1_fe_mul(&r->z, &a->z, &h); - secp256k1_fe_mul(&t, &u1, &h2); - r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); - secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); - secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); - secp256k1_fe_add(&r->y, &h3); -} - -static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr) { - /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ - secp256k1_fe z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; - if (a->infinity) { - VERIFY_CHECK(rzr == NULL); - secp256k1_gej_set_ge(r, b); - return; - } - if (b->infinity) { - if (rzr != NULL) { - secp256k1_fe_set_int(rzr, 1); - } - *r = *a; - return; - } - r->infinity = 0; - - secp256k1_fe_sqr(&z12, &a->z); - u1 = a->x; secp256k1_fe_normalize_weak(&u1); - secp256k1_fe_mul(&u2, &b->x, &z12); - s1 = a->y; secp256k1_fe_normalize_weak(&s1); - secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); - secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); - secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); - if (secp256k1_fe_normalizes_to_zero_var(&h)) { - if (secp256k1_fe_normalizes_to_zero_var(&i)) { - secp256k1_gej_double_var(r, a, rzr); - } else { - if (rzr != NULL) { - secp256k1_fe_set_int(rzr, 0); - } - r->infinity = 1; - } - return; - } - secp256k1_fe_sqr(&i2, &i); - secp256k1_fe_sqr(&h2, &h); - secp256k1_fe_mul(&h3, &h, &h2); - if (rzr != NULL) { - *rzr = h; - } - secp256k1_fe_mul(&r->z, &a->z, &h); - secp256k1_fe_mul(&t, &u1, &h2); - r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); - secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); - secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); - secp256k1_fe_add(&r->y, &h3); -} - -static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv) { - /* 9 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ - secp256k1_fe az, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; - - if (b->infinity) { - *r = *a; - return; - } - if (a->infinity) { - secp256k1_fe bzinv2, bzinv3; - r->infinity = b->infinity; - secp256k1_fe_sqr(&bzinv2, bzinv); - secp256k1_fe_mul(&bzinv3, &bzinv2, bzinv); - secp256k1_fe_mul(&r->x, &b->x, &bzinv2); - secp256k1_fe_mul(&r->y, &b->y, &bzinv3); - secp256k1_fe_set_int(&r->z, 1); - return; - } - r->infinity = 0; - - /** We need to calculate (rx,ry,rz) = (ax,ay,az) + (bx,by,1/bzinv). Due to - * secp256k1's isomorphism we can multiply the Z coordinates on both sides - * by bzinv, and get: (rx,ry,rz*bzinv) = (ax,ay,az*bzinv) + (bx,by,1). - * This means that (rx,ry,rz) can be calculated as - * (ax,ay,az*bzinv) + (bx,by,1), when not applying the bzinv factor to rz. - * The variable az below holds the modified Z coordinate for a, which is used - * for the computation of rx and ry, but not for rz. - */ - secp256k1_fe_mul(&az, &a->z, bzinv); - - secp256k1_fe_sqr(&z12, &az); - u1 = a->x; secp256k1_fe_normalize_weak(&u1); - secp256k1_fe_mul(&u2, &b->x, &z12); - s1 = a->y; secp256k1_fe_normalize_weak(&s1); - secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &az); - secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); - secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); - if (secp256k1_fe_normalizes_to_zero_var(&h)) { - if (secp256k1_fe_normalizes_to_zero_var(&i)) { - secp256k1_gej_double_var(r, a, NULL); - } else { - r->infinity = 1; - } - return; - } - secp256k1_fe_sqr(&i2, &i); - secp256k1_fe_sqr(&h2, &h); - secp256k1_fe_mul(&h3, &h, &h2); - r->z = a->z; secp256k1_fe_mul(&r->z, &r->z, &h); - secp256k1_fe_mul(&t, &u1, &h2); - r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); - secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); - secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); - secp256k1_fe_add(&r->y, &h3); -} - - -static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b) { - /* Operations: 7 mul, 5 sqr, 4 normalize, 21 mul_int/add/negate/cmov */ - static const secp256k1_fe fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr; - secp256k1_fe m_alt, rr_alt; - int infinity, degenerate; - VERIFY_CHECK(!b->infinity); - VERIFY_CHECK(a->infinity == 0 || a->infinity == 1); - - /** In: - * Eric Brier and Marc Joye, Weierstrass Elliptic Curves and Side-Channel Attacks. - * In D. Naccache and P. Paillier, Eds., Public Key Cryptography, vol. 2274 of Lecture Notes in Computer Science, pages 335-345. Springer-Verlag, 2002. - * we find as solution for a unified addition/doubling formula: - * lambda = ((x1 + x2)^2 - x1 * x2 + a) / (y1 + y2), with a = 0 for secp256k1's curve equation. - * x3 = lambda^2 - (x1 + x2) - * 2*y3 = lambda * (x1 + x2 - 2 * x3) - (y1 + y2). - * - * Substituting x_i = Xi / Zi^2 and yi = Yi / Zi^3, for i=1,2,3, gives: - * U1 = X1*Z2^2, U2 = X2*Z1^2 - * S1 = Y1*Z2^3, S2 = Y2*Z1^3 - * Z = Z1*Z2 - * T = U1+U2 - * M = S1+S2 - * Q = T*M^2 - * R = T^2-U1*U2 - * X3 = 4*(R^2-Q) - * Y3 = 4*(R*(3*Q-2*R^2)-M^4) - * Z3 = 2*M*Z - * (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.) - * - * This formula has the benefit of being the same for both addition - * of distinct points and doubling. However, it breaks down in the - * case that either point is infinity, or that y1 = -y2. We handle - * these cases in the following ways: - * - * - If b is infinity we simply bail by means of a VERIFY_CHECK. - * - * - If a is infinity, we detect this, and at the end of the - * computation replace the result (which will be meaningless, - * but we compute to be constant-time) with b.x : b.y : 1. - * - * - If a = -b, we have y1 = -y2, which is a degenerate case. - * But here the answer is infinity, so we simply set the - * infinity flag of the result, overriding the computed values - * without even needing to cmov. - * - * - If y1 = -y2 but x1 != x2, which does occur thanks to certain - * properties of our curve (specifically, 1 has nontrivial cube - * roots in our field, and the curve equation has no x coefficient) - * then the answer is not infinity but also not given by the above - * equation. In this case, we cmov in place an alternate expression - * for lambda. Specifically (y1 - y2)/(x1 - x2). Where both these - * expressions for lambda are defined, they are equal, and can be - * obtained from each other by multiplication by (y1 + y2)/(y1 + y2) - * then substitution of x^3 + 7 for y^2 (using the curve equation). - * For all pairs of nonzero points (a, b) at least one is defined, - * so this covers everything. - */ - - secp256k1_fe_sqr(&zz, &a->z); /* z = Z1^2 */ - u1 = a->x; secp256k1_fe_normalize_weak(&u1); /* u1 = U1 = X1*Z2^2 (1) */ - secp256k1_fe_mul(&u2, &b->x, &zz); /* u2 = U2 = X2*Z1^2 (1) */ - s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */ - secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z1^2 (1) */ - secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */ - t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */ - m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */ - secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */ - secp256k1_fe_negate(&m_alt, &u2, 1); /* Malt = -X2*Z1^2 */ - secp256k1_fe_mul(&tt, &u1, &m_alt); /* tt = -U1*U2 (2) */ - secp256k1_fe_add(&rr, &tt); /* rr = R = T^2-U1*U2 (3) */ - /** If lambda = R/M = 0/0 we have a problem (except in the "trivial" - * case that Z = z1z2 = 0, and this is special-cased later on). */ - degenerate = secp256k1_fe_normalizes_to_zero(&m) & - secp256k1_fe_normalizes_to_zero(&rr); - /* This only occurs when y1 == -y2 and x1^3 == x2^3, but x1 != x2. - * This means either x1 == beta*x2 or beta*x1 == x2, where beta is - * a nontrivial cube root of one. In either case, an alternate - * non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2), - * so we set R/M equal to this. */ - rr_alt = s1; - secp256k1_fe_mul_int(&rr_alt, 2); /* rr = Y1*Z2^3 - Y2*Z1^3 (2) */ - secp256k1_fe_add(&m_alt, &u1); /* Malt = X1*Z2^2 - X2*Z1^2 */ - - secp256k1_fe_cmov(&rr_alt, &rr, !degenerate); - secp256k1_fe_cmov(&m_alt, &m, !degenerate); - /* Now Ralt / Malt = lambda and is guaranteed not to be 0/0. - * From here on out Ralt and Malt represent the numerator - * and denominator of lambda; R and M represent the explicit - * expressions x1^2 + x2^2 + x1x2 and y1 + y2. */ - secp256k1_fe_sqr(&n, &m_alt); /* n = Malt^2 (1) */ - secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*Malt^2 (1) */ - /* These two lines use the observation that either M == Malt or M == 0, - * so M^3 * Malt is either Malt^4 (which is computed by squaring), or - * zero (which is "computed" by cmov). So the cost is one squaring - * versus two multiplications. */ - secp256k1_fe_sqr(&n, &n); - secp256k1_fe_cmov(&n, &m, degenerate); /* n = M^3 * Malt (2) */ - secp256k1_fe_sqr(&t, &rr_alt); /* t = Ralt^2 (1) */ - secp256k1_fe_mul(&r->z, &a->z, &m_alt); /* r->z = Malt*Z (1) */ - infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); - secp256k1_fe_mul_int(&r->z, 2); /* r->z = Z3 = 2*Malt*Z (2) */ - secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ - secp256k1_fe_add(&t, &q); /* t = Ralt^2-Q (3) */ - secp256k1_fe_normalize_weak(&t); - r->x = t; /* r->x = Ralt^2-Q (1) */ - secp256k1_fe_mul_int(&t, 2); /* t = 2*x3 (2) */ - secp256k1_fe_add(&t, &q); /* t = 2*x3 - Q: (4) */ - secp256k1_fe_mul(&t, &t, &rr_alt); /* t = Ralt*(2*x3 - Q) (1) */ - secp256k1_fe_add(&t, &n); /* t = Ralt*(2*x3 - Q) + M^3*Malt (3) */ - secp256k1_fe_negate(&r->y, &t, 3); /* r->y = Ralt*(Q - 2x3) - M^3*Malt (4) */ - secp256k1_fe_normalize_weak(&r->y); - secp256k1_fe_mul_int(&r->x, 4); /* r->x = X3 = 4*(Ralt^2-Q) */ - secp256k1_fe_mul_int(&r->y, 4); /* r->y = Y3 = 4*Ralt*(Q - 2x3) - 4*M^3*Malt (4) */ - - /** In case a->infinity == 1, replace r with (b->x, b->y, 1). */ - secp256k1_fe_cmov(&r->x, &b->x, a->infinity); - secp256k1_fe_cmov(&r->y, &b->y, a->infinity); - secp256k1_fe_cmov(&r->z, &fe_1, a->infinity); - r->infinity = infinity; -} - -static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s) { - /* Operations: 4 mul, 1 sqr */ - secp256k1_fe zz; - VERIFY_CHECK(!secp256k1_fe_is_zero(s)); - secp256k1_fe_sqr(&zz, s); - secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */ - secp256k1_fe_mul(&r->y, &r->y, &zz); - secp256k1_fe_mul(&r->y, &r->y, s); /* r->y *= s^3 */ - secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */ -} - -static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a) { - secp256k1_fe x, y; - VERIFY_CHECK(!a->infinity); - x = a->x; - secp256k1_fe_normalize(&x); - y = a->y; - secp256k1_fe_normalize(&y); - secp256k1_fe_to_storage(&r->x, &x); - secp256k1_fe_to_storage(&r->y, &y); -} - -static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a) { - secp256k1_fe_from_storage(&r->x, &a->x); - secp256k1_fe_from_storage(&r->y, &a->y); - r->infinity = 0; -} - -static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag) { - secp256k1_fe_storage_cmov(&r->x, &a->x, flag); - secp256k1_fe_storage_cmov(&r->y, &a->y, flag); -} - -#ifdef USE_ENDOMORPHISM -static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a) { - static const secp256k1_fe beta = SECP256K1_FE_CONST( - 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul, - 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul - ); - *r = *a; - secp256k1_fe_mul(&r->x, &r->x, &beta); -} -#endif - -static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a) { - secp256k1_fe yz; - - if (a->infinity) { - return 0; - } - - /* We rely on the fact that the Jacobi symbol of 1 / a->z^3 is the same as - * that of a->z. Thus a->y / a->z^3 is a quadratic residue iff a->y * a->z - is */ - secp256k1_fe_mul(&yz, &a->y, &a->z); - return secp256k1_fe_is_quad_var(&yz); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/hash.h b/external/libwally-core/src/secp256k1/src/hash.h deleted file mode 100644 index fca98cab9..000000000 --- a/external/libwally-core/src/secp256k1/src/hash.h +++ /dev/null @@ -1,41 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_HASH_ -#define _SECP256K1_HASH_ - -#include -#include - -typedef struct { - uint32_t s[8]; - uint32_t buf[16]; /* In big endian */ - size_t bytes; -} secp256k1_sha256_t; - -static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash); -static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t size); -static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32); - -typedef struct { - secp256k1_sha256_t inner, outer; -} secp256k1_hmac_sha256_t; - -static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t size); -static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size); -static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32); - -typedef struct { - unsigned char v[32]; - unsigned char k[32]; - int retry; -} secp256k1_rfc6979_hmac_sha256_t; - -static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen); -static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen); -static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/hash_impl.h b/external/libwally-core/src/secp256k1/src/hash_impl.h deleted file mode 100644 index b47e65f83..000000000 --- a/external/libwally-core/src/secp256k1/src/hash_impl.h +++ /dev/null @@ -1,281 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_HASH_IMPL_H_ -#define _SECP256K1_HASH_IMPL_H_ - -#include "hash.h" - -#include -#include -#include - -#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) -#define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) -#define Sigma0(x) (((x) >> 2 | (x) << 30) ^ ((x) >> 13 | (x) << 19) ^ ((x) >> 22 | (x) << 10)) -#define Sigma1(x) (((x) >> 6 | (x) << 26) ^ ((x) >> 11 | (x) << 21) ^ ((x) >> 25 | (x) << 7)) -#define sigma0(x) (((x) >> 7 | (x) << 25) ^ ((x) >> 18 | (x) << 14) ^ ((x) >> 3)) -#define sigma1(x) (((x) >> 17 | (x) << 15) ^ ((x) >> 19 | (x) << 13) ^ ((x) >> 10)) - -#define Round(a,b,c,d,e,f,g,h,k,w) do { \ - uint32_t t1 = (h) + Sigma1(e) + Ch((e), (f), (g)) + (k) + (w); \ - uint32_t t2 = Sigma0(a) + Maj((a), (b), (c)); \ - (d) += t1; \ - (h) = t1 + t2; \ -} while(0) - -#ifdef WORDS_BIGENDIAN -#define BE32(x) (x) -#else -#define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24)) -#endif - -static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash) { - hash->s[0] = 0x6a09e667ul; - hash->s[1] = 0xbb67ae85ul; - hash->s[2] = 0x3c6ef372ul; - hash->s[3] = 0xa54ff53aul; - hash->s[4] = 0x510e527ful; - hash->s[5] = 0x9b05688cul; - hash->s[6] = 0x1f83d9abul; - hash->s[7] = 0x5be0cd19ul; - hash->bytes = 0; -} - -/** Perform one SHA-256 transformation, processing 16 big endian 32-bit words. */ -static void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) { - uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7]; - uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15; - - Round(a, b, c, d, e, f, g, h, 0x428a2f98, w0 = BE32(chunk[0])); - Round(h, a, b, c, d, e, f, g, 0x71374491, w1 = BE32(chunk[1])); - Round(g, h, a, b, c, d, e, f, 0xb5c0fbcf, w2 = BE32(chunk[2])); - Round(f, g, h, a, b, c, d, e, 0xe9b5dba5, w3 = BE32(chunk[3])); - Round(e, f, g, h, a, b, c, d, 0x3956c25b, w4 = BE32(chunk[4])); - Round(d, e, f, g, h, a, b, c, 0x59f111f1, w5 = BE32(chunk[5])); - Round(c, d, e, f, g, h, a, b, 0x923f82a4, w6 = BE32(chunk[6])); - Round(b, c, d, e, f, g, h, a, 0xab1c5ed5, w7 = BE32(chunk[7])); - Round(a, b, c, d, e, f, g, h, 0xd807aa98, w8 = BE32(chunk[8])); - Round(h, a, b, c, d, e, f, g, 0x12835b01, w9 = BE32(chunk[9])); - Round(g, h, a, b, c, d, e, f, 0x243185be, w10 = BE32(chunk[10])); - Round(f, g, h, a, b, c, d, e, 0x550c7dc3, w11 = BE32(chunk[11])); - Round(e, f, g, h, a, b, c, d, 0x72be5d74, w12 = BE32(chunk[12])); - Round(d, e, f, g, h, a, b, c, 0x80deb1fe, w13 = BE32(chunk[13])); - Round(c, d, e, f, g, h, a, b, 0x9bdc06a7, w14 = BE32(chunk[14])); - Round(b, c, d, e, f, g, h, a, 0xc19bf174, w15 = BE32(chunk[15])); - - Round(a, b, c, d, e, f, g, h, 0xe49b69c1, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, c, d, e, f, g, 0xefbe4786, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, b, c, d, e, f, 0x0fc19dc6, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, a, b, c, d, e, 0x240ca1cc, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, h, a, b, c, d, 0x2de92c6f, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, g, h, a, b, c, 0x4a7484aa, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, f, g, h, a, b, 0x5cb0a9dc, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, e, f, g, h, a, 0x76f988da, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, d, e, f, g, h, 0x983e5152, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, c, d, e, f, g, 0xa831c66d, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, b, c, d, e, f, 0xb00327c8, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, a, b, c, d, e, 0xbf597fc7, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, h, a, b, c, d, 0xc6e00bf3, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, g, h, a, b, c, 0xd5a79147, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, f, g, h, a, b, 0x06ca6351, w14 += sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, e, f, g, h, a, 0x14292967, w15 += sigma1(w13) + w8 + sigma0(w0)); - - Round(a, b, c, d, e, f, g, h, 0x27b70a85, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, c, d, e, f, g, 0x2e1b2138, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, a, b, c, d, e, 0x53380d13, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, h, a, b, c, d, 0x650a7354, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, g, h, a, b, c, 0x766a0abb, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, f, g, h, a, b, 0x81c2c92e, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, e, f, g, h, a, 0x92722c85, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, c, d, e, f, g, 0xa81a664b, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, b, c, d, e, f, 0xc24b8b70, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, a, b, c, d, e, 0xc76c51a3, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, h, a, b, c, d, 0xd192e819, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, g, h, a, b, c, 0xd6990624, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, f, g, h, a, b, 0xf40e3585, w14 += sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, e, f, g, h, a, 0x106aa070, w15 += sigma1(w13) + w8 + sigma0(w0)); - - Round(a, b, c, d, e, f, g, h, 0x19a4c116, w0 += sigma1(w14) + w9 + sigma0(w1)); - Round(h, a, b, c, d, e, f, g, 0x1e376c08, w1 += sigma1(w15) + w10 + sigma0(w2)); - Round(g, h, a, b, c, d, e, f, 0x2748774c, w2 += sigma1(w0) + w11 + sigma0(w3)); - Round(f, g, h, a, b, c, d, e, 0x34b0bcb5, w3 += sigma1(w1) + w12 + sigma0(w4)); - Round(e, f, g, h, a, b, c, d, 0x391c0cb3, w4 += sigma1(w2) + w13 + sigma0(w5)); - Round(d, e, f, g, h, a, b, c, 0x4ed8aa4a, w5 += sigma1(w3) + w14 + sigma0(w6)); - Round(c, d, e, f, g, h, a, b, 0x5b9cca4f, w6 += sigma1(w4) + w15 + sigma0(w7)); - Round(b, c, d, e, f, g, h, a, 0x682e6ff3, w7 += sigma1(w5) + w0 + sigma0(w8)); - Round(a, b, c, d, e, f, g, h, 0x748f82ee, w8 += sigma1(w6) + w1 + sigma0(w9)); - Round(h, a, b, c, d, e, f, g, 0x78a5636f, w9 += sigma1(w7) + w2 + sigma0(w10)); - Round(g, h, a, b, c, d, e, f, 0x84c87814, w10 += sigma1(w8) + w3 + sigma0(w11)); - Round(f, g, h, a, b, c, d, e, 0x8cc70208, w11 += sigma1(w9) + w4 + sigma0(w12)); - Round(e, f, g, h, a, b, c, d, 0x90befffa, w12 += sigma1(w10) + w5 + sigma0(w13)); - Round(d, e, f, g, h, a, b, c, 0xa4506ceb, w13 += sigma1(w11) + w6 + sigma0(w14)); - Round(c, d, e, f, g, h, a, b, 0xbef9a3f7, w14 + sigma1(w12) + w7 + sigma0(w15)); - Round(b, c, d, e, f, g, h, a, 0xc67178f2, w15 + sigma1(w13) + w8 + sigma0(w0)); - - s[0] += a; - s[1] += b; - s[2] += c; - s[3] += d; - s[4] += e; - s[5] += f; - s[6] += g; - s[7] += h; -} - -static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t len) { - size_t bufsize = hash->bytes & 0x3F; - hash->bytes += len; - while (bufsize + len >= 64) { - /* Fill the buffer, and process it. */ - memcpy(((unsigned char*)hash->buf) + bufsize, data, 64 - bufsize); - data += 64 - bufsize; - len -= 64 - bufsize; - secp256k1_sha256_transform(hash->s, hash->buf); - bufsize = 0; - } - if (len) { - /* Fill the buffer with what remains. */ - memcpy(((unsigned char*)hash->buf) + bufsize, data, len); - } -} - -static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32) { - static const unsigned char pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - uint32_t sizedesc[2]; - uint32_t out[8]; - int i = 0; - sizedesc[0] = BE32(hash->bytes >> 29); - sizedesc[1] = BE32(hash->bytes << 3); - secp256k1_sha256_write(hash, pad, 1 + ((119 - (hash->bytes % 64)) % 64)); - secp256k1_sha256_write(hash, (const unsigned char*)sizedesc, 8); - for (i = 0; i < 8; i++) { - out[i] = BE32(hash->s[i]); - hash->s[i] = 0; - } - memcpy(out32, (const unsigned char*)out, 32); -} - -static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t keylen) { - int n; - unsigned char rkey[64]; - if (keylen <= 64) { - memcpy(rkey, key, keylen); - memset(rkey + keylen, 0, 64 - keylen); - } else { - secp256k1_sha256_t sha256; - secp256k1_sha256_initialize(&sha256); - secp256k1_sha256_write(&sha256, key, keylen); - secp256k1_sha256_finalize(&sha256, rkey); - memset(rkey + 32, 0, 32); - } - - secp256k1_sha256_initialize(&hash->outer); - for (n = 0; n < 64; n++) { - rkey[n] ^= 0x5c; - } - secp256k1_sha256_write(&hash->outer, rkey, 64); - - secp256k1_sha256_initialize(&hash->inner); - for (n = 0; n < 64; n++) { - rkey[n] ^= 0x5c ^ 0x36; - } - secp256k1_sha256_write(&hash->inner, rkey, 64); - memset(rkey, 0, 64); -} - -static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size) { - secp256k1_sha256_write(&hash->inner, data, size); -} - -static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32) { - unsigned char temp[32]; - secp256k1_sha256_finalize(&hash->inner, temp); - secp256k1_sha256_write(&hash->outer, temp, 32); - memset(temp, 0, 32); - secp256k1_sha256_finalize(&hash->outer, out32); -} - - -static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen) { - secp256k1_hmac_sha256_t hmac; - static const unsigned char zero[1] = {0x00}; - static const unsigned char one[1] = {0x01}; - - memset(rng->v, 0x01, 32); /* RFC6979 3.2.b. */ - memset(rng->k, 0x00, 32); /* RFC6979 3.2.c. */ - - /* RFC6979 3.2.d. */ - secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); - secp256k1_hmac_sha256_write(&hmac, rng->v, 32); - secp256k1_hmac_sha256_write(&hmac, zero, 1); - secp256k1_hmac_sha256_write(&hmac, key, keylen); - secp256k1_hmac_sha256_finalize(&hmac, rng->k); - secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); - secp256k1_hmac_sha256_write(&hmac, rng->v, 32); - secp256k1_hmac_sha256_finalize(&hmac, rng->v); - - /* RFC6979 3.2.f. */ - secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); - secp256k1_hmac_sha256_write(&hmac, rng->v, 32); - secp256k1_hmac_sha256_write(&hmac, one, 1); - secp256k1_hmac_sha256_write(&hmac, key, keylen); - secp256k1_hmac_sha256_finalize(&hmac, rng->k); - secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); - secp256k1_hmac_sha256_write(&hmac, rng->v, 32); - secp256k1_hmac_sha256_finalize(&hmac, rng->v); - rng->retry = 0; -} - -static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen) { - /* RFC6979 3.2.h. */ - static const unsigned char zero[1] = {0x00}; - if (rng->retry) { - secp256k1_hmac_sha256_t hmac; - secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); - secp256k1_hmac_sha256_write(&hmac, rng->v, 32); - secp256k1_hmac_sha256_write(&hmac, zero, 1); - secp256k1_hmac_sha256_finalize(&hmac, rng->k); - secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); - secp256k1_hmac_sha256_write(&hmac, rng->v, 32); - secp256k1_hmac_sha256_finalize(&hmac, rng->v); - } - - while (outlen > 0) { - secp256k1_hmac_sha256_t hmac; - int now = outlen; - secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); - secp256k1_hmac_sha256_write(&hmac, rng->v, 32); - secp256k1_hmac_sha256_finalize(&hmac, rng->v); - if (now > 32) { - now = 32; - } - memcpy(out, rng->v, now); - out += now; - outlen -= now; - } - - rng->retry = 1; -} - -static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng) { - memset(rng->k, 0, 32); - memset(rng->v, 0, 32); - rng->retry = 0; -} - -#undef BE32 -#undef Round -#undef sigma1 -#undef sigma0 -#undef Sigma1 -#undef Sigma0 -#undef Maj -#undef Ch - -#endif diff --git a/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java b/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java deleted file mode 100644 index be67048fb..000000000 --- a/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java +++ /dev/null @@ -1,478 +0,0 @@ -/* - * Copyright 2013 Google Inc. - * Copyright 2014-2016 the libsecp256k1 contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.bitcoin; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -import java.math.BigInteger; -import com.google.common.base.Preconditions; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import static org.bitcoin.NativeSecp256k1Util.*; - -/** - *

This class holds native methods to handle ECDSA verification.

- * - *

You can find an example library that can be used for this at https://github.com/bitcoin/secp256k1

- * - *

To build secp256k1 for use with bitcoinj, run - * `./configure --enable-jni --enable-experimental --enable-module-schnorr --enable-module-ecdh` - * and `make` then copy `.libs/libsecp256k1.so` to your system library path - * or point the JVM to the folder containing it with -Djava.library.path - *

- */ -public class NativeSecp256k1 { - - private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); - private static final Lock r = rwl.readLock(); - private static final Lock w = rwl.writeLock(); - private static ThreadLocal nativeECDSABuffer = new ThreadLocal(); - /** - * Verifies the given secp256k1 signature in native code. - * Calling when enabled == false is undefined (probably library not loaded) - * - * @param data The data which was signed, must be exactly 32 bytes - * @param signature The signature - * @param pub The public key which did the signing - */ - public static boolean verify(byte[] data, byte[] signature, byte[] pub) throws AssertFailException{ - Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < 520) { - byteBuff = ByteBuffer.allocateDirect(520); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(data); - byteBuff.put(signature); - byteBuff.put(pub); - - byte[][] retByteArray; - - r.lock(); - try { - return secp256k1_ecdsa_verify(byteBuff, Secp256k1Context.getContext(), signature.length, pub.length) == 1; - } finally { - r.unlock(); - } - } - - /** - * libsecp256k1 Create an ECDSA signature. - * - * @param data Message hash, 32 bytes - * @param key Secret key, 32 bytes - * - * Return values - * @param sig byte array of signature - */ - public static byte[] sign(byte[] data, byte[] sec) throws AssertFailException{ - Preconditions.checkArgument(data.length == 32 && sec.length <= 32); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < 32 + 32) { - byteBuff = ByteBuffer.allocateDirect(32 + 32); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(data); - byteBuff.put(sec); - - byte[][] retByteArray; - - r.lock(); - try { - retByteArray = secp256k1_ecdsa_sign(byteBuff, Secp256k1Context.getContext()); - } finally { - r.unlock(); - } - - byte[] sigArr = retByteArray[0]; - int sigLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); - int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); - - assertEquals(sigArr.length, sigLen, "Got bad signature length."); - - return retVal == 0 ? new byte[0] : sigArr; - } - - /** - * libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid - * - * @param seckey ECDSA Secret key, 32 bytes - */ - public static boolean secKeyVerify(byte[] seckey) { - Preconditions.checkArgument(seckey.length == 32); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < seckey.length) { - byteBuff = ByteBuffer.allocateDirect(seckey.length); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(seckey); - - r.lock(); - try { - return secp256k1_ec_seckey_verify(byteBuff,Secp256k1Context.getContext()) == 1; - } finally { - r.unlock(); - } - } - - - /** - * libsecp256k1 Compute Pubkey - computes public key from secret key - * - * @param seckey ECDSA Secret key, 32 bytes - * - * Return values - * @param pubkey ECDSA Public key, 33 or 65 bytes - */ - //TODO add a 'compressed' arg - public static byte[] computePubkey(byte[] seckey) throws AssertFailException{ - Preconditions.checkArgument(seckey.length == 32); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < seckey.length) { - byteBuff = ByteBuffer.allocateDirect(seckey.length); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(seckey); - - byte[][] retByteArray; - - r.lock(); - try { - retByteArray = secp256k1_ec_pubkey_create(byteBuff, Secp256k1Context.getContext()); - } finally { - r.unlock(); - } - - byte[] pubArr = retByteArray[0]; - int pubLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); - int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); - - assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); - - return retVal == 0 ? new byte[0]: pubArr; - } - - /** - * libsecp256k1 Cleanup - This destroys the secp256k1 context object - * This should be called at the end of the program for proper cleanup of the context. - */ - public static synchronized void cleanup() { - w.lock(); - try { - secp256k1_destroy_context(Secp256k1Context.getContext()); - } finally { - w.unlock(); - } - } - - public static long cloneContext() { - r.lock(); - try { - return secp256k1_ctx_clone(Secp256k1Context.getContext()); - } finally { r.unlock(); } - } - - /** - * libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it - * - * @param tweak some bytes to tweak with - * @param seckey 32-byte seckey - */ - public static byte[] privKeyTweakMul(byte[] privkey, byte[] tweak) throws AssertFailException{ - Preconditions.checkArgument(privkey.length == 32); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { - byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(privkey); - byteBuff.put(tweak); - - byte[][] retByteArray; - r.lock(); - try { - retByteArray = secp256k1_privkey_tweak_mul(byteBuff,Secp256k1Context.getContext()); - } finally { - r.unlock(); - } - - byte[] privArr = retByteArray[0]; - - int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; - int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); - - assertEquals(privArr.length, privLen, "Got bad pubkey length."); - - assertEquals(retVal, 1, "Failed return value check."); - - return privArr; - } - - /** - * libsecp256k1 PrivKey Tweak-Add - Tweak privkey by adding to it - * - * @param tweak some bytes to tweak with - * @param seckey 32-byte seckey - */ - public static byte[] privKeyTweakAdd(byte[] privkey, byte[] tweak) throws AssertFailException{ - Preconditions.checkArgument(privkey.length == 32); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { - byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(privkey); - byteBuff.put(tweak); - - byte[][] retByteArray; - r.lock(); - try { - retByteArray = secp256k1_privkey_tweak_add(byteBuff,Secp256k1Context.getContext()); - } finally { - r.unlock(); - } - - byte[] privArr = retByteArray[0]; - - int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; - int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); - - assertEquals(privArr.length, privLen, "Got bad pubkey length."); - - assertEquals(retVal, 1, "Failed return value check."); - - return privArr; - } - - /** - * libsecp256k1 PubKey Tweak-Add - Tweak pubkey by adding to it - * - * @param tweak some bytes to tweak with - * @param pubkey 32-byte seckey - */ - public static byte[] pubKeyTweakAdd(byte[] pubkey, byte[] tweak) throws AssertFailException{ - Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { - byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(pubkey); - byteBuff.put(tweak); - - byte[][] retByteArray; - r.lock(); - try { - retByteArray = secp256k1_pubkey_tweak_add(byteBuff,Secp256k1Context.getContext(), pubkey.length); - } finally { - r.unlock(); - } - - byte[] pubArr = retByteArray[0]; - - int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; - int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); - - assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); - - assertEquals(retVal, 1, "Failed return value check."); - - return pubArr; - } - - /** - * libsecp256k1 PubKey Tweak-Mul - Tweak pubkey by multiplying to it - * - * @param tweak some bytes to tweak with - * @param pubkey 32-byte seckey - */ - public static byte[] pubKeyTweakMul(byte[] pubkey, byte[] tweak) throws AssertFailException{ - Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { - byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(pubkey); - byteBuff.put(tweak); - - byte[][] retByteArray; - r.lock(); - try { - retByteArray = secp256k1_pubkey_tweak_mul(byteBuff,Secp256k1Context.getContext(), pubkey.length); - } finally { - r.unlock(); - } - - byte[] pubArr = retByteArray[0]; - - int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; - int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); - - assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); - - assertEquals(retVal, 1, "Failed return value check."); - - return pubArr; - } - - /** - * libsecp256k1 create ECDH secret - constant time ECDH calculation - * - * @param seckey byte array of secret key used in exponentiaion - * @param pubkey byte array of public key used in exponentiaion - */ - public static byte[] createECDHSecret(byte[] seckey, byte[] pubkey) throws AssertFailException{ - Preconditions.checkArgument(seckey.length <= 32 && pubkey.length <= 65); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < 32 + pubkey.length) { - byteBuff = ByteBuffer.allocateDirect(32 + pubkey.length); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(seckey); - byteBuff.put(pubkey); - - byte[][] retByteArray; - r.lock(); - try { - retByteArray = secp256k1_ecdh(byteBuff, Secp256k1Context.getContext(), pubkey.length); - } finally { - r.unlock(); - } - - byte[] resArr = retByteArray[0]; - int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); - - assertEquals(resArr.length, 32, "Got bad result length."); - assertEquals(retVal, 1, "Failed return value check."); - - return resArr; - } - - /** - * libsecp256k1 randomize - updates the context randomization - * - * @param seed 32-byte random seed - */ - public static synchronized boolean randomize(byte[] seed) throws AssertFailException{ - Preconditions.checkArgument(seed.length == 32 || seed == null); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null || byteBuff.capacity() < seed.length) { - byteBuff = ByteBuffer.allocateDirect(seed.length); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(seed); - - w.lock(); - try { - return secp256k1_context_randomize(byteBuff, Secp256k1Context.getContext()) == 1; - } finally { - w.unlock(); - } - } - - public static byte[] schnorrSign(byte[] data, byte[] sec) throws AssertFailException { - Preconditions.checkArgument(data.length == 32 && sec.length <= 32); - - ByteBuffer byteBuff = nativeECDSABuffer.get(); - if (byteBuff == null) { - byteBuff = ByteBuffer.allocateDirect(32 + 32); - byteBuff.order(ByteOrder.nativeOrder()); - nativeECDSABuffer.set(byteBuff); - } - byteBuff.rewind(); - byteBuff.put(data); - byteBuff.put(sec); - - byte[][] retByteArray; - - r.lock(); - try { - retByteArray = secp256k1_schnorr_sign(byteBuff, Secp256k1Context.getContext()); - } finally { - r.unlock(); - } - - byte[] sigArr = retByteArray[0]; - int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); - - assertEquals(sigArr.length, 64, "Got bad signature length."); - - return retVal == 0 ? new byte[0] : sigArr; - } - - private static native long secp256k1_ctx_clone(long context); - - private static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context); - - private static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context); - - private static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context); - - private static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen); - - private static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen); - - private static native void secp256k1_destroy_context(long context); - - private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen); - - private static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, long context); - - private static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context); - - private static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, long context); - - private static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen); - - private static native byte[][] secp256k1_schnorr_sign(ByteBuffer byteBuff, long context); - - private static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen); - -} diff --git a/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java b/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java deleted file mode 100644 index f18ce9581..000000000 --- a/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java +++ /dev/null @@ -1,247 +0,0 @@ -package org.bitcoin; - -import com.google.common.io.BaseEncoding; -import java.util.Arrays; -import java.math.BigInteger; -import javax.xml.bind.DatatypeConverter; -import static org.bitcoin.NativeSecp256k1Util.*; - -/** - * This class holds test cases defined for testing this library. - */ -public class NativeSecp256k1Test { - - //TODO improve comments/add more tests - /** - * This tests verify() for a valid signature - */ - public static void testVerifyPos() throws AssertFailException{ - boolean result = false; - byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" - byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); - byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); - - result = NativeSecp256k1.verify( data, sig, pub); - assertEquals( result, true , "testVerifyPos"); - } - - /** - * This tests verify() for a non-valid signature - */ - public static void testVerifyNeg() throws AssertFailException{ - boolean result = false; - byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91".toLowerCase()); //sha256hash of "testing" - byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); - byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); - - result = NativeSecp256k1.verify( data, sig, pub); - //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); - assertEquals( result, false , "testVerifyNeg"); - } - - /** - * This tests secret key verify() for a valid secretkey - */ - public static void testSecKeyVerifyPos() throws AssertFailException{ - boolean result = false; - byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); - - result = NativeSecp256k1.secKeyVerify( sec ); - //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); - assertEquals( result, true , "testSecKeyVerifyPos"); - } - - /** - * This tests secret key verify() for a invalid secretkey - */ - public static void testSecKeyVerifyNeg() throws AssertFailException{ - boolean result = false; - byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); - - result = NativeSecp256k1.secKeyVerify( sec ); - //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); - assertEquals( result, false , "testSecKeyVerifyNeg"); - } - - /** - * This tests public key create() for a valid secretkey - */ - public static void testPubKeyCreatePos() throws AssertFailException{ - byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); - - byte[] resultArr = NativeSecp256k1.computePubkey( sec); - String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( pubkeyString , "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6" , "testPubKeyCreatePos"); - } - - /** - * This tests public key create() for a invalid secretkey - */ - public static void testPubKeyCreateNeg() throws AssertFailException{ - byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); - - byte[] resultArr = NativeSecp256k1.computePubkey( sec); - String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( pubkeyString, "" , "testPubKeyCreateNeg"); - } - - /** - * This tests sign() for a valid secretkey - */ - public static void testSignPos() throws AssertFailException{ - - byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" - byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); - - byte[] resultArr = NativeSecp256k1.sign(data, sec); - String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( sigString, "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9" , "testSignPos"); - } - - /** - * This tests sign() for a invalid secretkey - */ - public static void testSignNeg() throws AssertFailException{ - byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" - byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); - - byte[] resultArr = NativeSecp256k1.sign(data, sec); - String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( sigString, "" , "testSignNeg"); - } - - /** - * This tests private key tweak-add - */ - public static void testPrivKeyTweakAdd_1() throws AssertFailException { - byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); - byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" - - byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data ); - String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( sigString , "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3" , "testPrivKeyAdd_1"); - } - - /** - * This tests private key tweak-mul - */ - public static void testPrivKeyTweakMul_1() throws AssertFailException { - byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); - byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" - - byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data ); - String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( sigString , "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC" , "testPrivKeyMul_1"); - } - - /** - * This tests private key tweak-add uncompressed - */ - public static void testPrivKeyTweakAdd_2() throws AssertFailException { - byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); - byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" - - byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data ); - String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( sigString , "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF" , "testPrivKeyAdd_2"); - } - - /** - * This tests private key tweak-mul uncompressed - */ - public static void testPrivKeyTweakMul_2() throws AssertFailException { - byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); - byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" - - byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data ); - String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( sigString , "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589" , "testPrivKeyMul_2"); - } - - /** - * This tests seed randomization - */ - public static void testRandomize() throws AssertFailException { - byte[] seed = BaseEncoding.base16().lowerCase().decode("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11".toLowerCase()); //sha256hash of "random" - boolean result = NativeSecp256k1.randomize(seed); - assertEquals( result, true, "testRandomize"); - } - - /** - * This tests signSchnorr() for a valid secretkey - */ - public static void testSchnorrSign() throws AssertFailException{ - - byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" - byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); - - byte[] resultArr = NativeSecp256k1.schnorrSign(data, sec); - String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( sigString, "C5E929AA058B982048760422D3B563749B7D0E50C5EBD8CD2FFC23214BD6A2F1B072C13880997EBA847CF20F2F90FCE07C1CA33A890A4127095A351127F8D95F" , "testSchnorrSign"); - } - - /** - * This tests signSchnorr() for a valid secretkey - */ - public static void testCreateECDHSecret() throws AssertFailException{ - - byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); - byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); - - byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub); - String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); - assertEquals( ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043" , "testCreateECDHSecret"); - } - - public static void main(String[] args) throws AssertFailException{ - - - System.out.println("\n libsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n"); - - assertEquals( Secp256k1Context.isEnabled(), true, "isEnabled" ); - - //Test verify() success/fail - testVerifyPos(); - testVerifyNeg(); - - //Test secKeyVerify() success/fail - testSecKeyVerifyPos(); - testSecKeyVerifyNeg(); - - //Test computePubkey() success/fail - testPubKeyCreatePos(); - testPubKeyCreateNeg(); - - //Test sign() success/fail - testSignPos(); - testSignNeg(); - - //Test Schnorr (partial support) //TODO - testSchnorrSign(); - //testSchnorrVerify - //testSchnorrRecovery - - //Test privKeyTweakAdd() 1 - testPrivKeyTweakAdd_1(); - - //Test privKeyTweakMul() 2 - testPrivKeyTweakMul_1(); - - //Test privKeyTweakAdd() 3 - testPrivKeyTweakAdd_2(); - - //Test privKeyTweakMul() 4 - testPrivKeyTweakMul_2(); - - //Test randomize() - testRandomize(); - - //Test ECDH - testCreateECDHSecret(); - - NativeSecp256k1.cleanup(); - - System.out.println(" All tests passed." ); - - } -} diff --git a/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java b/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java deleted file mode 100644 index 04732ba04..000000000 --- a/external/libwally-core/src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2014-2016 the libsecp256k1 contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.bitcoin; - -public class NativeSecp256k1Util{ - - public static void assertEquals( int val, int val2, String message ) throws AssertFailException{ - if( val != val2 ) - throw new AssertFailException("FAIL: " + message); - } - - public static void assertEquals( boolean val, boolean val2, String message ) throws AssertFailException{ - if( val != val2 ) - throw new AssertFailException("FAIL: " + message); - else - System.out.println("PASS: " + message); - } - - public static void assertEquals( String val, String val2, String message ) throws AssertFailException{ - if( !val.equals(val2) ) - throw new AssertFailException("FAIL: " + message); - else - System.out.println("PASS: " + message); - } - - public static class AssertFailException extends Exception { - public AssertFailException(String message) { - super( message ); - } - } -} diff --git a/external/libwally-core/src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java b/external/libwally-core/src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java deleted file mode 100644 index 216c986a8..000000000 --- a/external/libwally-core/src/secp256k1/src/java/org/bitcoin/Secp256k1Context.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2014-2016 the libsecp256k1 contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.bitcoin; - -/** - * This class holds the context reference used in native methods - * to handle ECDSA operations. - */ -public class Secp256k1Context { - private static final boolean enabled; //true if the library is loaded - private static final long context; //ref to pointer to context obj - - static { //static initializer - boolean isEnabled = true; - long contextRef = -1; - try { - System.loadLibrary("secp256k1"); - contextRef = secp256k1_init_context(); - } catch (UnsatisfiedLinkError e) { - System.out.println("UnsatisfiedLinkError: " + e.toString()); - isEnabled = false; - } - enabled = isEnabled; - context = contextRef; - } - - public static boolean isEnabled() { - return enabled; - } - - public static long getContext() { - if(!enabled) return -1; //sanity check - return context; - } - - private static native long secp256k1_init_context(); -} diff --git a/external/libwally-core/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c b/external/libwally-core/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c deleted file mode 100644 index dba9524dd..000000000 --- a/external/libwally-core/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c +++ /dev/null @@ -1,411 +0,0 @@ -#include -#include -#include -#include "org_bitcoin_NativeSecp256k1.h" -#include "include/secp256k1.h" -#include "include/secp256k1_ecdh.h" -#include "include/secp256k1_recovery.h" -#include "include/secp256k1_schnorr.h" - - -SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone - (JNIEnv* env, jclass classObject, jlong ctx_l) -{ - const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - - jlong ctx_clone_l = (uintptr_t) secp256k1_context_clone(ctx); - - (void)classObject;(void)env; - - return ctx_clone_l; - -} - -SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - - const unsigned char* seed = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - - (void)classObject; - - return secp256k1_context_randomize(ctx, seed); - -} - -SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context - (JNIEnv* env, jclass classObject, jlong ctx_l) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - - secp256k1_context_destroy(ctx); - - (void)classObject;(void)env; -} - -SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - - unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - const unsigned char* sigdata = { (unsigned char*) (data + 32) }; - const unsigned char* pubdata = { (unsigned char*) (data + siglen + 32) }; - - secp256k1_ecdsa_signature sig; - secp256k1_pubkey pubkey; - - int ret = secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigdata, siglen); - - if( ret ) { - ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); - - if( ret ) { - ret = secp256k1_ecdsa_verify(ctx, &sig, data, &pubkey); - } - } - - (void)classObject; - - return ret; -} - -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - unsigned char* secKey = (unsigned char*) (data + 32); - - jobjectArray retArray; - jbyteArray sigArray, intsByteArray; - unsigned char intsarray[2]; - - secp256k1_ecdsa_signature sig[72]; - - int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL ); - - unsigned char outputSer[72]; - size_t outputLen = 72; - - if( ret ) { - int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2; - } - - intsarray[0] = outputLen; - intsarray[1] = ret; - - retArray = (*env)->NewObjectArray(env, 2, - (*env)->FindClass(env, "[B"), - (*env)->NewByteArray(env, 1)); - - sigArray = (*env)->NewByteArray(env, outputLen); - (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer); - (*env)->SetObjectArrayElement(env, retArray, 0, sigArray); - - intsByteArray = (*env)->NewByteArray(env, 2); - (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); - (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); - - (void)classObject; - - return retArray; -} - -SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - - (void)classObject; - - return secp256k1_ec_seckey_verify(ctx, secKey); -} - -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - const unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - - secp256k1_pubkey pubkey; - - jobjectArray retArray; - jbyteArray pubkeyArray, intsByteArray; - unsigned char intsarray[2]; - - int ret = secp256k1_ec_pubkey_create(ctx, &pubkey, secKey); - - unsigned char outputSer[65]; - size_t outputLen = 65; - - if( ret ) { - int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; - } - - intsarray[0] = outputLen; - intsarray[1] = ret; - - retArray = (*env)->NewObjectArray(env, 2, - (*env)->FindClass(env, "[B"), - (*env)->NewByteArray(env, 1)); - - pubkeyArray = (*env)->NewByteArray(env, outputLen); - (*env)->SetByteArrayRegion(env, pubkeyArray, 0, outputLen, (jbyte*)outputSer); - (*env)->SetObjectArrayElement(env, retArray, 0, pubkeyArray); - - intsByteArray = (*env)->NewByteArray(env, 2); - (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); - (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); - - (void)classObject; - - return retArray; - -} - -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - const unsigned char* tweak = (unsigned char*) (privkey + 32); - - jobjectArray retArray; - jbyteArray privArray, intsByteArray; - unsigned char intsarray[2]; - - int privkeylen = 32; - - int ret = secp256k1_ec_privkey_tweak_add(ctx, privkey, tweak); - - intsarray[0] = privkeylen; - intsarray[1] = ret; - - retArray = (*env)->NewObjectArray(env, 2, - (*env)->FindClass(env, "[B"), - (*env)->NewByteArray(env, 1)); - - privArray = (*env)->NewByteArray(env, privkeylen); - (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); - (*env)->SetObjectArrayElement(env, retArray, 0, privArray); - - intsByteArray = (*env)->NewByteArray(env, 2); - (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); - (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); - - (void)classObject; - - return retArray; -} - -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - const unsigned char* tweak = (unsigned char*) (privkey + 32); - - jobjectArray retArray; - jbyteArray privArray, intsByteArray; - unsigned char intsarray[2]; - - int privkeylen = 32; - - int ret = secp256k1_ec_privkey_tweak_mul(ctx, privkey, tweak); - - intsarray[0] = privkeylen; - intsarray[1] = ret; - - retArray = (*env)->NewObjectArray(env, 2, - (*env)->FindClass(env, "[B"), - (*env)->NewByteArray(env, 1)); - - privArray = (*env)->NewByteArray(env, privkeylen); - (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); - (*env)->SetObjectArrayElement(env, retArray, 0, privArray); - - intsByteArray = (*env)->NewByteArray(env, 2); - (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); - (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); - - (void)classObject; - - return retArray; -} - -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; -/* secp256k1_pubkey* pubkey = (secp256k1_pubkey*) (*env)->GetDirectBufferAddress(env, byteBufferObject);*/ - unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); - const unsigned char* tweak = (unsigned char*) (pkey + publen); - - jobjectArray retArray; - jbyteArray pubArray, intsByteArray; - unsigned char intsarray[2]; - unsigned char outputSer[65]; - size_t outputLen = 65; - - secp256k1_pubkey pubkey; - int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); - - if( ret ) { - ret = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, tweak); - } - - if( ret ) { - int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; - } - - intsarray[0] = outputLen; - intsarray[1] = ret; - - retArray = (*env)->NewObjectArray(env, 2, - (*env)->FindClass(env, "[B"), - (*env)->NewByteArray(env, 1)); - - pubArray = (*env)->NewByteArray(env, outputLen); - (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); - (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); - - intsByteArray = (*env)->NewByteArray(env, 2); - (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); - (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); - - (void)classObject; - - return retArray; -} - -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); - const unsigned char* tweak = (unsigned char*) (pkey + publen); - - jobjectArray retArray; - jbyteArray pubArray, intsByteArray; - unsigned char intsarray[2]; - unsigned char outputSer[65]; - size_t outputLen = 65; - - secp256k1_pubkey pubkey; - int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); - - if ( ret ) { - ret = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, tweak); - } - - if( ret ) { - int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; - } - - intsarray[0] = outputLen; - intsarray[1] = ret; - - retArray = (*env)->NewObjectArray(env, 2, - (*env)->FindClass(env, "[B"), - (*env)->NewByteArray(env, 1)); - - pubArray = (*env)->NewByteArray(env, outputLen); - (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); - (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); - - intsByteArray = (*env)->NewByteArray(env, 2); - (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); - (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); - - (void)classObject; - - return retArray; -} - -SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1pubkey_1combine - (JNIEnv * env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint numkeys) -{ - (void)classObject;(void)env;(void)byteBufferObject;(void)ctx_l;(void)numkeys; - - return 0; -} - -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1schnorr_1sign - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); - unsigned char* secKey = (unsigned char*) (data + 32); - - jobjectArray retArray; - jbyteArray sigArray, intsByteArray; - unsigned char intsarray[1]; - unsigned char sig[64]; - - int ret = secp256k1_schnorr_sign(ctx, sig, data, secKey, NULL, NULL); - - intsarray[0] = ret; - - retArray = (*env)->NewObjectArray(env, 2, - (*env)->FindClass(env, "[B"), - (*env)->NewByteArray(env, 1)); - - sigArray = (*env)->NewByteArray(env, 64); - (*env)->SetByteArrayRegion(env, sigArray, 0, 64, (jbyte*)sig); - (*env)->SetObjectArrayElement(env, retArray, 0, sigArray); - - intsByteArray = (*env)->NewByteArray(env, 1); - (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray); - (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); - - (void)classObject; - - return retArray; -} - -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) -{ - secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; - const unsigned char* secdata = (*env)->GetDirectBufferAddress(env, byteBufferObject); - const unsigned char* pubdata = (const unsigned char*) (secdata + 32); - - jobjectArray retArray; - jbyteArray outArray, intsByteArray; - unsigned char intsarray[1]; - secp256k1_pubkey pubkey; - unsigned char nonce_res[32]; - size_t outputLen = 32; - - int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); - - if (ret) { - ret = secp256k1_ecdh( - ctx, - nonce_res, - &pubkey, - secdata - ); - } - - intsarray[0] = ret; - - retArray = (*env)->NewObjectArray(env, 2, - (*env)->FindClass(env, "[B"), - (*env)->NewByteArray(env, 1)); - - outArray = (*env)->NewByteArray(env, outputLen); - (*env)->SetByteArrayRegion(env, outArray, 0, 32, (jbyte*)nonce_res); - (*env)->SetObjectArrayElement(env, retArray, 0, outArray); - - intsByteArray = (*env)->NewByteArray(env, 1); - (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray); - (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); - - (void)classObject; - - return retArray; -} diff --git a/external/libwally-core/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h b/external/libwally-core/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h deleted file mode 100644 index 4125a1f52..000000000 --- a/external/libwally-core/src/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h +++ /dev/null @@ -1,127 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -#include "include/secp256k1.h" -/* Header for class org_bitcoin_NativeSecp256k1 */ - -#ifndef _Included_org_bitcoin_NativeSecp256k1 -#define _Included_org_bitcoin_NativeSecp256k1 -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ctx_clone - * Signature: (J)J - */ -SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone - (JNIEnv *, jclass, jlong); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_context_randomize - * Signature: (Ljava/nio/ByteBuffer;J)I - */ -SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize - (JNIEnv *, jclass, jobject, jlong); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_privkey_tweak_add - * Signature: (Ljava/nio/ByteBuffer;J)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add - (JNIEnv *, jclass, jobject, jlong); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_privkey_tweak_mul - * Signature: (Ljava/nio/ByteBuffer;J)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul - (JNIEnv *, jclass, jobject, jlong); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_pubkey_tweak_add - * Signature: (Ljava/nio/ByteBuffer;JI)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add - (JNIEnv *, jclass, jobject, jlong, jint); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_pubkey_tweak_mul - * Signature: (Ljava/nio/ByteBuffer;JI)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul - (JNIEnv *, jclass, jobject, jlong, jint); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_destroy_context - * Signature: (J)V - */ -SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context - (JNIEnv *, jclass, jlong); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ecdsa_verify - * Signature: (Ljava/nio/ByteBuffer;JII)I - */ -SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify - (JNIEnv *, jclass, jobject, jlong, jint, jint); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ecdsa_sign - * Signature: (Ljava/nio/ByteBuffer;J)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign - (JNIEnv *, jclass, jobject, jlong); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ec_seckey_verify - * Signature: (Ljava/nio/ByteBuffer;J)I - */ -SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify - (JNIEnv *, jclass, jobject, jlong); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ec_pubkey_create - * Signature: (Ljava/nio/ByteBuffer;J)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create - (JNIEnv *, jclass, jobject, jlong); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ec_pubkey_parse - * Signature: (Ljava/nio/ByteBuffer;JI)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse - (JNIEnv *, jclass, jobject, jlong, jint); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_schnorr_sign - * Signature: (Ljava/nio/ByteBuffer;JI)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1schnorr_1sign - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l); - -/* - * Class: org_bitcoin_NativeSecp256k1 - * Method: secp256k1_ecdh - * Signature: (Ljava/nio/ByteBuffer;JI)[[B - */ -SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh - (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen); - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/external/libwally-core/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c b/external/libwally-core/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c deleted file mode 100644 index a52939e7e..000000000 --- a/external/libwally-core/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include -#include "org_bitcoin_Secp256k1Context.h" -#include "include/secp256k1.h" - -SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context - (JNIEnv* env, jclass classObject) -{ - secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - - (void)classObject;(void)env; - - return (uintptr_t)ctx; -} - diff --git a/external/libwally-core/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h b/external/libwally-core/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h deleted file mode 100644 index 0d2bc84b7..000000000 --- a/external/libwally-core/src/secp256k1/src/java/org_bitcoin_Secp256k1Context.h +++ /dev/null @@ -1,22 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -#include "include/secp256k1.h" -/* Header for class org_bitcoin_Secp256k1Context */ - -#ifndef _Included_org_bitcoin_Secp256k1Context -#define _Included_org_bitcoin_Secp256k1Context -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: org_bitcoin_Secp256k1Context - * Method: secp256k1_init_context - * Signature: ()J - */ -SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context - (JNIEnv *, jclass); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/ecdh/Makefile.am.include b/external/libwally-core/src/secp256k1/src/modules/ecdh/Makefile.am.include deleted file mode 100644 index e3088b469..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/ecdh/Makefile.am.include +++ /dev/null @@ -1,8 +0,0 @@ -include_HEADERS += include/secp256k1_ecdh.h -noinst_HEADERS += src/modules/ecdh/main_impl.h -noinst_HEADERS += src/modules/ecdh/tests_impl.h -if USE_BENCHMARK -noinst_PROGRAMS += bench_ecdh -bench_ecdh_SOURCES = src/bench_ecdh.c -bench_ecdh_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) -endif diff --git a/external/libwally-core/src/secp256k1/src/modules/ecdh/main_impl.h b/external/libwally-core/src/secp256k1/src/modules/ecdh/main_impl.h deleted file mode 100644 index c23e4f82f..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/ecdh/main_impl.h +++ /dev/null @@ -1,54 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Andrew Poelstra * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_MODULE_ECDH_MAIN_ -#define _SECP256K1_MODULE_ECDH_MAIN_ - -#include "include/secp256k1_ecdh.h" -#include "ecmult_const_impl.h" - -int secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *result, const secp256k1_pubkey *point, const unsigned char *scalar) { - int ret = 0; - int overflow = 0; - secp256k1_gej res; - secp256k1_ge pt; - secp256k1_scalar s; - ARG_CHECK(result != NULL); - ARG_CHECK(point != NULL); - ARG_CHECK(scalar != NULL); - (void)ctx; - - secp256k1_pubkey_load(ctx, &pt, point); - secp256k1_scalar_set_b32(&s, scalar, &overflow); - if (overflow || secp256k1_scalar_is_zero(&s)) { - ret = 0; - } else { - unsigned char x[32]; - unsigned char y[1]; - secp256k1_sha256_t sha; - - secp256k1_ecmult_const(&res, &pt, &s); - secp256k1_ge_set_gej(&pt, &res); - /* Compute a hash of the point in compressed form - * Note we cannot use secp256k1_eckey_pubkey_serialize here since it does not - * expect its output to be secret and has a timing sidechannel. */ - secp256k1_fe_normalize(&pt.x); - secp256k1_fe_normalize(&pt.y); - secp256k1_fe_get_b32(x, &pt.x); - y[0] = 0x02 | secp256k1_fe_is_odd(&pt.y); - - secp256k1_sha256_initialize(&sha); - secp256k1_sha256_write(&sha, y, sizeof(y)); - secp256k1_sha256_write(&sha, x, sizeof(x)); - secp256k1_sha256_finalize(&sha, result); - ret = 1; - } - - secp256k1_scalar_clear(&s); - return ret; -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/ecdh/tests_impl.h b/external/libwally-core/src/secp256k1/src/modules/ecdh/tests_impl.h deleted file mode 100644 index 7badc9033..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/ecdh/tests_impl.h +++ /dev/null @@ -1,75 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Andrew Poelstra * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_MODULE_ECDH_TESTS_ -#define _SECP256K1_MODULE_ECDH_TESTS_ - -void test_ecdh_generator_basepoint(void) { - unsigned char s_one[32] = { 0 }; - secp256k1_pubkey point[2]; - int i; - - s_one[31] = 1; - /* Check against pubkey creation when the basepoint is the generator */ - for (i = 0; i < 100; ++i) { - secp256k1_sha256_t sha; - unsigned char s_b32[32]; - unsigned char output_ecdh[32]; - unsigned char output_ser[32]; - unsigned char point_ser[33]; - size_t point_ser_len = sizeof(point_ser); - secp256k1_scalar s; - - random_scalar_order(&s); - secp256k1_scalar_get_b32(s_b32, &s); - - /* compute using ECDH function */ - CHECK(secp256k1_ec_pubkey_create(ctx, &point[0], s_one) == 1); - CHECK(secp256k1_ecdh(ctx, output_ecdh, &point[0], s_b32) == 1); - /* compute "explicitly" */ - CHECK(secp256k1_ec_pubkey_create(ctx, &point[1], s_b32) == 1); - CHECK(secp256k1_ec_pubkey_serialize(ctx, point_ser, &point_ser_len, &point[1], SECP256K1_EC_COMPRESSED) == 1); - CHECK(point_ser_len == sizeof(point_ser)); - secp256k1_sha256_initialize(&sha); - secp256k1_sha256_write(&sha, point_ser, point_ser_len); - secp256k1_sha256_finalize(&sha, output_ser); - /* compare */ - CHECK(memcmp(output_ecdh, output_ser, sizeof(output_ser)) == 0); - } -} - -void test_bad_scalar(void) { - unsigned char s_zero[32] = { 0 }; - unsigned char s_overflow[32] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, - 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 - }; - unsigned char s_rand[32] = { 0 }; - unsigned char output[32]; - secp256k1_scalar rand; - secp256k1_pubkey point; - - /* Create random point */ - random_scalar_order(&rand); - secp256k1_scalar_get_b32(s_rand, &rand); - CHECK(secp256k1_ec_pubkey_create(ctx, &point, s_rand) == 1); - - /* Try to multiply it by bad values */ - CHECK(secp256k1_ecdh(ctx, output, &point, s_zero) == 0); - CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 0); - /* ...and a good one */ - s_overflow[31] -= 1; - CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 1); -} - -void run_ecdh_tests(void) { - test_ecdh_generator_basepoint(); - test_bad_scalar(); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/Makefile.am.include b/external/libwally-core/src/secp256k1/src/modules/rangeproof/Makefile.am.include deleted file mode 100644 index ff8b8d380..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/Makefile.am.include +++ /dev/null @@ -1,15 +0,0 @@ -include_HEADERS += include/secp256k1_rangeproof.h -noinst_HEADERS += src/modules/rangeproof/main_impl.h -noinst_HEADERS += src/modules/rangeproof/pedersen.h -noinst_HEADERS += src/modules/rangeproof/pedersen_impl.h -noinst_HEADERS += src/modules/rangeproof/borromean.h -noinst_HEADERS += src/modules/rangeproof/borromean_impl.h -noinst_HEADERS += src/modules/rangeproof/rangeproof.h -noinst_HEADERS += src/modules/rangeproof/rangeproof_impl.h -noinst_HEADERS += src/modules/rangeproof/tests_impl.h -if USE_BENCHMARK -noinst_PROGRAMS += bench_rangeproof -bench_rangeproof_SOURCES = src/bench_rangeproof.c -bench_rangeproof_LDADD = libsecp256k1.la $(SECP_LIBS) -bench_rangeproof_LDFLAGS = -static -endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/borromean.h b/external/libwally-core/src/secp256k1/src/modules/rangeproof/borromean.h deleted file mode 100644 index 11fd6c5b0..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/borromean.h +++ /dev/null @@ -1,24 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014, 2015 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - - -#ifndef _SECP256K1_BORROMEAN_H_ -#define _SECP256K1_BORROMEAN_H_ - -#include "scalar.h" -#include "field.h" -#include "group.h" -#include "ecmult.h" -#include "ecmult_gen.h" - -int secp256k1_borromean_verify(const secp256k1_ecmult_context* ecmult_ctx, secp256k1_scalar *evalues, const unsigned char *e0, const secp256k1_scalar *s, - const secp256k1_gej *pubs, const int *rsizes, int nrings, const unsigned char *m, int mlen); - -int secp256k1_borromean_sign(const secp256k1_ecmult_context* ecmult_ctx, const secp256k1_ecmult_gen_context *ecmult_gen_ctx, - unsigned char *e0, secp256k1_scalar *s, const secp256k1_gej *pubs, const secp256k1_scalar *k, const secp256k1_scalar *sec, - const int *rsizes, const int *secidx, int nrings, const unsigned char *m, int mlen); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/borromean_impl.h b/external/libwally-core/src/secp256k1/src/modules/rangeproof/borromean_impl.h deleted file mode 100644 index 73a4d1eff..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/borromean_impl.h +++ /dev/null @@ -1,201 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014, 2015 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - - -#ifndef _SECP256K1_BORROMEAN_IMPL_H_ -#define _SECP256K1_BORROMEAN_IMPL_H_ - -#include "scalar.h" -#include "field.h" -#include "group.h" -#include "ecmult.h" -#include "ecmult_gen.h" -#include "borromean.h" - -#include - -#ifdef WORDS_BIGENDIAN -#define BE32(x) (x) -#else -#define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24)) -#endif - -SECP256K1_INLINE static void secp256k1_borromean_hash(unsigned char *hash, const unsigned char *m, int mlen, const unsigned char *e, int elen, - int ridx, int eidx) { - uint32_t ring; - uint32_t epos; - secp256k1_sha256_t sha256_en; - secp256k1_sha256_initialize(&sha256_en); - ring = BE32((uint32_t)ridx); - epos = BE32((uint32_t)eidx); - secp256k1_sha256_write(&sha256_en, e, elen); - secp256k1_sha256_write(&sha256_en, m, mlen); - secp256k1_sha256_write(&sha256_en, (unsigned char*)&ring, 4); - secp256k1_sha256_write(&sha256_en, (unsigned char*)&epos, 4); - secp256k1_sha256_finalize(&sha256_en, hash); -} - -/** "Borromean" ring signature. - * Verifies nrings concurrent ring signatures all sharing a challenge value. - * Signature is one s value per pubkey and a hash. - * Verification equation: - * | m = H(P_{0..}||message) (Message must contain pubkeys or a pubkey commitment) - * | For each ring i: - * | | en = to_scalar(H(e0||m||i||0)) - * | | For each pubkey j: - * | | | r = s_i_j G + en * P_i_j - * | | | e = H(r||m||i||j) - * | | | en = to_scalar(e) - * | | r_i = r - * | return e_0 ==== H(r_{0..i}||m) - */ -int secp256k1_borromean_verify(const secp256k1_ecmult_context* ecmult_ctx, secp256k1_scalar *evalues, const unsigned char *e0, - const secp256k1_scalar *s, const secp256k1_gej *pubs, const int *rsizes, int nrings, const unsigned char *m, int mlen) { - secp256k1_gej rgej; - secp256k1_ge rge; - secp256k1_scalar ens; - secp256k1_sha256_t sha256_e0; - unsigned char tmp[33]; - int i; - int j; - int count; - size_t size; - int overflow; - VERIFY_CHECK(ecmult_ctx != NULL); - VERIFY_CHECK(e0 != NULL); - VERIFY_CHECK(s != NULL); - VERIFY_CHECK(pubs != NULL); - VERIFY_CHECK(rsizes != NULL); - VERIFY_CHECK(nrings > 0); - VERIFY_CHECK(m != NULL); - count = 0; - secp256k1_sha256_initialize(&sha256_e0); - for (i = 0; i < nrings; i++) { - VERIFY_CHECK(INT_MAX - count > rsizes[i]); - secp256k1_borromean_hash(tmp, m, mlen, e0, 32, i, 0); - secp256k1_scalar_set_b32(&ens, tmp, &overflow); - for (j = 0; j < rsizes[i]; j++) { - if (overflow || secp256k1_scalar_is_zero(&s[count]) || secp256k1_scalar_is_zero(&ens) || secp256k1_gej_is_infinity(&pubs[count])) { - return 0; - } - if (evalues) { - /*If requested, save the challenges for proof rewind.*/ - evalues[count] = ens; - } - secp256k1_ecmult(ecmult_ctx, &rgej, &pubs[count], &ens, &s[count]); - if (secp256k1_gej_is_infinity(&rgej)) { - return 0; - } - /* OPT: loop can be hoisted and split to use batch inversion across all the rings; this would make it much faster. */ - secp256k1_ge_set_gej_var(&rge, &rgej); - secp256k1_eckey_pubkey_serialize(&rge, tmp, &size, 1); - if (j != rsizes[i] - 1) { - secp256k1_borromean_hash(tmp, m, mlen, tmp, 33, i, j + 1); - secp256k1_scalar_set_b32(&ens, tmp, &overflow); - } else { - secp256k1_sha256_write(&sha256_e0, tmp, size); - } - count++; - } - } - secp256k1_sha256_write(&sha256_e0, m, mlen); - secp256k1_sha256_finalize(&sha256_e0, tmp); - return memcmp(e0, tmp, 32) == 0; -} - -int secp256k1_borromean_sign(const secp256k1_ecmult_context* ecmult_ctx, const secp256k1_ecmult_gen_context *ecmult_gen_ctx, - unsigned char *e0, secp256k1_scalar *s, const secp256k1_gej *pubs, const secp256k1_scalar *k, const secp256k1_scalar *sec, - const int *rsizes, const int *secidx, int nrings, const unsigned char *m, int mlen) { - secp256k1_gej rgej; - secp256k1_ge rge; - secp256k1_scalar ens; - secp256k1_sha256_t sha256_e0; - unsigned char tmp[33]; - int i; - int j; - int count; - size_t size; - int overflow; - VERIFY_CHECK(ecmult_ctx != NULL); - VERIFY_CHECK(ecmult_gen_ctx != NULL); - VERIFY_CHECK(e0 != NULL); - VERIFY_CHECK(s != NULL); - VERIFY_CHECK(pubs != NULL); - VERIFY_CHECK(k != NULL); - VERIFY_CHECK(sec != NULL); - VERIFY_CHECK(rsizes != NULL); - VERIFY_CHECK(secidx != NULL); - VERIFY_CHECK(nrings > 0); - VERIFY_CHECK(m != NULL); - secp256k1_sha256_initialize(&sha256_e0); - count = 0; - for (i = 0; i < nrings; i++) { - VERIFY_CHECK(INT_MAX - count > rsizes[i]); - secp256k1_ecmult_gen(ecmult_gen_ctx, &rgej, &k[i]); - secp256k1_ge_set_gej(&rge, &rgej); - if (secp256k1_gej_is_infinity(&rgej)) { - return 0; - } - secp256k1_eckey_pubkey_serialize(&rge, tmp, &size, 1); - for (j = secidx[i] + 1; j < rsizes[i]; j++) { - secp256k1_borromean_hash(tmp, m, mlen, tmp, 33, i, j); - secp256k1_scalar_set_b32(&ens, tmp, &overflow); - if (overflow || secp256k1_scalar_is_zero(&ens)) { - return 0; - } - /** The signing algorithm as a whole is not memory uniform so there is likely a cache sidechannel that - * leaks which members are non-forgeries. That the forgeries themselves are variable time may leave - * an additional privacy impacting timing side-channel, but not a key loss one. - */ - secp256k1_ecmult(ecmult_ctx, &rgej, &pubs[count + j], &ens, &s[count + j]); - if (secp256k1_gej_is_infinity(&rgej)) { - return 0; - } - secp256k1_ge_set_gej_var(&rge, &rgej); - secp256k1_eckey_pubkey_serialize(&rge, tmp, &size, 1); - } - secp256k1_sha256_write(&sha256_e0, tmp, size); - count += rsizes[i]; - } - secp256k1_sha256_write(&sha256_e0, m, mlen); - secp256k1_sha256_finalize(&sha256_e0, e0); - count = 0; - for (i = 0; i < nrings; i++) { - VERIFY_CHECK(INT_MAX - count > rsizes[i]); - secp256k1_borromean_hash(tmp, m, mlen, e0, 32, i, 0); - secp256k1_scalar_set_b32(&ens, tmp, &overflow); - if (overflow || secp256k1_scalar_is_zero(&ens)) { - return 0; - } - for (j = 0; j < secidx[i]; j++) { - secp256k1_ecmult(ecmult_ctx, &rgej, &pubs[count + j], &ens, &s[count + j]); - if (secp256k1_gej_is_infinity(&rgej)) { - return 0; - } - secp256k1_ge_set_gej_var(&rge, &rgej); - secp256k1_eckey_pubkey_serialize(&rge, tmp, &size, 1); - secp256k1_borromean_hash(tmp, m, mlen, tmp, 33, i, j + 1); - secp256k1_scalar_set_b32(&ens, tmp, &overflow); - if (overflow || secp256k1_scalar_is_zero(&ens)) { - return 0; - } - } - secp256k1_scalar_mul(&s[count + j], &ens, &sec[i]); - secp256k1_scalar_negate(&s[count + j], &s[count + j]); - secp256k1_scalar_add(&s[count + j], &s[count + j], &k[i]); - if (secp256k1_scalar_is_zero(&s[count + j])) { - return 0; - } - count += rsizes[i]; - } - secp256k1_scalar_clear(&ens); - secp256k1_ge_clear(&rge); - secp256k1_gej_clear(&rgej); - memset(tmp, 0, 33); - return 1; -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/main_impl.h b/external/libwally-core/src/secp256k1/src/modules/rangeproof/main_impl.h deleted file mode 100644 index d6104fd2f..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/main_impl.h +++ /dev/null @@ -1,176 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014-2015 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef SECP256K1_MODULE_RANGEPROOF_MAIN -#define SECP256K1_MODULE_RANGEPROOF_MAIN - -#include "modules/rangeproof/pedersen_impl.h" -#include "modules/rangeproof/borromean_impl.h" -#include "modules/rangeproof/rangeproof_impl.h" - -void secp256k1_pedersen_context_initialize(secp256k1_context* ctx) { - secp256k1_pedersen_context_build(&ctx->pedersen_ctx, &ctx->error_callback); -} - -/* Generates a pedersen commitment: *commit = blind * G + value * G2. The commitment is 33 bytes, the blinding factor is 32 bytes.*/ -int secp256k1_pedersen_commit(const secp256k1_context* ctx, unsigned char *commit, unsigned char *blind, uint64_t value) { - secp256k1_gej rj; - secp256k1_ge r; - secp256k1_scalar sec; - size_t sz; - int overflow; - int ret = 0; - ARG_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(secp256k1_pedersen_context_is_built(&ctx->pedersen_ctx)); - ARG_CHECK(commit != NULL); - ARG_CHECK(blind != NULL); - secp256k1_scalar_set_b32(&sec, blind, &overflow); - if (!overflow) { - secp256k1_pedersen_ecmult(&ctx->ecmult_gen_ctx, &ctx->pedersen_ctx, &rj, &sec, value); - if (!secp256k1_gej_is_infinity(&rj)) { - secp256k1_ge_set_gej(&r, &rj); - sz = 33; - ret = secp256k1_eckey_pubkey_serialize(&r, commit, &sz, 1); - } - secp256k1_gej_clear(&rj); - secp256k1_ge_clear(&r); - } - secp256k1_scalar_clear(&sec); - return ret; -} - -/** Takes a list of n pointers to 32 byte blinding values, the first negs of which are treated with positive sign and the rest - * negative, then calculates an additional blinding value that adds to zero. - */ -int secp256k1_pedersen_blind_sum(const secp256k1_context* ctx, unsigned char *blind_out, const unsigned char * const *blinds, int n, int npositive) { - secp256k1_scalar acc; - secp256k1_scalar x; - int i; - int overflow; - ARG_CHECK(ctx != NULL); - ARG_CHECK(blind_out != NULL); - ARG_CHECK(blinds != NULL); - secp256k1_scalar_set_int(&acc, 0); - for (i = 0; i < n; i++) { - secp256k1_scalar_set_b32(&x, blinds[i], &overflow); - if (overflow) { - return 0; - } - if (i >= npositive) { - secp256k1_scalar_negate(&x, &x); - } - secp256k1_scalar_add(&acc, &acc, &x); - } - secp256k1_scalar_get_b32(blind_out, &acc); - secp256k1_scalar_clear(&acc); - secp256k1_scalar_clear(&x); - return 1; -} - -/* Takes two list of 33-byte commitments and sums the first set and subtracts the second and verifies that they sum to excess. */ -int secp256k1_pedersen_verify_tally(const secp256k1_context* ctx, const unsigned char * const *commits, int pcnt, - const unsigned char * const *ncommits, int ncnt, int64_t excess) { - secp256k1_gej accj; - secp256k1_ge add; - int i; - ARG_CHECK(ctx != NULL); - ARG_CHECK(!pcnt || (commits != NULL)); - ARG_CHECK(!ncnt || (ncommits != NULL)); - ARG_CHECK(secp256k1_pedersen_context_is_built(&ctx->pedersen_ctx)); - secp256k1_gej_set_infinity(&accj); - if (excess) { - uint64_t ex; - int neg; - /* Take the absolute value, and negate the result if the input was negative. */ - neg = secp256k1_sign_and_abs64(&ex, excess); - secp256k1_pedersen_ecmult_small(&ctx->pedersen_ctx, &accj, ex); - if (neg) { - secp256k1_gej_neg(&accj, &accj); - } - } - for (i = 0; i < ncnt; i++) { - if (!secp256k1_eckey_pubkey_parse(&add, ncommits[i], 33)) { - return 0; - } - secp256k1_gej_add_ge_var(&accj, &accj, &add, NULL); - } - secp256k1_gej_neg(&accj, &accj); - for (i = 0; i < pcnt; i++) { - if (!secp256k1_eckey_pubkey_parse(&add, commits[i], 33)) { - return 0; - } - secp256k1_gej_add_ge_var(&accj, &accj, &add, NULL); - } - return secp256k1_gej_is_infinity(&accj); -} - -void secp256k1_rangeproof_context_initialize(secp256k1_context* ctx) { - secp256k1_rangeproof_context_build(&ctx->rangeproof_ctx, &ctx->error_callback); -} - -int secp256k1_rangeproof_info(const secp256k1_context* ctx, int *exp, int *mantissa, - uint64_t *min_value, uint64_t *max_value, const unsigned char *proof, int plen) { - int offset; - uint64_t scale; - ARG_CHECK(exp != NULL); - ARG_CHECK(mantissa != NULL); - ARG_CHECK(min_value != NULL); - ARG_CHECK(max_value != NULL); - offset = 0; - scale = 1; - (void)ctx; - return secp256k1_rangeproof_getheader_impl(&offset, exp, mantissa, &scale, min_value, max_value, proof, plen); -} - -int secp256k1_rangeproof_rewind(const secp256k1_context* ctx, - unsigned char *blind_out, uint64_t *value_out, unsigned char *message_out, int *outlen, const unsigned char *nonce, - uint64_t *min_value, uint64_t *max_value, - const unsigned char *commit, const unsigned char *proof, int plen) { - ARG_CHECK(ctx != NULL); - ARG_CHECK(commit != NULL); - ARG_CHECK(proof != NULL); - ARG_CHECK(min_value != NULL); - ARG_CHECK(max_value != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(secp256k1_pedersen_context_is_built(&ctx->pedersen_ctx)); - ARG_CHECK(secp256k1_rangeproof_context_is_built(&ctx->rangeproof_ctx)); - return secp256k1_rangeproof_verify_impl(&ctx->ecmult_ctx, &ctx->ecmult_gen_ctx, &ctx->pedersen_ctx, &ctx->rangeproof_ctx, - blind_out, value_out, message_out, outlen, nonce, min_value, max_value, commit, proof, plen); -} - -int secp256k1_rangeproof_verify(const secp256k1_context* ctx, uint64_t *min_value, uint64_t *max_value, - const unsigned char *commit, const unsigned char *proof, int plen) { - ARG_CHECK(ctx != NULL); - ARG_CHECK(commit != NULL); - ARG_CHECK(proof != NULL); - ARG_CHECK(min_value != NULL); - ARG_CHECK(max_value != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(secp256k1_pedersen_context_is_built(&ctx->pedersen_ctx)); - ARG_CHECK(secp256k1_rangeproof_context_is_built(&ctx->rangeproof_ctx)); - return secp256k1_rangeproof_verify_impl(&ctx->ecmult_ctx, NULL, &ctx->pedersen_ctx, &ctx->rangeproof_ctx, - NULL, NULL, NULL, NULL, NULL, min_value, max_value, commit, proof, plen); -} - -int secp256k1_rangeproof_sign(const secp256k1_context* ctx, unsigned char *proof, int *plen, uint64_t min_value, - const unsigned char *commit, const unsigned char *blind, const unsigned char *nonce, int exp, int min_bits, uint64_t value){ - ARG_CHECK(ctx != NULL); - ARG_CHECK(proof != NULL); - ARG_CHECK(plen != NULL); - ARG_CHECK(commit != NULL); - ARG_CHECK(blind != NULL); - ARG_CHECK(nonce != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(secp256k1_pedersen_context_is_built(&ctx->pedersen_ctx)); - ARG_CHECK(secp256k1_rangeproof_context_is_built(&ctx->rangeproof_ctx)); - return secp256k1_rangeproof_sign_impl(&ctx->ecmult_ctx, &ctx->ecmult_gen_ctx, &ctx->pedersen_ctx, &ctx->rangeproof_ctx, - proof, plen, min_value, commit, blind, nonce, exp, min_bits, value); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/pedersen.h b/external/libwally-core/src/secp256k1/src/modules/rangeproof/pedersen.h deleted file mode 100644 index f167d4dfb..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/pedersen.h +++ /dev/null @@ -1,34 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014, 2015 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_PEDERSEN_H_ -#define _SECP256K1_PEDERSEN_H_ - -#include "group.h" -#include "scalar.h" - -#include - -typedef struct { - secp256k1_ge_storage (*prec)[16][16]; /* prec[j][i] = 16^j * i * G + U_i */ -} secp256k1_pedersen_context; - -static void secp256k1_pedersen_context_init(secp256k1_pedersen_context* ctx); -static void secp256k1_pedersen_context_build(secp256k1_pedersen_context* ctx, const secp256k1_callback* cb); -static void secp256k1_pedersen_context_clone(secp256k1_pedersen_context *dst, - const secp256k1_pedersen_context* src, const secp256k1_callback* cb); -static void secp256k1_pedersen_context_clear(secp256k1_pedersen_context* ctx); - -static int secp256k1_pedersen_context_is_built(const secp256k1_pedersen_context* ctx); - -/** Multiply a small number with the generator: r = gn*G2 */ -static void secp256k1_pedersen_ecmult_small(const secp256k1_pedersen_context *ctx, secp256k1_gej *r, uint64_t gn); - -/* sec * G + value * G2. */ -static void secp256k1_pedersen_ecmult(const secp256k1_ecmult_gen_context *ecmult_gen_ctx, - const secp256k1_pedersen_context *pedersen_ctx, secp256k1_gej *rj, const secp256k1_scalar *sec, uint64_t value); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/pedersen_impl.h b/external/libwally-core/src/secp256k1/src/modules/rangeproof/pedersen_impl.h deleted file mode 100644 index c2a169afd..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/pedersen_impl.h +++ /dev/null @@ -1,139 +0,0 @@ -/*********************************************************************** - * Copyright (c) 2015 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php. * - ***********************************************************************/ - -#ifndef _SECP256K1_PEDERSEN_IMPL_H_ -#define _SECP256K1_PEDERSEN_IMPL_H_ - -/** Alternative generator for secp256k1. - * This is the sha256 of 'g' after DER encoding (without compression), - * which happens to be a point on the curve. - * sage: G2 = EllipticCurve ([F (0), F (7)]).lift_x(int(hashlib.sha256('0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'.decode('hex')).hexdigest(),16)) - * sage: '%x %x'%G2.xy() - */ -static const secp256k1_ge secp256k1_ge_const_g2 = SECP256K1_GE_CONST( - 0x50929b74UL, 0xc1a04954UL, 0xb78b4b60UL, 0x35e97a5eUL, - 0x078a5a0fUL, 0x28ec96d5UL, 0x47bfee9aUL, 0xce803ac0UL, - 0x31d3c686UL, 0x3973926eUL, 0x049e637cUL, 0xb1b5f40aUL, - 0x36dac28aUL, 0xf1766968UL, 0xc30c2313UL, 0xf3a38904UL -); - -static void secp256k1_pedersen_context_init(secp256k1_pedersen_context *ctx) { - ctx->prec = NULL; -} - -static void secp256k1_pedersen_context_build(secp256k1_pedersen_context *ctx, const secp256k1_callback *cb) { - secp256k1_ge prec[256]; - secp256k1_gej gj; - secp256k1_gej nums_gej; - int i, j; - - if (ctx->prec != NULL) { - return; - } - - ctx->prec = (secp256k1_ge_storage (*)[16][16])checked_malloc(cb, sizeof(*ctx->prec)); - - /* get the generator */ - secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g2); - - /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ - { - static const unsigned char nums_b32[33] = "The scalar for this x is unknown"; - secp256k1_fe nums_x; - secp256k1_ge nums_ge; - VERIFY_CHECK(secp256k1_fe_set_b32(&nums_x, nums_b32)); - VERIFY_CHECK(secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0)); - secp256k1_gej_set_ge(&nums_gej, &nums_ge); - /* Add G to make the bits in x uniformly distributed. */ - secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g2, NULL); - } - - /* compute prec. */ - { - secp256k1_gej precj[256]; /* Jacobian versions of prec. */ - secp256k1_gej gbase; - secp256k1_gej numsbase; - gbase = gj; /* 16^j * G */ - numsbase = nums_gej; /* 2^j * nums. */ - for (j = 0; j < 16; j++) { - /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ - precj[j*16] = numsbase; - for (i = 1; i < 16; i++) { - secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase, NULL); - } - /* Multiply gbase by 16. */ - for (i = 0; i < 4; i++) { - secp256k1_gej_double_var(&gbase, &gbase, NULL); - } - /* Multiply numbase by 2. */ - secp256k1_gej_double_var(&numsbase, &numsbase, NULL); - if (j == 14) { - /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ - secp256k1_gej_neg(&numsbase, &numsbase); - secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej, NULL); - } - } - secp256k1_ge_set_all_gej_var(prec, precj, 256, cb); - } - for (j = 0; j < 16; j++) { - for (i = 0; i < 16; i++) { - secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]); - } - } -} - -static int secp256k1_pedersen_context_is_built(const secp256k1_pedersen_context* ctx) { - return ctx->prec != NULL; -} - -static void secp256k1_pedersen_context_clone(secp256k1_pedersen_context *dst, - const secp256k1_pedersen_context *src, const secp256k1_callback *cb) { - if (src->prec == NULL) { - dst->prec = NULL; - } else { - dst->prec = (secp256k1_ge_storage (*)[16][16])checked_malloc(cb, sizeof(*dst->prec)); - memcpy(dst->prec, src->prec, sizeof(*dst->prec)); - } -} - -static void secp256k1_pedersen_context_clear(secp256k1_pedersen_context *ctx) { - free(ctx->prec); - ctx->prec = NULL; -} - -/* Version of secp256k1_ecmult_gen using the second generator and working only on numbers in the range [0 .. 2^64). */ -static void secp256k1_pedersen_ecmult_small(const secp256k1_pedersen_context *ctx, secp256k1_gej *r, uint64_t gn) { - secp256k1_ge add; - secp256k1_ge_storage adds; - int bits; - int i, j; - memset(&adds, 0, sizeof(adds)); - secp256k1_gej_set_infinity(r); - add.infinity = 0; - for (j = 0; j < 16; j++) { - bits = (gn >> (j * 4)) & 15; - for (i = 0; i < 16; i++) { - secp256k1_ge_storage_cmov(&adds, &(*ctx->prec)[j][i], i == bits); - } - secp256k1_ge_from_storage(&add, &adds); - secp256k1_gej_add_ge(r, r, &add); - } - bits = 0; - secp256k1_ge_clear(&add); -} - -/* sec * G + value * G2. */ -SECP256K1_INLINE static void secp256k1_pedersen_ecmult(const secp256k1_ecmult_gen_context *ecmult_gen_ctx, - const secp256k1_pedersen_context *pedersen_ctx, secp256k1_gej *rj, const secp256k1_scalar *sec, uint64_t value) { - secp256k1_gej vj; - secp256k1_ecmult_gen(ecmult_gen_ctx, rj, sec); - secp256k1_pedersen_ecmult_small(pedersen_ctx, &vj, value); - /* FIXME: constant time. */ - secp256k1_gej_add_var(rj, rj, &vj, NULL); - secp256k1_gej_clear(&vj); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/rangeproof.h b/external/libwally-core/src/secp256k1/src/modules/rangeproof/rangeproof.h deleted file mode 100644 index e6d99717f..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/rangeproof.h +++ /dev/null @@ -1,31 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_RANGEPROOF_H_ -#define _SECP256K1_RANGEPROOF_H_ - -#include "scalar.h" -#include "group.h" - -typedef struct { - secp256k1_ge_storage (*prec)[1005]; -} secp256k1_rangeproof_context; - - -static void secp256k1_rangeproof_context_init(secp256k1_rangeproof_context* ctx); -static void secp256k1_rangeproof_context_build(secp256k1_rangeproof_context* ctx, const secp256k1_callback* cb); -static void secp256k1_rangeproof_context_clone(secp256k1_rangeproof_context *dst, - const secp256k1_rangeproof_context* src, const secp256k1_callback* cb); -static void secp256k1_rangeproof_context_clear(secp256k1_rangeproof_context* ctx); -static int secp256k1_rangeproof_context_is_built(const secp256k1_rangeproof_context* ctx); - -static int secp256k1_rangeproof_verify_impl(const secp256k1_ecmult_context* ecmult_ctx, - const secp256k1_ecmult_gen_context* ecmult_gen_ctx, - const secp256k1_pedersen_context* pedersen_ctx, const secp256k1_rangeproof_context* rangeproof_ctx, - unsigned char *blindout, uint64_t *value_out, unsigned char *message_out, int *outlen, const unsigned char *nonce, - uint64_t *min_value, uint64_t *max_value, const unsigned char *commit, const unsigned char *proof, int plen); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/rangeproof_impl.h b/external/libwally-core/src/secp256k1/src/modules/rangeproof/rangeproof_impl.h deleted file mode 100644 index a1d20fc8f..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/rangeproof_impl.h +++ /dev/null @@ -1,736 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_RANGEPROOF_IMPL_H_ -#define _SECP256K1_RANGEPROOF_IMPL_H_ - -#include "scalar.h" -#include "group.h" -#include "rangeproof.h" -#include "hash_impl.h" - -#include "modules/rangeproof/pedersen.h" -#include "modules/rangeproof/borromean.h" - -static const int secp256k1_rangeproof_offsets[20] = { - 0, 96, 189, 276, 360, 438, 510, 579, 642, - 699, 753, 801, 843, 882, 915, 942, 966, 984, - 996, 1005, -}; - -static void secp256k1_rangeproof_context_init(secp256k1_rangeproof_context *ctx) { - ctx->prec = NULL; -} - -static void secp256k1_rangeproof_context_build(secp256k1_rangeproof_context *ctx, const secp256k1_callback* cb) { - secp256k1_ge *prec; - secp256k1_gej *precj; - secp256k1_gej gj; - secp256k1_gej one; - int i, pos; - - if (ctx->prec != NULL) { - return; - } - - precj = (secp256k1_gej (*))checked_malloc(cb, sizeof(*precj) * 1005); - if (precj == NULL) { - return; - } - prec = (secp256k1_ge (*))checked_malloc(cb, sizeof(*prec) * 1005); - if (prec == NULL) { - free(precj); - return; - } - - /* get the generator */ - secp256k1_gej_set_ge(&one, &secp256k1_ge_const_g2); - secp256k1_gej_neg(&one, &one); - - /* compute prec. */ - pos = 0; - for (i = 0; i < 19; i++) { - int pmax; - pmax = secp256k1_rangeproof_offsets[i + 1]; - gj = one; - while (pos < pmax) { - precj[pos] = gj; - pos++; - secp256k1_gej_double_var(&precj[pos], &gj, NULL); - pos++; - secp256k1_gej_add_var(&precj[pos], &precj[pos - 1], &gj, NULL); - pos++; - if (pos < pmax - 1) { - secp256k1_gej_double_var(&gj, &precj[pos - 2], NULL); - } - } - if (i < 18) { - secp256k1_gej_double_var(&gj, &one, NULL); - one = gj; - secp256k1_gej_double_var(&gj, &gj, NULL); - secp256k1_gej_double_var(&gj, &gj, NULL); - secp256k1_gej_add_var(&one, &one, &gj, NULL); - } - } - VERIFY_CHECK(pos == 1005); - secp256k1_ge_set_all_gej_var(prec, precj, 1005, cb); - - free(precj); - - ctx->prec = (secp256k1_ge_storage (*)[1005])checked_malloc(cb, sizeof(*ctx->prec)); - if (ctx->prec == NULL) { - free(prec); - return; - } - - for (i = 0; i < 1005; i++) { - secp256k1_ge_to_storage(&(*ctx->prec)[i], &prec[i]); - } - free(prec); -} - - -static int secp256k1_rangeproof_context_is_built(const secp256k1_rangeproof_context* ctx) { - return ctx->prec != NULL; -} - -static void secp256k1_rangeproof_context_clone(secp256k1_rangeproof_context *dst, - const secp256k1_rangeproof_context *src, const secp256k1_callback* cb) { - if (src->prec == NULL) { - dst->prec = NULL; - } else { - dst->prec = (secp256k1_ge_storage (*)[1005])checked_malloc(cb, sizeof(*dst->prec)); - memcpy(dst->prec, src->prec, sizeof(*dst->prec)); - } -} - -static void secp256k1_rangeproof_context_clear(secp256k1_rangeproof_context *ctx) { - free(ctx->prec); - ctx->prec = NULL; -} - -SECP256K1_INLINE static void secp256k1_rangeproof_pub_expand(const secp256k1_rangeproof_context *ctx, secp256k1_gej *pubs, - int exp, int *rsizes, int rings) { - secp256k1_ge ge; - secp256k1_ge_storage *basis; - int i; - int j; - int npub; - VERIFY_CHECK(exp < 19); - if (exp < 0) { - exp = 0; - } - basis = &(*ctx->prec)[secp256k1_rangeproof_offsets[exp]]; - npub = 0; - for (i = 0; i < rings; i++) { - for (j = 1; j < rsizes[i]; j++) { - secp256k1_ge_from_storage(&ge, &basis[i * 3 + j - 1]); - secp256k1_gej_add_ge_var(&pubs[npub + j], &pubs[npub], &ge, NULL); - } - npub += rsizes[i]; - } -} - -SECP256K1_INLINE static int secp256k1_rangeproof_genrand(secp256k1_scalar *sec, secp256k1_scalar *s, unsigned char *message, - int *rsizes, int rings, const unsigned char *nonce, const unsigned char *commit, const unsigned char *proof, int len) { - unsigned char tmp[32]; - unsigned char rngseed[32 + 33 + 10]; - secp256k1_rfc6979_hmac_sha256_t rng; - secp256k1_scalar acc; - int overflow; - int ret; - int i; - int j; - int b; - int npub; - VERIFY_CHECK(len <= 10); - memcpy(rngseed, nonce, 32); - memcpy(rngseed + 32, commit, 33); - memcpy(rngseed + 65, proof, len); - secp256k1_rfc6979_hmac_sha256_initialize(&rng, rngseed, 32 + 33 + len); - secp256k1_scalar_clear(&acc); - npub = 0; - ret = 1; - for (i = 0; i < rings; i++) { - if (i < rings - 1) { - secp256k1_rfc6979_hmac_sha256_generate(&rng, tmp, 32); - do { - secp256k1_rfc6979_hmac_sha256_generate(&rng, tmp, 32); - secp256k1_scalar_set_b32(&sec[i], tmp, &overflow); - } while (overflow || secp256k1_scalar_is_zero(&sec[i])); - secp256k1_scalar_add(&acc, &acc, &sec[i]); - } else { - secp256k1_scalar_negate(&acc, &acc); - sec[i] = acc; - } - for (j = 0; j < rsizes[i]; j++) { - secp256k1_rfc6979_hmac_sha256_generate(&rng, tmp, 32); - if (message) { - for (b = 0; b < 32; b++) { - tmp[b] ^= message[(i * 4 + j) * 32 + b]; - message[(i * 4 + j) * 32 + b] = tmp[b]; - } - } - secp256k1_scalar_set_b32(&s[npub], tmp, &overflow); - ret &= !(overflow || secp256k1_scalar_is_zero(&s[npub])); - npub++; - } - } - secp256k1_rfc6979_hmac_sha256_finalize(&rng); - secp256k1_scalar_clear(&acc); - memset(tmp, 0, 32); - return ret; -} - -SECP256K1_INLINE static int secp256k1_range_proveparams(uint64_t *v, int *rings, int *rsizes, int *npub, int *secidx, uint64_t *min_value, - int *mantissa, uint64_t *scale, int *exp, int *min_bits, uint64_t value) { - int i; - *rings = 1; - rsizes[0] = 1; - secidx[0] = 0; - *scale = 1; - *mantissa = 0; - *npub = 0; - if (*min_value == UINT64_MAX) { - /* If the minimum value is the maximal representable value, then we cannot code a range. */ - *exp = -1; - } - if (*exp >= 0) { - int max_bits; - uint64_t v2; - if ((*min_value && value > INT64_MAX) || (value && *min_value >= INT64_MAX)) { - /* If either value or min_value is >= 2^63-1 then the other must by zero to avoid overflowing the proven range. */ - return 0; - } - max_bits = *min_value ? secp256k1_clz64_var(*min_value) : 64; - if (*min_bits > max_bits) { - *min_bits = max_bits; - } - if (*min_bits > 61 || value > INT64_MAX) { - /** Ten is not a power of two, so dividing by ten and then representing in base-2 times ten - * expands the representable range. The verifier requires the proven range is within 0..2**64. - * For very large numbers (all over 2**63) we must change our exponent to compensate. - * Rather than handling it precisely, this just disables use of the exponent for big values. - */ - *exp = 0; - } - /* Mask off the least significant digits, as requested. */ - *v = value - *min_value; - /* If the user has asked for more bits of proof then there is room for in the exponent, reduce the exponent. */ - v2 = *min_bits ? (UINT64_MAX>>(64-*min_bits)) : 0; - for (i = 0; i < *exp && (v2 <= UINT64_MAX / 10); i++) { - *v /= 10; - v2 *= 10; - } - *exp = i; - v2 = *v; - for (i = 0; i < *exp; i++) { - v2 *= 10; - *scale *= 10; - } - /* If the masked number isn't precise, compute the public offset. */ - *min_value = value - v2; - /* How many bits do we need to represent our value? */ - *mantissa = *v ? 64 - secp256k1_clz64_var(*v) : 1; - if (*min_bits > *mantissa) { - /* If the user asked for more precision, give it to them. */ - *mantissa = *min_bits; - } - /* Digits in radix-4, except for the last digit if our mantissa length is odd. */ - *rings = (*mantissa + 1) >> 1; - for (i = 0; i < *rings; i++) { - rsizes[i] = ((i < *rings - 1) | (!(*mantissa&1))) ? 4 : 2; - *npub += rsizes[i]; - secidx[i] = (*v >> (i*2)) & 3; - } - VERIFY_CHECK(*mantissa>0); - VERIFY_CHECK((*v & ~(UINT64_MAX>>(64-*mantissa))) == 0); /* Did this get all the bits? */ - } else { - /* A proof for an exact value. */ - *exp = 0; - *min_value = value; - *v = 0; - *npub = 2; - } - VERIFY_CHECK(*v * *scale + *min_value == value); - VERIFY_CHECK(*rings > 0); - VERIFY_CHECK(*rings <= 32); - VERIFY_CHECK(*npub <= 128); - return 1; -} - -/* strawman interface, writes proof in proof, a buffer of plen, proves with respect to min_value the range for commit which has the provided blinding factor and value. */ -SECP256K1_INLINE static int secp256k1_rangeproof_sign_impl(const secp256k1_ecmult_context* ecmult_ctx, - const secp256k1_ecmult_gen_context* ecmult_gen_ctx, const secp256k1_pedersen_context* pedersen_ctx, - const secp256k1_rangeproof_context* rangeproof_ctx, unsigned char *proof, int *plen, uint64_t min_value, - const unsigned char *commit, const unsigned char *blind, const unsigned char *nonce, int exp, int min_bits, uint64_t value){ - secp256k1_gej pubs[128]; /* Candidate digits for our proof, most inferred. */ - secp256k1_scalar s[128]; /* Signatures in our proof, most forged. */ - secp256k1_scalar sec[32]; /* Blinding factors for the correct digits. */ - secp256k1_scalar k[32]; /* Nonces for our non-forged signatures. */ - secp256k1_scalar stmp; - secp256k1_sha256_t sha256_m; - unsigned char prep[4096]; - unsigned char tmp[33]; - unsigned char *signs; /* Location of sign flags in the proof. */ - uint64_t v; - uint64_t scale; /* scale = 10^exp. */ - int mantissa; /* Number of bits proven in the blinded value. */ - int rings; /* How many digits will our proof cover. */ - int rsizes[32]; /* How many possible values there are for each place. */ - int secidx[32]; /* Which digit is the correct one. */ - int len; /* Number of bytes used so far. */ - int i; - int overflow; - int npub; - len = 0; - if (*plen < 65 || min_value > value || min_bits > 64 || min_bits < 0 || exp < -1 || exp > 18) { - return 0; - } - if (!secp256k1_range_proveparams(&v, &rings, rsizes, &npub, secidx, &min_value, &mantissa, &scale, &exp, &min_bits, value)) { - return 0; - } - proof[len] = (rsizes[0] > 1 ? (64 | exp) : 0) | (min_value ? 32 : 0); - len++; - if (rsizes[0] > 1) { - VERIFY_CHECK(mantissa > 0 && mantissa <= 64); - proof[len] = mantissa - 1; - len++; - } - if (min_value) { - for (i = 0; i < 8; i++) { - proof[len + i] = (min_value >> ((7-i) * 8)) & 255; - } - len += 8; - } - /* Do we have enough room for the proof? */ - if (*plen - len < 32 * (npub + rings - 1) + 32 + ((rings+6) >> 3)) { - return 0; - } - secp256k1_sha256_initialize(&sha256_m); - secp256k1_sha256_write(&sha256_m, commit, 33); - secp256k1_sha256_write(&sha256_m, proof, len); - - memset(prep, 0, 4096); - /* Note, the data corresponding to the blinding factors must be zero. */ - if (rsizes[rings - 1] > 1) { - int idx; - /* Value encoding sidechannel. */ - idx = rsizes[rings - 1] - 1; - idx -= secidx[rings - 1] == idx; - idx = ((rings - 1) * 4 + idx) * 32; - for (i = 0; i < 8; i++) { - prep[8 + i + idx] = prep[16 + i + idx] = prep[24 + i + idx] = (v >> (56 - i * 8)) & 255; - prep[i + idx] = 0; - } - prep[idx] = 128; - } - if (!secp256k1_rangeproof_genrand(sec, s, prep, rsizes, rings, nonce, commit, proof, len)) { - return 0; - } - memset(prep, 0, 4096); - for (i = 0; i < rings; i++) { - /* Sign will overwrite the non-forged signature, move that random value into the nonce. */ - k[i] = s[i * 4 + secidx[i]]; - secp256k1_scalar_clear(&s[i * 4 + secidx[i]]); - } - /** Genrand returns the last blinding factor as -sum(rest), - * adding in the blinding factor for our commitment, results in the blinding factor for - * the commitment to the last digit that the verifier can compute for itself by subtracting - * all the digits in the proof from the commitment. This lets the prover skip sending the - * blinded value for one digit. - */ - secp256k1_scalar_set_b32(&stmp, blind, &overflow); - secp256k1_scalar_add(&sec[rings - 1], &sec[rings - 1], &stmp); - if (overflow || secp256k1_scalar_is_zero(&sec[rings - 1])) { - return 0; - } - signs = &proof[len]; - /* We need one sign bit for each blinded value we send. */ - for (i = 0; i < (rings + 6) >> 3; i++) { - signs[i] = 0; - len++; - } - npub = 0; - for (i = 0; i < rings; i++) { - /*OPT: Use the precomputed gen2 basis?*/ - secp256k1_pedersen_ecmult(ecmult_gen_ctx, pedersen_ctx, &pubs[npub], &sec[i], ((uint64_t)secidx[i] * scale) << (i*2)); - if (secp256k1_gej_is_infinity(&pubs[npub])) { - return 0; - } - if (i < rings - 1) { - size_t size = 33; - secp256k1_ge c; - /*OPT: split loop and batch invert.*/ - secp256k1_ge_set_gej_var(&c, &pubs[npub]); - if(!secp256k1_eckey_pubkey_serialize(&c, tmp, &size, 1)) { - return 0; - } - secp256k1_sha256_write(&sha256_m, tmp, 33); - signs[i>>3] |= (tmp[0] == 3) << (i&7); - memcpy(&proof[len], &tmp[1], 32); - len += 32; - } - npub += rsizes[i]; - } - secp256k1_rangeproof_pub_expand(rangeproof_ctx, pubs, exp, rsizes, rings); - secp256k1_sha256_finalize(&sha256_m, tmp); - if (!secp256k1_borromean_sign(ecmult_ctx, ecmult_gen_ctx, &proof[len], s, pubs, k, sec, rsizes, secidx, rings, tmp, 32)) { - return 0; - } - len += 32; - for (i = 0; i < npub; i++) { - secp256k1_scalar_get_b32(&proof[len],&s[i]); - len += 32; - } - VERIFY_CHECK(len <= *plen); - *plen = len; - memset(prep, 0, 4096); - return 1; -} - -/* Computes blinding factor x given k, s, and the challenge e. */ -SECP256K1_INLINE static void secp256k1_rangeproof_recover_x(secp256k1_scalar *x, const secp256k1_scalar *k, const secp256k1_scalar *e, - const secp256k1_scalar *s) { - secp256k1_scalar stmp; - secp256k1_scalar_negate(x, s); - secp256k1_scalar_add(x, x, k); - secp256k1_scalar_inverse(&stmp, e); - secp256k1_scalar_mul(x, x, &stmp); -} - -/* Computes ring's nonce given the blinding factor x, the challenge e, and the signature s. */ -SECP256K1_INLINE static void secp256k1_rangeproof_recover_k(secp256k1_scalar *k, const secp256k1_scalar *x, const secp256k1_scalar *e, - const secp256k1_scalar *s) { - secp256k1_scalar stmp; - secp256k1_scalar_mul(&stmp, x, e); - secp256k1_scalar_add(k, s, &stmp); -} - -SECP256K1_INLINE static void secp256k1_rangeproof_ch32xor(unsigned char *x, const unsigned char *y) { - int i; - for (i = 0; i < 32; i++) { - x[i] ^= y[i]; - } -} - -SECP256K1_INLINE static int secp256k1_rangeproof_rewind_inner(secp256k1_scalar *blind, uint64_t *v, - unsigned char *m, int *mlen, secp256k1_scalar *ev, secp256k1_scalar *s, - int *rsizes, int rings, const unsigned char *nonce, const unsigned char *commit, const unsigned char *proof, int len) { - secp256k1_scalar s_orig[128]; - secp256k1_scalar sec[32]; - secp256k1_scalar stmp; - unsigned char prep[4096]; - unsigned char tmp[32]; - uint64_t value; - int offset; - int i; - int j; - int b; - int skip1; - int skip2; - int npub; - npub = ((rings - 1) << 2) + rsizes[rings-1]; - VERIFY_CHECK(npub <= 128); - VERIFY_CHECK(npub >= 1); - memset(prep, 0, 4096); - /* Reconstruct the provers random values. */ - secp256k1_rangeproof_genrand(sec, s_orig, prep, rsizes, rings, nonce, commit, proof, len); - *v = UINT64_MAX; - secp256k1_scalar_clear(blind); - if (rings == 1 && rsizes[0] == 1) { - /* With only a single proof, we can only recover the blinding factor. */ - secp256k1_rangeproof_recover_x(blind, &s_orig[0], &ev[0], &s[0]); - if (v) { - *v = 0; - } - if (mlen) { - *mlen = 0; - } - return 1; - } - npub = (rings - 1) << 2; - for (j = 0; j < 2; j++) { - int idx; - /* Look for a value encoding in the last ring. */ - idx = npub + rsizes[rings - 1] - 1 - j; - secp256k1_scalar_get_b32(tmp, &s[idx]); - secp256k1_rangeproof_ch32xor(tmp, &prep[idx * 32]); - if ((tmp[0] & 128) && (memcmp(&tmp[16], &tmp[24], 8) == 0) && (memcmp(&tmp[8], &tmp[16], 8) == 0)) { - value = 0; - for (i = 0; i < 8; i++) { - value = (value << 8) + tmp[24 + i]; - } - if (v) { - *v = value; - } - memcpy(&prep[idx * 32], tmp, 32); - break; - } - } - if (j > 1) { - /* Couldn't extract a value. */ - if (mlen) { - *mlen = 0; - } - return 0; - } - skip1 = rsizes[rings - 1] - 1 - j; - skip2 = ((value >> ((rings - 1) << 1)) & 3); - if (skip1 == skip2) { - /*Value is in wrong position.*/ - if (mlen) { - *mlen = 0; - } - return 0; - } - skip1 += (rings - 1) << 2; - skip2 += (rings - 1) << 2; - /* Like in the rsize[] == 1 case, Having figured out which s is the one which was not forged, we can recover the blinding factor. */ - secp256k1_rangeproof_recover_x(&stmp, &s_orig[skip2], &ev[skip2], &s[skip2]); - secp256k1_scalar_negate(&sec[rings - 1], &sec[rings - 1]); - secp256k1_scalar_add(blind, &stmp, &sec[rings - 1]); - if (!m || !mlen || *mlen == 0) { - if (mlen) { - *mlen = 0; - } - /* FIXME: cleanup in early out/failure cases. */ - return 1; - } - offset = 0; - npub = 0; - for (i = 0; i < rings; i++) { - int idx; - idx = (value >> (i << 1)) & 3; - for (j = 0; j < rsizes[i]; j++) { - if (npub == skip1 || npub == skip2) { - npub++; - continue; - } - if (idx == j) { - /** For the non-forged signatures the signature is calculated instead of random, instead we recover the prover's nonces. - * this could just as well recover the blinding factors and messages could be put there as is done for recovering the - * blinding factor in the last ring, but it takes an inversion to recover x so it's faster to put the message data in k. - */ - secp256k1_rangeproof_recover_k(&stmp, &sec[i], &ev[npub], &s[npub]); - } else { - stmp = s[npub]; - } - secp256k1_scalar_get_b32(tmp, &stmp); - secp256k1_rangeproof_ch32xor(tmp, &prep[npub * 32]); - for (b = 0; b < 32 && offset < *mlen; b++) { - m[offset] = tmp[b]; - offset++; - } - npub++; - } - } - *mlen = offset; - memset(prep, 0, 4096); - for (i = 0; i < 128; i++) { - secp256k1_scalar_clear(&s_orig[i]); - } - for (i = 0; i < 32; i++) { - secp256k1_scalar_clear(&sec[i]); - } - secp256k1_scalar_clear(&stmp); - return 1; -} - -SECP256K1_INLINE static int secp256k1_rangeproof_getheader_impl(int *offset, int *exp, int *mantissa, uint64_t *scale, - uint64_t *min_value, uint64_t *max_value, const unsigned char *proof, int plen) { - int i; - int has_nz_range; - int has_min; - if (plen < 65 || ((proof[*offset] & 128) != 0)) { - return 0; - } - has_nz_range = proof[*offset] & 64; - has_min = proof[*offset] & 32; - *exp = -1; - *mantissa = 0; - if (has_nz_range) { - *exp = proof[*offset] & 31; - *offset += 1; - if (*exp > 18) { - return 0; - } - *mantissa = proof[*offset] + 1; - if (*mantissa > 64) { - return 0; - } - *max_value = UINT64_MAX>>(64-*mantissa); - } else { - *max_value = 0; - } - *offset += 1; - *scale = 1; - for (i = 0; i < *exp; i++) { - if (*max_value > UINT64_MAX / 10) { - return 0; - } - *max_value *= 10; - *scale *= 10; - } - *min_value = 0; - if (has_min) { - if(plen - *offset < 8) { - return 0; - } - /*FIXME: Compact minvalue encoding?*/ - for (i = 0; i < 8; i++) { - *min_value = (*min_value << 8) | proof[*offset + i]; - } - *offset += 8; - } - if (*max_value > UINT64_MAX - *min_value) { - return 0; - } - *max_value += *min_value; - return 1; -} - -/* Verifies range proof (len plen) for 33-byte commit, the min/max values proven are put in the min/max arguments; returns 0 on failure 1 on success.*/ -SECP256K1_INLINE static int secp256k1_rangeproof_verify_impl(const secp256k1_ecmult_context* ecmult_ctx, - const secp256k1_ecmult_gen_context* ecmult_gen_ctx, - const secp256k1_pedersen_context* pedersen_ctx, const secp256k1_rangeproof_context* rangeproof_ctx, - unsigned char *blindout, uint64_t *value_out, unsigned char *message_out, int *outlen, const unsigned char *nonce, - uint64_t *min_value, uint64_t *max_value, const unsigned char *commit, const unsigned char *proof, int plen) { - secp256k1_gej accj; - secp256k1_gej pubs[128]; - secp256k1_ge c; - secp256k1_scalar s[128]; - secp256k1_scalar evalues[128]; /* Challenges, only used during proof rewind. */ - secp256k1_sha256_t sha256_m; - int rsizes[32]; - int ret; - int i; - size_t size; - int exp; - int mantissa; - int offset; - int rings; - int overflow; - int npub; - int offset_post_header; - uint64_t scale; - unsigned char signs[31]; - unsigned char m[33]; - const unsigned char *e0; - offset = 0; - if (!secp256k1_rangeproof_getheader_impl(&offset, &exp, &mantissa, &scale, min_value, max_value, proof, plen)) { - return 0; - } - offset_post_header = offset; - rings = 1; - rsizes[0] = 1; - npub = 1; - if (mantissa != 0) { - rings = (mantissa >> 1); - for (i = 0; i < rings; i++) { - rsizes[i] = 4; - } - npub = (mantissa >> 1) << 2; - if (mantissa & 1) { - rsizes[rings] = 2; - npub += rsizes[rings]; - rings++; - } - } - VERIFY_CHECK(rings <= 32); - if (plen - offset < 32 * (npub + rings - 1) + 32 + ((rings+6) >> 3)) { - return 0; - } - secp256k1_sha256_initialize(&sha256_m); - secp256k1_sha256_write(&sha256_m, commit, 33); - secp256k1_sha256_write(&sha256_m, proof, offset); - for(i = 0; i < rings - 1; i++) { - signs[i] = (proof[offset + ( i>> 3)] & (1 << (i & 7))) != 0; - } - offset += (rings + 6) >> 3; - if ((rings - 1) & 7) { - /* Number of coded blinded points is not a multiple of 8, force extra sign bits to 0 to reject mutation. */ - if ((proof[offset - 1] >> ((rings - 1) & 7)) != 0) { - return 0; - } - } - npub = 0; - secp256k1_gej_set_infinity(&accj); - if (*min_value) { - secp256k1_pedersen_ecmult_small(pedersen_ctx, &accj, *min_value); - } - for(i = 0; i < rings - 1; i++) { - memcpy(&m[1], &proof[offset], 32); - m[0] = 2 + signs[i]; - if (!secp256k1_eckey_pubkey_parse(&c, m, 33)) { - return 0; - } - secp256k1_sha256_write(&sha256_m, m, 33); - secp256k1_gej_set_ge(&pubs[npub], &c); - secp256k1_gej_add_ge_var(&accj, &accj, &c, NULL); - offset += 32; - npub += rsizes[i]; - } - secp256k1_gej_neg(&accj, &accj); - if (!secp256k1_eckey_pubkey_parse(&c, commit, 33)) { - return 0; - } - secp256k1_gej_add_ge_var(&pubs[npub], &accj, &c, NULL); - if (secp256k1_gej_is_infinity(&pubs[npub])) { - return 0; - } - secp256k1_rangeproof_pub_expand(rangeproof_ctx, pubs, exp, rsizes, rings); - npub += rsizes[rings - 1]; - e0 = &proof[offset]; - offset += 32; - for (i = 0; i < npub; i++) { - secp256k1_scalar_set_b32(&s[i], &proof[offset], &overflow); - if (overflow) { - return 0; - } - offset += 32; - } - if (offset != plen) { - /*Extra data found, reject.*/ - return 0; - } - secp256k1_sha256_finalize(&sha256_m, m); - ret = secp256k1_borromean_verify(ecmult_ctx, nonce ? evalues : NULL, e0, s, pubs, rsizes, rings, m, 32); - if (ret && nonce) { - /* Given the nonce, try rewinding the witness to recover its initial state. */ - secp256k1_scalar blind; - unsigned char commitrec[33]; - uint64_t vv; - if (!ecmult_gen_ctx) { - return 0; - } - if (!secp256k1_rangeproof_rewind_inner(&blind, &vv, message_out, outlen, evalues, s, rsizes, rings, nonce, commit, proof, offset_post_header)) { - return 0; - } - /* Unwind apparently successful, see if the commitment can be reconstructed. */ - /* FIXME: should check vv is in the mantissa's range. */ - vv = (vv * scale) + *min_value; - secp256k1_pedersen_ecmult(ecmult_gen_ctx, pedersen_ctx, &accj, &blind, vv); - if (secp256k1_gej_is_infinity(&accj)) { - return 0; - } - secp256k1_ge_set_gej(&c, &accj); - size = 33; - secp256k1_eckey_pubkey_serialize(&c, commitrec, &size, 1); - if (size != 33 || memcmp(commitrec, commit, 33) != 0) { - return 0; - } - if (blindout) { - secp256k1_scalar_get_b32(blindout, &blind); - } - if (value_out) { - *value_out = vv; - } - } - return ret; -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/rangeproof/tests_impl.h b/external/libwally-core/src/secp256k1/src/modules/rangeproof/tests_impl.h deleted file mode 100644 index e764e69ff..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/rangeproof/tests_impl.h +++ /dev/null @@ -1,281 +0,0 @@ -/********************************************************************** - * Copyright (c) 2015 Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef SECP256K1_MODULE_RANGEPROOF_TESTS -#define SECP256K1_MODULE_RANGEPROOF_TESTS - -#include "include/secp256k1_rangeproof.h" - -void test_pedersen(void) { - unsigned char commits[33*19]; - const unsigned char *cptr[19]; - unsigned char blinds[32*19]; - const unsigned char *bptr[19]; - secp256k1_scalar s; - uint64_t values[19]; - int64_t totalv; - int i; - int inputs; - int outputs; - int total; - inputs = (secp256k1_rand32() & 7) + 1; - outputs = (secp256k1_rand32() & 7) + 2; - total = inputs + outputs; - for (i = 0; i < 19; i++) { - cptr[i] = &commits[i * 33]; - bptr[i] = &blinds[i * 32]; - } - totalv = 0; - for (i = 0; i < inputs; i++) { - values[i] = secp256k1_rands64(0, INT64_MAX - totalv); - totalv += values[i]; - } - if (secp256k1_rand32() & 1) { - for (i = 0; i < outputs; i++) { - int64_t max = INT64_MAX; - if (totalv < 0) { - max += totalv; - } - values[i + inputs] = secp256k1_rands64(0, max); - totalv -= values[i + inputs]; - } - } else { - for (i = 0; i < outputs - 1; i++) { - values[i + inputs] = secp256k1_rands64(0, totalv); - totalv -= values[i + inputs]; - } - values[total - 1] = totalv >> (secp256k1_rand32() & 1); - totalv -= values[total - 1]; - } - for (i = 0; i < total - 1; i++) { - random_scalar_order(&s); - secp256k1_scalar_get_b32(&blinds[i * 32], &s); - } - CHECK(secp256k1_pedersen_blind_sum(ctx, &blinds[(total - 1) * 32], bptr, total - 1, inputs)); - for (i = 0; i < total; i++) { - CHECK(secp256k1_pedersen_commit(ctx, &commits[i * 33], &blinds[i * 32], values[i])); - } - CHECK(secp256k1_pedersen_verify_tally(ctx, cptr, inputs, &cptr[inputs], outputs, totalv)); - CHECK(!secp256k1_pedersen_verify_tally(ctx, cptr, inputs, &cptr[inputs], outputs, totalv + 1)); - random_scalar_order(&s); - for (i = 0; i < 4; i++) { - secp256k1_scalar_get_b32(&blinds[i * 32], &s); - } - values[0] = INT64_MAX; - values[1] = 0; - values[2] = 1; - for (i = 0; i < 3; i++) { - CHECK(secp256k1_pedersen_commit(ctx, &commits[i * 33], &blinds[i * 32], values[i])); - } - CHECK(secp256k1_pedersen_verify_tally(ctx, &cptr[1], 1, &cptr[2], 1, -1)); - CHECK(secp256k1_pedersen_verify_tally(ctx, &cptr[2], 1, &cptr[1], 1, 1)); - CHECK(secp256k1_pedersen_verify_tally(ctx, &cptr[0], 1, &cptr[0], 1, 0)); - CHECK(secp256k1_pedersen_verify_tally(ctx, &cptr[0], 1, &cptr[1], 1, INT64_MAX)); - CHECK(secp256k1_pedersen_verify_tally(ctx, &cptr[1], 1, &cptr[1], 1, 0)); - CHECK(secp256k1_pedersen_verify_tally(ctx, &cptr[1], 1, &cptr[0], 1, -INT64_MAX)); -} - -void test_borromean(void) { - unsigned char e0[32]; - secp256k1_scalar s[64]; - secp256k1_gej pubs[64]; - secp256k1_scalar k[8]; - secp256k1_scalar sec[8]; - secp256k1_ge ge; - secp256k1_scalar one; - unsigned char m[32]; - int rsizes[8]; - int secidx[8]; - int nrings; - int i; - int j; - int c; - secp256k1_rand256_test(m); - nrings = 1 + (secp256k1_rand32()&7); - c = 0; - secp256k1_scalar_set_int(&one, 1); - if (secp256k1_rand32()&1) { - secp256k1_scalar_negate(&one, &one); - } - for (i = 0; i < nrings; i++) { - rsizes[i] = 1 + (secp256k1_rand32()&7); - secidx[i] = secp256k1_rand32() % rsizes[i]; - random_scalar_order(&sec[i]); - random_scalar_order(&k[i]); - if(secp256k1_rand32()&7) { - sec[i] = one; - } - if(secp256k1_rand32()&7) { - k[i] = one; - } - for (j = 0; j < rsizes[i]; j++) { - random_scalar_order(&s[c + j]); - if(secp256k1_rand32()&7) { - s[i] = one; - } - if (j == secidx[i]) { - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubs[c + j], &sec[i]); - } else { - random_group_element_test(&ge); - random_group_element_jacobian_test(&pubs[c + j],&ge); - } - } - c += rsizes[i]; - } - CHECK(secp256k1_borromean_sign(&ctx->ecmult_ctx, &ctx->ecmult_gen_ctx, e0, s, pubs, k, sec, rsizes, secidx, nrings, m, 32)); - CHECK(secp256k1_borromean_verify(&ctx->ecmult_ctx, NULL, e0, s, pubs, rsizes, nrings, m, 32)); - i = secp256k1_rand32() % c; - secp256k1_scalar_negate(&s[i],&s[i]); - CHECK(!secp256k1_borromean_verify(&ctx->ecmult_ctx, NULL, e0, s, pubs, rsizes, nrings, m, 32)); - secp256k1_scalar_negate(&s[i],&s[i]); - secp256k1_scalar_set_int(&one, 1); - for(j = 0; j < 4; j++) { - i = secp256k1_rand32() % c; - if (secp256k1_rand32() & 1) { - secp256k1_gej_double_var(&pubs[i],&pubs[i], NULL); - } else { - secp256k1_scalar_add(&s[i],&s[i],&one); - } - CHECK(!secp256k1_borromean_verify(&ctx->ecmult_ctx, NULL, e0, s, pubs, rsizes, nrings, m, 32)); - } -} - -void test_rangeproof(void) { - const uint64_t testvs[11] = {0, 1, 5, 11, 65535, 65537, INT32_MAX, UINT32_MAX, INT64_MAX - 1, INT64_MAX, UINT64_MAX}; - unsigned char commit[33]; - unsigned char commit2[33]; - unsigned char proof[5134]; - unsigned char blind[32]; - unsigned char blindout[32]; - unsigned char message[4096]; - int mlen; - uint64_t v; - uint64_t vout; - uint64_t vmin; - uint64_t minv; - uint64_t maxv; - int len; - int i; - int j; - int k; - secp256k1_rand256(blind); - for (i = 0; i < 11; i++) { - v = testvs[i]; - CHECK(secp256k1_pedersen_commit(ctx, commit, blind, v)); - for (vmin = 0; vmin < (i<9 && i > 0 ? 2 : 1); vmin++) { - len = 5134; - CHECK(secp256k1_rangeproof_sign(ctx, proof, &len, vmin, commit, blind, commit, 0, 0, v)); - CHECK(len <= 5134); - mlen = 4096; - CHECK(secp256k1_rangeproof_rewind(ctx, blindout, &vout, message, &mlen, commit, &minv, &maxv, commit, proof, len)); - for (j = 0; j < mlen; j++) { - CHECK(message[j] == 0); - } - CHECK(mlen <= 4096); - CHECK(memcmp(blindout, blind, 32) == 0); - CHECK(vout == v); - CHECK(minv <= v); - CHECK(maxv >= v); - len = 5134; - CHECK(secp256k1_rangeproof_sign(ctx, proof, &len, v, commit, blind, commit, -1, 64, v)); - CHECK(len <= 73); - CHECK(secp256k1_rangeproof_rewind(ctx, blindout, &vout, NULL, NULL, commit, &minv, &maxv, commit, proof, len)); - CHECK(memcmp(blindout, blind, 32) == 0); - CHECK(vout == v); - CHECK(minv == v); - CHECK(maxv == v); - } - } - secp256k1_rand256(blind); - v = INT64_MAX - 1; - CHECK(secp256k1_pedersen_commit(ctx, commit, blind, v)); - for (i = 0; i < 19; i++) { - len = 5134; - CHECK(secp256k1_rangeproof_sign(ctx, proof, &len, 0, commit, blind, commit, i, 0, v)); - CHECK(secp256k1_rangeproof_verify(ctx, &minv, &maxv, commit, proof, len)); - CHECK(len <= 5134); - CHECK(minv <= v); - CHECK(maxv >= v); - } - secp256k1_rand256(blind); - { - /*Malleability test.*/ - v = secp256k1_rands64(0, 255); - CHECK(secp256k1_pedersen_commit(ctx, commit, blind, v)); - len = 5134; - CHECK(secp256k1_rangeproof_sign(ctx, proof, &len, 0, commit, blind, commit, 0, 3, v)); - CHECK(len <= 5134); - for (i = 0; i < len*8; i++) { - proof[i >> 3] ^= 1 << (i & 7); - CHECK(!secp256k1_rangeproof_verify(ctx, &minv, &maxv, commit, proof, len)); - proof[i >> 3] ^= 1 << (i & 7); - } - CHECK(secp256k1_rangeproof_verify(ctx, &minv, &maxv, commit, proof, len)); - CHECK(minv <= v); - CHECK(maxv >= v); - } - memcpy(commit2, commit, 33); - for (i = 0; i < 10 * count; i++) { - int exp; - int min_bits; - v = secp256k1_rands64(0, UINT64_MAX >> (secp256k1_rand32()&63)); - vmin = 0; - if ((v < INT64_MAX) && (secp256k1_rand32()&1)) { - vmin = secp256k1_rands64(0, v); - } - secp256k1_rand256(blind); - CHECK(secp256k1_pedersen_commit(ctx, commit, blind, v)); - len = 5134; - exp = (int)secp256k1_rands64(0,18)-(int)secp256k1_rands64(0,18); - if (exp < 0) { - exp = -exp; - } - min_bits = (int)secp256k1_rands64(0,64)-(int)secp256k1_rands64(0,64); - if (min_bits < 0) { - min_bits = -min_bits; - } - CHECK(secp256k1_rangeproof_sign(ctx, proof, &len, vmin, commit, blind, commit, exp, min_bits, v)); - CHECK(len <= 5134); - mlen = 4096; - CHECK(secp256k1_rangeproof_rewind(ctx, blindout, &vout, message, &mlen, commit, &minv, &maxv, commit, proof, len)); - for (j = 0; j < mlen; j++) { - CHECK(message[j] == 0); - } - CHECK(mlen <= 4096); - CHECK(memcmp(blindout, blind, 32) == 0); - CHECK(vout == v); - CHECK(minv <= v); - CHECK(maxv >= v); - CHECK(secp256k1_rangeproof_rewind(ctx, blindout, &vout, NULL, NULL, commit, &minv, &maxv, commit, proof, len)); - memcpy(commit2, commit, 33); - } - for (j = 0; j < 10; j++) { - for (i = 0; i < 96; i++) { - secp256k1_rand256(&proof[i * 32]); - } - for (k = 0; k < 128; k++) { - len = k; - CHECK(!secp256k1_rangeproof_verify(ctx, &minv, &maxv, commit2, proof, len)); - } - len = secp256k1_rands64(0, 3072); - CHECK(!secp256k1_rangeproof_verify(ctx, &minv, &maxv, commit2, proof, len)); - } -} - -void run_rangeproof_tests(void) { - int i; - secp256k1_pedersen_context_initialize(ctx); - secp256k1_rangeproof_context_initialize(ctx); - for (i = 0; i < 10*count; i++) { - test_pedersen(); - } - for (i = 0; i < 10*count; i++) { - test_borromean(); - } - test_rangeproof(); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/recovery/Makefile.am.include b/external/libwally-core/src/secp256k1/src/modules/recovery/Makefile.am.include deleted file mode 100644 index bf23c26e7..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/recovery/Makefile.am.include +++ /dev/null @@ -1,8 +0,0 @@ -include_HEADERS += include/secp256k1_recovery.h -noinst_HEADERS += src/modules/recovery/main_impl.h -noinst_HEADERS += src/modules/recovery/tests_impl.h -if USE_BENCHMARK -noinst_PROGRAMS += bench_recover -bench_recover_SOURCES = src/bench_recover.c -bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) -endif diff --git a/external/libwally-core/src/secp256k1/src/modules/recovery/main_impl.h b/external/libwally-core/src/secp256k1/src/modules/recovery/main_impl.h deleted file mode 100755 index 86f2f0cb2..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/recovery/main_impl.h +++ /dev/null @@ -1,193 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_MODULE_RECOVERY_MAIN_ -#define _SECP256K1_MODULE_RECOVERY_MAIN_ - -#include "include/secp256k1_recovery.h" - -static void secp256k1_ecdsa_recoverable_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, int* recid, const secp256k1_ecdsa_recoverable_signature* sig) { - (void)ctx; - if (sizeof(secp256k1_scalar) == 32) { - /* When the secp256k1_scalar type is exactly 32 byte, use its - * representation inside secp256k1_ecdsa_signature, as conversion is very fast. - * Note that secp256k1_ecdsa_signature_save must use the same representation. */ - memcpy(r, &sig->data[0], 32); - memcpy(s, &sig->data[32], 32); - } else { - secp256k1_scalar_set_b32(r, &sig->data[0], NULL); - secp256k1_scalar_set_b32(s, &sig->data[32], NULL); - } - *recid = sig->data[64]; -} - -static void secp256k1_ecdsa_recoverable_signature_save(secp256k1_ecdsa_recoverable_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s, int recid) { - if (sizeof(secp256k1_scalar) == 32) { - memcpy(&sig->data[0], r, 32); - memcpy(&sig->data[32], s, 32); - } else { - secp256k1_scalar_get_b32(&sig->data[0], r); - secp256k1_scalar_get_b32(&sig->data[32], s); - } - sig->data[64] = recid; -} - -int secp256k1_ecdsa_recoverable_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature* sig, const unsigned char *input64, int recid) { - secp256k1_scalar r, s; - int ret = 1; - int overflow = 0; - - (void)ctx; - ARG_CHECK(sig != NULL); - ARG_CHECK(input64 != NULL); - ARG_CHECK(recid >= 0 && recid <= 3); - - secp256k1_scalar_set_b32(&r, &input64[0], &overflow); - ret &= !overflow; - secp256k1_scalar_set_b32(&s, &input64[32], &overflow); - ret &= !overflow; - if (ret) { - secp256k1_ecdsa_recoverable_signature_save(sig, &r, &s, recid); - } else { - memset(sig, 0, sizeof(*sig)); - } - return ret; -} - -int secp256k1_ecdsa_recoverable_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature* sig) { - secp256k1_scalar r, s; - - (void)ctx; - ARG_CHECK(output64 != NULL); - ARG_CHECK(sig != NULL); - ARG_CHECK(recid != NULL); - - secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, recid, sig); - secp256k1_scalar_get_b32(&output64[0], &r); - secp256k1_scalar_get_b32(&output64[32], &s); - return 1; -} - -int secp256k1_ecdsa_recoverable_signature_convert(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const secp256k1_ecdsa_recoverable_signature* sigin) { - secp256k1_scalar r, s; - int recid; - - (void)ctx; - ARG_CHECK(sig != NULL); - ARG_CHECK(sigin != NULL); - - secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, sigin); - secp256k1_ecdsa_signature_save(sig, &r, &s); - return 1; -} - -static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) { - unsigned char brx[32]; - secp256k1_fe fx; - secp256k1_ge x; - secp256k1_gej xj; - secp256k1_scalar rn, u1, u2; - secp256k1_gej qj; - int r; - - if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { - return 0; - } - - secp256k1_scalar_get_b32(brx, sigr); - r = secp256k1_fe_set_b32(&fx, brx); - (void)r; - VERIFY_CHECK(r); /* brx comes from a scalar, so is less than the order; certainly less than p */ - if (recid & 2) { - if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { - return 0; - } - secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); - } - if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { - return 0; - } - secp256k1_gej_set_ge(&xj, &x); - secp256k1_scalar_inverse_var(&rn, sigr); - secp256k1_scalar_mul(&u1, &rn, message); - secp256k1_scalar_negate(&u1, &u1); - secp256k1_scalar_mul(&u2, &rn, sigs); - secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); - secp256k1_ge_set_gej_var(pubkey, &qj); - return !secp256k1_gej_is_infinity(&qj); -} - -int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { - secp256k1_scalar r, s; - secp256k1_scalar sec, non, msg; - int recid; - int ret = 0; - int overflow = 0; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(signature != NULL); - ARG_CHECK(seckey != NULL); - if (noncefp == NULL) { - noncefp = secp256k1_nonce_function_default; - } - - secp256k1_scalar_set_b32(&sec, seckey, &overflow); - /* Fail if the secret key is invalid. */ - if (!overflow && !secp256k1_scalar_is_zero(&sec)) { - unsigned char nonce32[32]; - unsigned int count = 0; - secp256k1_scalar_set_b32(&msg, msg32, NULL); - while (1) { - ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); - if (!ret) { - break; - } - secp256k1_scalar_set_b32(&non, nonce32, &overflow); - if (!secp256k1_scalar_is_zero(&non) && !overflow) { - if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, &recid)) { - break; - } - } - count++; - } - memset(nonce32, 0, 32); - secp256k1_scalar_clear(&msg); - secp256k1_scalar_clear(&non); - secp256k1_scalar_clear(&sec); - } - if (ret) { - secp256k1_ecdsa_recoverable_signature_save(signature, &r, &s, recid); - } else { - memset(signature, 0, sizeof(*signature)); - } - return ret; -} - -int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32) { - secp256k1_ge q; - secp256k1_scalar r, s; - secp256k1_scalar m; - int recid; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(signature != NULL); - ARG_CHECK(pubkey != NULL); - - secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, signature); - ARG_CHECK(recid >= 0 && recid < 4); - secp256k1_scalar_set_b32(&m, msg32, NULL); - if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &r, &s, &q, &m, recid)) { - secp256k1_pubkey_save(pubkey, &q); - return 1; - } else { - memset(pubkey, 0, sizeof(*pubkey)); - return 0; - } -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/recovery/tests_impl.h b/external/libwally-core/src/secp256k1/src/modules/recovery/tests_impl.h deleted file mode 100644 index 8932d5f0a..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/recovery/tests_impl.h +++ /dev/null @@ -1,250 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_MODULE_RECOVERY_TESTS_ -#define _SECP256K1_MODULE_RECOVERY_TESTS_ - -void test_ecdsa_recovery_end_to_end(void) { - unsigned char extra[32] = {0x00}; - unsigned char privkey[32]; - unsigned char message[32]; - secp256k1_ecdsa_signature signature[5]; - secp256k1_ecdsa_recoverable_signature rsignature[5]; - unsigned char sig[74]; - secp256k1_pubkey pubkey; - secp256k1_pubkey recpubkey; - int recid = 0; - - /* Generate a random key and message. */ - { - secp256k1_scalar msg, key; - random_scalar_order_test(&msg); - random_scalar_order_test(&key); - secp256k1_scalar_get_b32(privkey, &key); - secp256k1_scalar_get_b32(message, &msg); - } - - /* Construct and verify corresponding public key. */ - CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); - - /* Serialize/parse compact and verify/recover. */ - extra[0] = 0; - CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[0], message, privkey, NULL, NULL) == 1); - CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); - CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[4], message, privkey, NULL, NULL) == 1); - CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[1], message, privkey, NULL, extra) == 1); - extra[31] = 1; - CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[2], message, privkey, NULL, extra) == 1); - extra[31] = 0; - extra[0] = 1; - CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[3], message, privkey, NULL, extra) == 1); - CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); - CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); - CHECK(memcmp(&signature[4], &signature[0], 64) == 0); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); - memset(&rsignature[4], 0, sizeof(rsignature[4])); - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); - CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); - /* Parse compact (with recovery id) and recover. */ - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); - CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 1); - CHECK(memcmp(&pubkey, &recpubkey, sizeof(pubkey)) == 0); - /* Serialize/destroy/parse signature and verify again. */ - CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); - sig[secp256k1_rand_bits(6)] += 1 + secp256k1_rand_int(255); - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); - CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 0); - /* Recover again */ - CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 0 || - memcmp(&pubkey, &recpubkey, sizeof(pubkey)) != 0); -} - -/* Tests several edge cases. */ -void test_ecdsa_recovery_edge_cases(void) { - const unsigned char msg32[32] = { - 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', - 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', - 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', - 's', 's', 'a', 'g', 'e', '.', '.', '.' - }; - const unsigned char sig64[64] = { - /* Generated by signing the above message with nonce 'This is the nonce we will use...' - * and secret key 0 (which is not valid), resulting in recid 0. */ - 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, - 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, - 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, - 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, - 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, - 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, - 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, - 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 - }; - secp256k1_pubkey pubkey; - /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ - const unsigned char sigb64[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - secp256k1_pubkey pubkeyb; - secp256k1_ecdsa_recoverable_signature rsig; - secp256k1_ecdsa_signature sig; - int recid; - - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 0)); - CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 1)); - CHECK(secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 2)); - CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 3)); - CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); - - for (recid = 0; recid < 4; recid++) { - int i; - int recid2; - /* (4,4) encoded in DER. */ - unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; - unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; - unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; - unsigned char sigbderalt1[39] = { - 0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, - }; - unsigned char sigbderalt2[39] = { - 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - unsigned char sigbderalt3[40] = { - 0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, - }; - unsigned char sigbderalt4[40] = { - 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - }; - /* (order + r,4) encoded in DER. */ - unsigned char sigbderlong[40] = { - 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, - 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, - 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 - }; - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid) == 1); - CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 1); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 1); - for (recid2 = 0; recid2 < 4; recid2++) { - secp256k1_pubkey pubkey2b; - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid2) == 1); - CHECK(secp256k1_ecdsa_recover(ctx, &pubkey2b, &rsig, msg32) == 1); - /* Verifying with (order + r,4) should always fail. */ - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderlong, sizeof(sigbderlong)) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); - } - /* DER parsing tests. */ - /* Zero length r/s. */ - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zr, sizeof(sigcder_zr)) == 0); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zs, sizeof(sigcder_zs)) == 0); - /* Leading zeros. */ - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt1, sizeof(sigbderalt1)) == 0); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt2, sizeof(sigbderalt2)) == 0); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 0); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 0); - sigbderalt3[4] = 1; - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); - sigbderalt4[7] = 1; - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); - /* Damage signature. */ - sigbder[7]++; - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); - sigbder[7]--; - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, 6) == 0); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder) - 1) == 0); - for(i = 0; i < 8; i++) { - int c; - unsigned char orig = sigbder[i]; - /*Try every single-byte change.*/ - for (c = 0; c < 256; c++) { - if (c == orig ) { - continue; - } - sigbder[i] = c; - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 0 || secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); - } - sigbder[i] = orig; - } - } - - /* Test r/s equal to zero */ - { - /* (1,1) encoded in DER. */ - unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; - unsigned char sigc64[64] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - }; - secp256k1_pubkey pubkeyc; - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); - CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyc, &rsig, msg32) == 1); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 1); - sigcder[4] = 0; - sigc64[31] = 0; - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); - CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); - sigcder[4] = 1; - sigcder[7] = 0; - sigc64[31] = 1; - sigc64[63] = 0; - CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); - CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); - } -} - -void run_recovery_tests(void) { - int i; - for (i = 0; i < 64*count; i++) { - test_ecdsa_recovery_end_to_end(); - } - test_ecdsa_recovery_edge_cases(); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/schnorr/Makefile.am.include b/external/libwally-core/src/secp256k1/src/modules/schnorr/Makefile.am.include deleted file mode 100644 index f1af8e832..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/schnorr/Makefile.am.include +++ /dev/null @@ -1,10 +0,0 @@ -include_HEADERS += include/secp256k1_schnorr.h -noinst_HEADERS += src/modules/schnorr/main_impl.h -noinst_HEADERS += src/modules/schnorr/schnorr.h -noinst_HEADERS += src/modules/schnorr/schnorr_impl.h -noinst_HEADERS += src/modules/schnorr/tests_impl.h -if USE_BENCHMARK -noinst_PROGRAMS += bench_schnorr_verify -bench_schnorr_verify_SOURCES = src/bench_schnorr_verify.c -bench_schnorr_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) -endif diff --git a/external/libwally-core/src/secp256k1/src/modules/schnorr/main_impl.h b/external/libwally-core/src/secp256k1/src/modules/schnorr/main_impl.h deleted file mode 100755 index c88a7ea24..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/schnorr/main_impl.h +++ /dev/null @@ -1,164 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef SECP256K1_MODULE_SCHNORR_MAIN -#define SECP256K1_MODULE_SCHNORR_MAIN - -#include "include/secp256k1_schnorr.h" -#include "modules/schnorr/schnorr_impl.h" - -static void secp256k1_schnorr_msghash_sha256(unsigned char *h32, const unsigned char *r32, const unsigned char *msg32) { - secp256k1_sha256_t sha; - secp256k1_sha256_initialize(&sha); - secp256k1_sha256_write(&sha, r32, 32); - secp256k1_sha256_write(&sha, msg32, 32); - secp256k1_sha256_finalize(&sha, h32); -} - -static const unsigned char secp256k1_schnorr_algo16[17] = "Schnorr+SHA256 "; - -int secp256k1_schnorr_sign(const secp256k1_context* ctx, unsigned char *sig64, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { - secp256k1_scalar sec, non; - int ret = 0; - int overflow = 0; - unsigned char nonce32[32]; - unsigned int count = 0; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(sig64 != NULL); - ARG_CHECK(seckey != NULL); - if (noncefp == NULL) { - noncefp = secp256k1_nonce_function_default; - } - - secp256k1_scalar_set_b32(&sec, seckey, NULL); - while (1) { - ret = noncefp(nonce32, msg32, seckey, secp256k1_schnorr_algo16, (void*)noncedata, count); - if (!ret) { - break; - } - secp256k1_scalar_set_b32(&non, nonce32, &overflow); - if (!secp256k1_scalar_is_zero(&non) && !overflow) { - if (secp256k1_schnorr_sig_sign(&ctx->ecmult_gen_ctx, sig64, &sec, &non, NULL, secp256k1_schnorr_msghash_sha256, msg32)) { - break; - } - } - count++; - } - if (!ret) { - memset(sig64, 0, 64); - } - memset(nonce32, 0, 32); - secp256k1_scalar_clear(&non); - secp256k1_scalar_clear(&sec); - return ret; -} - -int secp256k1_schnorr_verify(const secp256k1_context* ctx, const unsigned char *sig64, const unsigned char *msg32, const secp256k1_pubkey *pubkey) { - secp256k1_ge q; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(sig64 != NULL); - ARG_CHECK(pubkey != NULL); - - secp256k1_pubkey_load(ctx, &q, pubkey); - return secp256k1_schnorr_sig_verify(&ctx->ecmult_ctx, sig64, &q, secp256k1_schnorr_msghash_sha256, msg32); -} - -int secp256k1_schnorr_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *sig64, const unsigned char *msg32) { - secp256k1_ge q; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(sig64 != NULL); - ARG_CHECK(pubkey != NULL); - - if (secp256k1_schnorr_sig_recover(&ctx->ecmult_ctx, sig64, &q, secp256k1_schnorr_msghash_sha256, msg32)) { - secp256k1_pubkey_save(pubkey, &q); - return 1; - } else { - memset(pubkey, 0, sizeof(*pubkey)); - return 0; - } -} - -int secp256k1_schnorr_generate_nonce_pair(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, unsigned char *privnonce32, const unsigned char *sec32, const unsigned char *msg32, secp256k1_nonce_function noncefp, const void* noncedata) { - int count = 0; - int ret = 1; - secp256k1_gej Qj; - secp256k1_ge Q; - secp256k1_scalar sec; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(sec32 != NULL); - ARG_CHECK(pubnonce != NULL); - ARG_CHECK(privnonce32 != NULL); - - if (noncefp == NULL) { - noncefp = secp256k1_nonce_function_default; - } - - do { - int overflow; - ret = noncefp(privnonce32, sec32, msg32, secp256k1_schnorr_algo16, (void*)noncedata, count++); - if (!ret) { - break; - } - secp256k1_scalar_set_b32(&sec, privnonce32, &overflow); - if (overflow || secp256k1_scalar_is_zero(&sec)) { - continue; - } - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &sec); - secp256k1_ge_set_gej(&Q, &Qj); - - secp256k1_pubkey_save(pubnonce, &Q); - break; - } while(1); - - secp256k1_scalar_clear(&sec); - if (!ret) { - memset(pubnonce, 0, sizeof(*pubnonce)); - } - return ret; -} - -int secp256k1_schnorr_partial_sign(const secp256k1_context* ctx, unsigned char *sig64, const unsigned char *msg32, const unsigned char *sec32, const secp256k1_pubkey *pubnonce_others, const unsigned char *secnonce32) { - int overflow = 0; - secp256k1_scalar sec, non; - secp256k1_ge pubnon; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(sig64 != NULL); - ARG_CHECK(sec32 != NULL); - ARG_CHECK(secnonce32 != NULL); - ARG_CHECK(pubnonce_others != NULL); - - secp256k1_scalar_set_b32(&sec, sec32, &overflow); - if (overflow || secp256k1_scalar_is_zero(&sec)) { - return -1; - } - secp256k1_scalar_set_b32(&non, secnonce32, &overflow); - if (overflow || secp256k1_scalar_is_zero(&non)) { - return -1; - } - secp256k1_pubkey_load(ctx, &pubnon, pubnonce_others); - return secp256k1_schnorr_sig_sign(&ctx->ecmult_gen_ctx, sig64, &sec, &non, &pubnon, secp256k1_schnorr_msghash_sha256, msg32); -} - -int secp256k1_schnorr_partial_combine(const secp256k1_context* ctx, unsigned char *sig64, const unsigned char * const *sig64sin, size_t n) { - ARG_CHECK(sig64 != NULL); - ARG_CHECK(n >= 1); - ARG_CHECK(sig64sin != NULL); - return secp256k1_schnorr_sig_combine(sig64, n, sig64sin); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/schnorr/schnorr.h b/external/libwally-core/src/secp256k1/src/modules/schnorr/schnorr.h deleted file mode 100644 index de18147bd..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/schnorr/schnorr.h +++ /dev/null @@ -1,20 +0,0 @@ -/*********************************************************************** - * Copyright (c) 2014-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php. * - ***********************************************************************/ - -#ifndef _SECP256K1_MODULE_SCHNORR_H_ -#define _SECP256K1_MODULE_SCHNORR_H_ - -#include "scalar.h" -#include "group.h" - -typedef void (*secp256k1_schnorr_msghash)(unsigned char *h32, const unsigned char *r32, const unsigned char *msg32); - -static int secp256k1_schnorr_sig_sign(const secp256k1_ecmult_gen_context* ctx, unsigned char *sig64, const secp256k1_scalar *key, const secp256k1_scalar *nonce, const secp256k1_ge *pubnonce, secp256k1_schnorr_msghash hash, const unsigned char *msg32); -static int secp256k1_schnorr_sig_verify(const secp256k1_ecmult_context* ctx, const unsigned char *sig64, const secp256k1_ge *pubkey, secp256k1_schnorr_msghash hash, const unsigned char *msg32); -static int secp256k1_schnorr_sig_recover(const secp256k1_ecmult_context* ctx, const unsigned char *sig64, secp256k1_ge *pubkey, secp256k1_schnorr_msghash hash, const unsigned char *msg32); -static int secp256k1_schnorr_sig_combine(unsigned char *sig64, size_t n, const unsigned char * const *sig64ins); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/schnorr/schnorr_impl.h b/external/libwally-core/src/secp256k1/src/modules/schnorr/schnorr_impl.h deleted file mode 100644 index e13ab6db7..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/schnorr/schnorr_impl.h +++ /dev/null @@ -1,207 +0,0 @@ -/*********************************************************************** - * Copyright (c) 2014-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php. * - ***********************************************************************/ - -#ifndef _SECP256K1_SCHNORR_IMPL_H_ -#define _SECP256K1_SCHNORR_IMPL_H_ - -#include - -#include "schnorr.h" -#include "num.h" -#include "field.h" -#include "group.h" -#include "ecmult.h" -#include "ecmult_gen.h" - -/** - * Custom Schnorr-based signature scheme. They support multiparty signing, public key - * recovery and batch validation. - * - * Rationale for verifying R's y coordinate: - * In order to support batch validation and public key recovery, the full R point must - * be known to verifiers, rather than just its x coordinate. In order to not risk - * being more strict in batch validation than normal validation, validators must be - * required to reject signatures with incorrect y coordinate. This is only possible - * by including a (relatively slow) field inverse, or a field square root. However, - * batch validation offers potentially much higher benefits than this cost. - * - * Rationale for having an implicit y coordinate oddness: - * If we commit to having the full R point known to verifiers, there are two mechanism. - * Either include its oddness in the signature, or give it an implicit fixed value. - * As the R y coordinate can be flipped by a simple negation of the nonce, we choose the - * latter, as it comes with nearly zero impact on signing or validation performance, and - * saves a byte in the signature. - * - * Signing: - * Inputs: 32-byte message m, 32-byte scalar key x (!=0), 32-byte scalar nonce k (!=0) - * - * Compute point R = k * G. Reject nonce if R's y coordinate is odd (or negate nonce). - * Compute 32-byte r, the serialization of R's x coordinate. - * Compute scalar h = Hash(r || m). Reject nonce if h == 0 or h >= order. - * Compute scalar s = k - h * x. - * The signature is (r, s). - * - * - * Verification: - * Inputs: 32-byte message m, public key point Q, signature: (32-byte r, scalar s) - * - * Signature is invalid if s >= order. - * Signature is invalid if r >= p. - * Compute scalar h = Hash(r || m). Signature is invalid if h == 0 or h >= order. - * Option 1 (faster for single verification): - * Compute point R = h * Q + s * G. Signature is invalid if R is infinity or R's y coordinate is odd. - * Signature is valid if the serialization of R's x coordinate equals r. - * Option 2 (allows batch validation and pubkey recovery): - * Decompress x coordinate r into point R, with odd y coordinate. Fail if R is not on the curve. - * Signature is valid if R + h * Q + s * G == 0. - */ - -static int secp256k1_schnorr_sig_sign(const secp256k1_ecmult_gen_context* ctx, unsigned char *sig64, const secp256k1_scalar *key, const secp256k1_scalar *nonce, const secp256k1_ge *pubnonce, secp256k1_schnorr_msghash hash, const unsigned char *msg32) { - secp256k1_gej Rj; - secp256k1_ge Ra; - unsigned char h32[32]; - secp256k1_scalar h, s; - int overflow; - secp256k1_scalar n; - - if (secp256k1_scalar_is_zero(key) || secp256k1_scalar_is_zero(nonce)) { - return 0; - } - n = *nonce; - - secp256k1_ecmult_gen(ctx, &Rj, &n); - if (pubnonce != NULL) { - secp256k1_gej_add_ge(&Rj, &Rj, pubnonce); - } - secp256k1_ge_set_gej(&Ra, &Rj); - secp256k1_fe_normalize(&Ra.y); - if (secp256k1_fe_is_odd(&Ra.y)) { - /* R's y coordinate is odd, which is not allowed (see rationale above). - Force it to be even by negating the nonce. Note that this even works - for multiparty signing, as the R point is known to all participants, - which can all decide to flip the sign in unison, resulting in the - overall R point to be negated too. */ - secp256k1_scalar_negate(&n, &n); - } - secp256k1_fe_normalize(&Ra.x); - secp256k1_fe_get_b32(sig64, &Ra.x); - hash(h32, sig64, msg32); - overflow = 0; - secp256k1_scalar_set_b32(&h, h32, &overflow); - if (overflow || secp256k1_scalar_is_zero(&h)) { - secp256k1_scalar_clear(&n); - return 0; - } - secp256k1_scalar_mul(&s, &h, key); - secp256k1_scalar_negate(&s, &s); - secp256k1_scalar_add(&s, &s, &n); - secp256k1_scalar_clear(&n); - secp256k1_scalar_get_b32(sig64 + 32, &s); - return 1; -} - -static int secp256k1_schnorr_sig_verify(const secp256k1_ecmult_context* ctx, const unsigned char *sig64, const secp256k1_ge *pubkey, secp256k1_schnorr_msghash hash, const unsigned char *msg32) { - secp256k1_gej Qj, Rj; - secp256k1_ge Ra; - secp256k1_fe Rx; - secp256k1_scalar h, s; - unsigned char hh[32]; - int overflow; - - if (secp256k1_ge_is_infinity(pubkey)) { - return 0; - } - hash(hh, sig64, msg32); - overflow = 0; - secp256k1_scalar_set_b32(&h, hh, &overflow); - if (overflow || secp256k1_scalar_is_zero(&h)) { - return 0; - } - overflow = 0; - secp256k1_scalar_set_b32(&s, sig64 + 32, &overflow); - if (overflow) { - return 0; - } - if (!secp256k1_fe_set_b32(&Rx, sig64)) { - return 0; - } - secp256k1_gej_set_ge(&Qj, pubkey); - secp256k1_ecmult(ctx, &Rj, &Qj, &h, &s); - if (secp256k1_gej_is_infinity(&Rj)) { - return 0; - } - secp256k1_ge_set_gej_var(&Ra, &Rj); - secp256k1_fe_normalize_var(&Ra.y); - if (secp256k1_fe_is_odd(&Ra.y)) { - return 0; - } - return secp256k1_fe_equal_var(&Rx, &Ra.x); -} - -static int secp256k1_schnorr_sig_recover(const secp256k1_ecmult_context* ctx, const unsigned char *sig64, secp256k1_ge *pubkey, secp256k1_schnorr_msghash hash, const unsigned char *msg32) { - secp256k1_gej Qj, Rj; - secp256k1_ge Ra; - secp256k1_fe Rx; - secp256k1_scalar h, s; - unsigned char hh[32]; - int overflow; - - hash(hh, sig64, msg32); - overflow = 0; - secp256k1_scalar_set_b32(&h, hh, &overflow); - if (overflow || secp256k1_scalar_is_zero(&h)) { - return 0; - } - overflow = 0; - secp256k1_scalar_set_b32(&s, sig64 + 32, &overflow); - if (overflow) { - return 0; - } - if (!secp256k1_fe_set_b32(&Rx, sig64)) { - return 0; - } - if (!secp256k1_ge_set_xo_var(&Ra, &Rx, 0)) { - return 0; - } - secp256k1_gej_set_ge(&Rj, &Ra); - secp256k1_scalar_inverse_var(&h, &h); - secp256k1_scalar_negate(&s, &s); - secp256k1_scalar_mul(&s, &s, &h); - secp256k1_ecmult(ctx, &Qj, &Rj, &h, &s); - if (secp256k1_gej_is_infinity(&Qj)) { - return 0; - } - secp256k1_ge_set_gej(pubkey, &Qj); - return 1; -} - -static int secp256k1_schnorr_sig_combine(unsigned char *sig64, size_t n, const unsigned char * const *sig64ins) { - secp256k1_scalar s = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); - size_t i; - for (i = 0; i < n; i++) { - secp256k1_scalar si; - int overflow; - secp256k1_scalar_set_b32(&si, sig64ins[i] + 32, &overflow); - if (overflow) { - return -1; - } - if (i) { - if (memcmp(sig64ins[i - 1], sig64ins[i], 32) != 0) { - return -1; - } - } - secp256k1_scalar_add(&s, &s, &si); - } - if (secp256k1_scalar_is_zero(&s)) { - return 0; - } - memcpy(sig64, sig64ins[0], 32); - secp256k1_scalar_get_b32(sig64 + 32, &s); - secp256k1_scalar_clear(&s); - return 1; -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/modules/schnorr/tests_impl.h b/external/libwally-core/src/secp256k1/src/modules/schnorr/tests_impl.h deleted file mode 100644 index 5bd14a03e..000000000 --- a/external/libwally-core/src/secp256k1/src/modules/schnorr/tests_impl.h +++ /dev/null @@ -1,175 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef SECP256K1_MODULE_SCHNORR_TESTS -#define SECP256K1_MODULE_SCHNORR_TESTS - -#include "include/secp256k1_schnorr.h" - -void test_schnorr_end_to_end(void) { - unsigned char privkey[32]; - unsigned char message[32]; - unsigned char schnorr_signature[64]; - secp256k1_pubkey pubkey, recpubkey; - - /* Generate a random key and message. */ - { - secp256k1_scalar key; - random_scalar_order_test(&key); - secp256k1_scalar_get_b32(privkey, &key); - secp256k1_rand256_test(message); - } - - /* Construct and verify corresponding public key. */ - CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); - - /* Schnorr sign. */ - CHECK(secp256k1_schnorr_sign(ctx, schnorr_signature, message, privkey, NULL, NULL) == 1); - CHECK(secp256k1_schnorr_verify(ctx, schnorr_signature, message, &pubkey) == 1); - CHECK(secp256k1_schnorr_recover(ctx, &recpubkey, schnorr_signature, message) == 1); - CHECK(memcmp(&pubkey, &recpubkey, sizeof(pubkey)) == 0); - /* Destroy signature and verify again. */ - schnorr_signature[secp256k1_rand_bits(6)] += 1 + secp256k1_rand_int(255); - CHECK(secp256k1_schnorr_verify(ctx, schnorr_signature, message, &pubkey) == 0); - CHECK(secp256k1_schnorr_recover(ctx, &recpubkey, schnorr_signature, message) != 1 || - memcmp(&pubkey, &recpubkey, sizeof(pubkey)) != 0); -} - -/** Horribly broken hash function. Do not use for anything but tests. */ -void test_schnorr_hash(unsigned char *h32, const unsigned char *r32, const unsigned char *msg32) { - int i; - for (i = 0; i < 32; i++) { - h32[i] = r32[i] ^ msg32[i]; - } -} - -void test_schnorr_sign_verify(void) { - unsigned char msg32[32]; - unsigned char sig64[3][64]; - secp256k1_gej pubkeyj[3]; - secp256k1_ge pubkey[3]; - secp256k1_scalar nonce[3], key[3]; - int i = 0; - int k; - - secp256k1_rand256_test(msg32); - - for (k = 0; k < 3; k++) { - random_scalar_order_test(&key[k]); - - do { - random_scalar_order_test(&nonce[k]); - if (secp256k1_schnorr_sig_sign(&ctx->ecmult_gen_ctx, sig64[k], &key[k], &nonce[k], NULL, &test_schnorr_hash, msg32)) { - break; - } - } while(1); - - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubkeyj[k], &key[k]); - secp256k1_ge_set_gej_var(&pubkey[k], &pubkeyj[k]); - CHECK(secp256k1_schnorr_sig_verify(&ctx->ecmult_ctx, sig64[k], &pubkey[k], &test_schnorr_hash, msg32)); - - for (i = 0; i < 4; i++) { - int pos = secp256k1_rand_bits(6); - int mod = 1 + secp256k1_rand_int(255); - sig64[k][pos] ^= mod; - CHECK(secp256k1_schnorr_sig_verify(&ctx->ecmult_ctx, sig64[k], &pubkey[k], &test_schnorr_hash, msg32) == 0); - sig64[k][pos] ^= mod; - } - } -} - -void test_schnorr_threshold(void) { - unsigned char msg[32]; - unsigned char sec[5][32]; - secp256k1_pubkey pub[5]; - unsigned char nonce[5][32]; - secp256k1_pubkey pubnonce[5]; - unsigned char sig[5][64]; - const unsigned char* sigs[5]; - unsigned char allsig[64]; - const secp256k1_pubkey* pubs[5]; - secp256k1_pubkey allpub; - int n, i; - int damage; - int ret = 0; - - damage = secp256k1_rand_bits(1) ? (1 + secp256k1_rand_int(4)) : 0; - secp256k1_rand256_test(msg); - n = 2 + secp256k1_rand_int(4); - for (i = 0; i < n; i++) { - do { - secp256k1_rand256_test(sec[i]); - } while (!secp256k1_ec_seckey_verify(ctx, sec[i])); - CHECK(secp256k1_ec_pubkey_create(ctx, &pub[i], sec[i])); - CHECK(secp256k1_schnorr_generate_nonce_pair(ctx, &pubnonce[i], nonce[i], msg, sec[i], NULL, NULL)); - pubs[i] = &pub[i]; - } - if (damage == 1) { - nonce[secp256k1_rand_int(n)][secp256k1_rand_int(32)] ^= 1 + secp256k1_rand_int(255); - } else if (damage == 2) { - sec[secp256k1_rand_int(n)][secp256k1_rand_int(32)] ^= 1 + secp256k1_rand_int(255); - } - for (i = 0; i < n; i++) { - secp256k1_pubkey allpubnonce; - const secp256k1_pubkey *pubnonces[4]; - int j; - for (j = 0; j < i; j++) { - pubnonces[j] = &pubnonce[j]; - } - for (j = i + 1; j < n; j++) { - pubnonces[j - 1] = &pubnonce[j]; - } - CHECK(secp256k1_ec_pubkey_combine(ctx, &allpubnonce, pubnonces, n - 1)); - ret |= (secp256k1_schnorr_partial_sign(ctx, sig[i], msg, sec[i], &allpubnonce, nonce[i]) != 1) * 1; - sigs[i] = sig[i]; - } - if (damage == 3) { - sig[secp256k1_rand_int(n)][secp256k1_rand_bits(6)] ^= 1 + secp256k1_rand_int(255); - } - ret |= (secp256k1_ec_pubkey_combine(ctx, &allpub, pubs, n) != 1) * 2; - if ((ret & 1) == 0) { - ret |= (secp256k1_schnorr_partial_combine(ctx, allsig, sigs, n) != 1) * 4; - } - if (damage == 4) { - allsig[secp256k1_rand_int(32)] ^= 1 + secp256k1_rand_int(255); - } - if ((ret & 7) == 0) { - ret |= (secp256k1_schnorr_verify(ctx, allsig, msg, &allpub) != 1) * 8; - } - CHECK((ret == 0) == (damage == 0)); -} - -void test_schnorr_recovery(void) { - unsigned char msg32[32]; - unsigned char sig64[64]; - secp256k1_ge Q; - - secp256k1_rand256_test(msg32); - secp256k1_rand256_test(sig64); - secp256k1_rand256_test(sig64 + 32); - if (secp256k1_schnorr_sig_recover(&ctx->ecmult_ctx, sig64, &Q, &test_schnorr_hash, msg32) == 1) { - CHECK(secp256k1_schnorr_sig_verify(&ctx->ecmult_ctx, sig64, &Q, &test_schnorr_hash, msg32) == 1); - } -} - -void run_schnorr_tests(void) { - int i; - for (i = 0; i < 32*count; i++) { - test_schnorr_end_to_end(); - } - for (i = 0; i < 32 * count; i++) { - test_schnorr_sign_verify(); - } - for (i = 0; i < 16 * count; i++) { - test_schnorr_recovery(); - } - for (i = 0; i < 10 * count; i++) { - test_schnorr_threshold(); - } -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/num.h b/external/libwally-core/src/secp256k1/src/num.h deleted file mode 100644 index 7bb9c5be8..000000000 --- a/external/libwally-core/src/secp256k1/src/num.h +++ /dev/null @@ -1,74 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_NUM_ -#define _SECP256K1_NUM_ - -#ifndef USE_NUM_NONE - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#if defined(USE_NUM_GMP) -#include "num_gmp.h" -#else -#error "Please select num implementation" -#endif - -/** Copy a number. */ -static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a); - -/** Convert a number's absolute value to a binary big-endian string. - * There must be enough place. */ -static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a); - -/** Set a number to the value of a binary big-endian string. */ -static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen); - -/** Compute a modular inverse. The input must be less than the modulus. */ -static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m); - -/** Compute the jacobi symbol (a|b). b must be positive and odd. */ -static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b); - -/** Compare the absolute value of two numbers. */ -static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b); - -/** Test whether two number are equal (including sign). */ -static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b); - -/** Add two (signed) numbers. */ -static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); - -/** Subtract two (signed) numbers. */ -static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); - -/** Multiply two (signed) numbers. */ -static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); - -/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1, - even if r was negative. */ -static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m); - -/** Right-shift the passed number by bits bits. */ -static void secp256k1_num_shift(secp256k1_num *r, int bits); - -/** Check whether a number is zero. */ -static int secp256k1_num_is_zero(const secp256k1_num *a); - -/** Check whether a number is one. */ -static int secp256k1_num_is_one(const secp256k1_num *a); - -/** Check whether a number is strictly negative. */ -static int secp256k1_num_is_neg(const secp256k1_num *a); - -/** Change a number's sign. */ -static void secp256k1_num_negate(secp256k1_num *r); - -#endif - -#endif diff --git a/external/libwally-core/src/secp256k1/src/num_gmp.h b/external/libwally-core/src/secp256k1/src/num_gmp.h deleted file mode 100644 index 7dd813088..000000000 --- a/external/libwally-core/src/secp256k1/src/num_gmp.h +++ /dev/null @@ -1,20 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_NUM_REPR_ -#define _SECP256K1_NUM_REPR_ - -#include - -#define NUM_LIMBS ((256+GMP_NUMB_BITS-1)/GMP_NUMB_BITS) - -typedef struct { - mp_limb_t data[2*NUM_LIMBS]; - int neg; - int limbs; -} secp256k1_num; - -#endif diff --git a/external/libwally-core/src/secp256k1/src/num_gmp_impl.h b/external/libwally-core/src/secp256k1/src/num_gmp_impl.h deleted file mode 100644 index 3a46495ee..000000000 --- a/external/libwally-core/src/secp256k1/src/num_gmp_impl.h +++ /dev/null @@ -1,288 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_NUM_REPR_IMPL_H_ -#define _SECP256K1_NUM_REPR_IMPL_H_ - -#include -#include -#include - -#include "util.h" -#include "num.h" - -#ifdef VERIFY -static void secp256k1_num_sanity(const secp256k1_num *a) { - VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0)); -} -#else -#define secp256k1_num_sanity(a) do { } while(0) -#endif - -static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a) { - *r = *a; -} - -static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a) { - unsigned char tmp[65]; - int len = 0; - int shift = 0; - if (a->limbs>1 || a->data[0] != 0) { - len = mpn_get_str(tmp, 256, (mp_limb_t*)a->data, a->limbs); - } - while (shift < len && tmp[shift] == 0) shift++; - VERIFY_CHECK(len-shift <= (int)rlen); - memset(r, 0, rlen - len + shift); - if (len > shift) { - memcpy(r + rlen - len + shift, tmp + shift, len - shift); - } - memset(tmp, 0, sizeof(tmp)); -} - -static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen) { - int len; - VERIFY_CHECK(alen > 0); - VERIFY_CHECK(alen <= 64); - len = mpn_set_str(r->data, a, alen, 256); - if (len == 0) { - r->data[0] = 0; - len = 1; - } - VERIFY_CHECK(len <= NUM_LIMBS*2); - r->limbs = len; - r->neg = 0; - while (r->limbs > 1 && r->data[r->limbs-1]==0) { - r->limbs--; - } -} - -static void secp256k1_num_add_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { - mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs); - r->limbs = a->limbs; - if (c != 0) { - VERIFY_CHECK(r->limbs < 2*NUM_LIMBS); - r->data[r->limbs++] = c; - } -} - -static void secp256k1_num_sub_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { - mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs); - (void)c; - VERIFY_CHECK(c == 0); - r->limbs = a->limbs; - while (r->limbs > 1 && r->data[r->limbs-1]==0) { - r->limbs--; - } -} - -static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m) { - secp256k1_num_sanity(r); - secp256k1_num_sanity(m); - - if (r->limbs >= m->limbs) { - mp_limb_t t[2*NUM_LIMBS]; - mpn_tdiv_qr(t, r->data, 0, r->data, r->limbs, m->data, m->limbs); - memset(t, 0, sizeof(t)); - r->limbs = m->limbs; - while (r->limbs > 1 && r->data[r->limbs-1]==0) { - r->limbs--; - } - } - - if (r->neg && (r->limbs > 1 || r->data[0] != 0)) { - secp256k1_num_sub_abs(r, m, r); - r->neg = 0; - } -} - -static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m) { - int i; - mp_limb_t g[NUM_LIMBS+1]; - mp_limb_t u[NUM_LIMBS+1]; - mp_limb_t v[NUM_LIMBS+1]; - mp_size_t sn; - mp_size_t gn; - secp256k1_num_sanity(a); - secp256k1_num_sanity(m); - - /** mpn_gcdext computes: (G,S) = gcdext(U,V), where - * * G = gcd(U,V) - * * G = U*S + V*T - * * U has equal or more limbs than V, and V has no padding - * If we set U to be (a padded version of) a, and V = m: - * G = a*S + m*T - * G = a*S mod m - * Assuming G=1: - * S = 1/a mod m - */ - VERIFY_CHECK(m->limbs <= NUM_LIMBS); - VERIFY_CHECK(m->data[m->limbs-1] != 0); - for (i = 0; i < m->limbs; i++) { - u[i] = (i < a->limbs) ? a->data[i] : 0; - v[i] = m->data[i]; - } - sn = NUM_LIMBS+1; - gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs); - (void)gn; - VERIFY_CHECK(gn == 1); - VERIFY_CHECK(g[0] == 1); - r->neg = a->neg ^ m->neg; - if (sn < 0) { - mpn_sub(r->data, m->data, m->limbs, r->data, -sn); - r->limbs = m->limbs; - while (r->limbs > 1 && r->data[r->limbs-1]==0) { - r->limbs--; - } - } else { - r->limbs = sn; - } - memset(g, 0, sizeof(g)); - memset(u, 0, sizeof(u)); - memset(v, 0, sizeof(v)); -} - -static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b) { - int ret; - mpz_t ga, gb; - secp256k1_num_sanity(a); - secp256k1_num_sanity(b); - VERIFY_CHECK(!b->neg && (b->limbs > 0) && (b->data[0] & 1)); - - mpz_inits(ga, gb, NULL); - - mpz_import(gb, b->limbs, -1, sizeof(mp_limb_t), 0, 0, b->data); - mpz_import(ga, a->limbs, -1, sizeof(mp_limb_t), 0, 0, a->data); - if (a->neg) { - mpz_neg(ga, ga); - } - - ret = mpz_jacobi(ga, gb); - - mpz_clears(ga, gb, NULL); - - return ret; -} - -static int secp256k1_num_is_one(const secp256k1_num *a) { - return (a->limbs == 1 && a->data[0] == 1); -} - -static int secp256k1_num_is_zero(const secp256k1_num *a) { - return (a->limbs == 1 && a->data[0] == 0); -} - -static int secp256k1_num_is_neg(const secp256k1_num *a) { - return (a->limbs > 1 || a->data[0] != 0) && a->neg; -} - -static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b) { - if (a->limbs > b->limbs) { - return 1; - } - if (a->limbs < b->limbs) { - return -1; - } - return mpn_cmp(a->data, b->data, a->limbs); -} - -static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b) { - if (a->limbs > b->limbs) { - return 0; - } - if (a->limbs < b->limbs) { - return 0; - } - if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) { - return 0; - } - return mpn_cmp(a->data, b->data, a->limbs) == 0; -} - -static void secp256k1_num_subadd(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b, int bneg) { - if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */ - r->neg = a->neg; - if (a->limbs >= b->limbs) { - secp256k1_num_add_abs(r, a, b); - } else { - secp256k1_num_add_abs(r, b, a); - } - } else { - if (secp256k1_num_cmp(a, b) > 0) { - r->neg = a->neg; - secp256k1_num_sub_abs(r, a, b); - } else { - r->neg = b->neg ^ bneg; - secp256k1_num_sub_abs(r, b, a); - } - } -} - -static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { - secp256k1_num_sanity(a); - secp256k1_num_sanity(b); - secp256k1_num_subadd(r, a, b, 0); -} - -static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { - secp256k1_num_sanity(a); - secp256k1_num_sanity(b); - secp256k1_num_subadd(r, a, b, 1); -} - -static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { - mp_limb_t tmp[2*NUM_LIMBS+1]; - secp256k1_num_sanity(a); - secp256k1_num_sanity(b); - - VERIFY_CHECK(a->limbs + b->limbs <= 2*NUM_LIMBS+1); - if ((a->limbs==1 && a->data[0]==0) || (b->limbs==1 && b->data[0]==0)) { - r->limbs = 1; - r->neg = 0; - r->data[0] = 0; - return; - } - if (a->limbs >= b->limbs) { - mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs); - } else { - mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs); - } - r->limbs = a->limbs + b->limbs; - if (r->limbs > 1 && tmp[r->limbs - 1]==0) { - r->limbs--; - } - VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS); - mpn_copyi(r->data, tmp, r->limbs); - r->neg = a->neg ^ b->neg; - memset(tmp, 0, sizeof(tmp)); -} - -static void secp256k1_num_shift(secp256k1_num *r, int bits) { - if (bits % GMP_NUMB_BITS) { - /* Shift within limbs. */ - mpn_rshift(r->data, r->data, r->limbs, bits % GMP_NUMB_BITS); - } - if (bits >= GMP_NUMB_BITS) { - int i; - /* Shift full limbs. */ - for (i = 0; i < r->limbs; i++) { - int index = i + (bits / GMP_NUMB_BITS); - if (index < r->limbs && index < 2*NUM_LIMBS) { - r->data[i] = r->data[index]; - } else { - r->data[i] = 0; - } - } - } - while (r->limbs>1 && r->data[r->limbs-1]==0) { - r->limbs--; - } -} - -static void secp256k1_num_negate(secp256k1_num *r) { - r->neg ^= 1; -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/num_impl.h b/external/libwally-core/src/secp256k1/src/num_impl.h deleted file mode 100644 index 0b0e3a072..000000000 --- a/external/libwally-core/src/secp256k1/src/num_impl.h +++ /dev/null @@ -1,24 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_NUM_IMPL_H_ -#define _SECP256K1_NUM_IMPL_H_ - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#include "num.h" - -#if defined(USE_NUM_GMP) -#include "num_gmp_impl.h" -#elif defined(USE_NUM_NONE) -/* Nothing. */ -#else -#error "Please select num implementation" -#endif - -#endif diff --git a/external/libwally-core/src/secp256k1/src/scalar.h b/external/libwally-core/src/secp256k1/src/scalar.h deleted file mode 100644 index b590ccd6d..000000000 --- a/external/libwally-core/src/secp256k1/src/scalar.h +++ /dev/null @@ -1,104 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_SCALAR_ -#define _SECP256K1_SCALAR_ - -#include "num.h" - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#if defined(USE_SCALAR_4X64) -#include "scalar_4x64.h" -#elif defined(USE_SCALAR_8X32) -#include "scalar_8x32.h" -#else -#error "Please select scalar implementation" -#endif - -/** Clear a scalar to prevent the leak of sensitive data. */ -static void secp256k1_scalar_clear(secp256k1_scalar *r); - -/** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */ -static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count); - -/** Access bits from a scalar. Not constant time. */ -static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count); - -/** Set a scalar from a big endian byte array. */ -static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow); - -/** Set a scalar to an unsigned integer. */ -static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v); - -/** Convert a scalar to a byte array. */ -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a); - -/** Add two scalars together (modulo the group order). Returns whether it overflowed. */ -static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); - -/** Conditionally add a power of two to a scalar. The result is not allowed to overflow. */ -static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag); - -/** Multiply two scalars (modulo the group order). */ -static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); - -/** Shift a scalar right by some amount strictly between 0 and 16, returning - * the low bits that were shifted off */ -static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n); - -/** Compute the square of a scalar (modulo the group order). */ -static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a); - -/** Compute the inverse of a scalar (modulo the group order). */ -static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a); - -/** Compute the inverse of a scalar (modulo the group order), without constant-time guarantee. */ -static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *a); - -/** Compute the complement of a scalar (modulo the group order). */ -static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a); - -/** Check whether a scalar equals zero. */ -static int secp256k1_scalar_is_zero(const secp256k1_scalar *a); - -/** Check whether a scalar equals one. */ -static int secp256k1_scalar_is_one(const secp256k1_scalar *a); - -/** Check whether a scalar, considered as an nonnegative integer, is even. */ -static int secp256k1_scalar_is_even(const secp256k1_scalar *a); - -/** Check whether a scalar is higher than the group order divided by 2. */ -static int secp256k1_scalar_is_high(const secp256k1_scalar *a); - -/** Conditionally negate a number, in constant time. - * Returns -1 if the number was negated, 1 otherwise */ -static int secp256k1_scalar_cond_negate(secp256k1_scalar *a, int flag); - -#ifndef USE_NUM_NONE -/** Convert a scalar to a number. */ -static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a); - -/** Get the order of the group as a number. */ -static void secp256k1_scalar_order_get_num(secp256k1_num *r); -#endif - -/** Compare two scalars. */ -static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b); - -#ifdef USE_ENDOMORPHISM -/** Find r1 and r2 such that r1+r2*2^128 = a. */ -static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); -/** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */ -static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); -#endif - -/** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */ -static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/scalar_4x64.h b/external/libwally-core/src/secp256k1/src/scalar_4x64.h deleted file mode 100644 index cff406038..000000000 --- a/external/libwally-core/src/secp256k1/src/scalar_4x64.h +++ /dev/null @@ -1,19 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_SCALAR_REPR_ -#define _SECP256K1_SCALAR_REPR_ - -#include - -/** A scalar modulo the group order of the secp256k1 curve. */ -typedef struct { - uint64_t d[4]; -} secp256k1_scalar; - -#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/scalar_4x64_impl.h b/external/libwally-core/src/secp256k1/src/scalar_4x64_impl.h deleted file mode 100644 index 56e7bd82a..000000000 --- a/external/libwally-core/src/secp256k1/src/scalar_4x64_impl.h +++ /dev/null @@ -1,949 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ -#define _SECP256K1_SCALAR_REPR_IMPL_H_ - -/* Limbs of the secp256k1 order. */ -#define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL) -#define SECP256K1_N_1 ((uint64_t)0xBAAEDCE6AF48A03BULL) -#define SECP256K1_N_2 ((uint64_t)0xFFFFFFFFFFFFFFFEULL) -#define SECP256K1_N_3 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) - -/* Limbs of 2^256 minus the secp256k1 order. */ -#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) -#define SECP256K1_N_C_1 (~SECP256K1_N_1) -#define SECP256K1_N_C_2 (1) - -/* Limbs of half the secp256k1 order. */ -#define SECP256K1_N_H_0 ((uint64_t)0xDFE92F46681B20A0ULL) -#define SECP256K1_N_H_1 ((uint64_t)0x5D576E7357A4501DULL) -#define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) -#define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL) - -SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { - r->d[0] = 0; - r->d[1] = 0; - r->d[2] = 0; - r->d[3] = 0; -} - -SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { - r->d[0] = v; - r->d[1] = 0; - r->d[2] = 0; - r->d[3] = 0; -} - -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { - VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6); - return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1); -} - -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { - VERIFY_CHECK(count < 32); - VERIFY_CHECK(offset + count <= 256); - if ((offset + count - 1) >> 6 == offset >> 6) { - return secp256k1_scalar_get_bits(a, offset, count); - } else { - VERIFY_CHECK((offset >> 6) + 1 < 4); - return ((a->d[offset >> 6] >> (offset & 0x3F)) | (a->d[(offset >> 6) + 1] << (64 - (offset & 0x3F)))) & ((((uint64_t)1) << count) - 1); - } -} - -SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { - int yes = 0; - int no = 0; - no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */ - no |= (a->d[2] < SECP256K1_N_2); - yes |= (a->d[2] > SECP256K1_N_2) & ~no; - no |= (a->d[1] < SECP256K1_N_1); - yes |= (a->d[1] > SECP256K1_N_1) & ~no; - yes |= (a->d[0] >= SECP256K1_N_0) & ~no; - return yes; -} - -SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, unsigned int overflow) { - uint128_t t; - VERIFY_CHECK(overflow <= 1); - t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0; - r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint128_t)r->d[1] + overflow * SECP256K1_N_C_1; - r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint128_t)r->d[2] + overflow * SECP256K1_N_C_2; - r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint64_t)r->d[3]; - r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; - return overflow; -} - -static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { - int overflow; - uint128_t t = (uint128_t)a->d[0] + b->d[0]; - r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint128_t)a->d[1] + b->d[1]; - r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint128_t)a->d[2] + b->d[2]; - r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint128_t)a->d[3] + b->d[3]; - r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - overflow = t + secp256k1_scalar_check_overflow(r); - VERIFY_CHECK(overflow == 0 || overflow == 1); - secp256k1_scalar_reduce(r, overflow); - return overflow; -} - -static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { - uint128_t t; - VERIFY_CHECK(bit < 256); - bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 6) > 3 makes this a noop */ - t = (uint128_t)r->d[0] + (((uint64_t)((bit >> 6) == 0)) << (bit & 0x3F)); - r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint128_t)r->d[1] + (((uint64_t)((bit >> 6) == 1)) << (bit & 0x3F)); - r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint128_t)r->d[2] + (((uint64_t)((bit >> 6) == 2)) << (bit & 0x3F)); - r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; - t += (uint128_t)r->d[3] + (((uint64_t)((bit >> 6) == 3)) << (bit & 0x3F)); - r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; -#ifdef VERIFY - VERIFY_CHECK((t >> 64) == 0); - VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); -#endif -} - -static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { - int over; - r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56; - r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56; - r->d[2] = (uint64_t)b32[15] | (uint64_t)b32[14] << 8 | (uint64_t)b32[13] << 16 | (uint64_t)b32[12] << 24 | (uint64_t)b32[11] << 32 | (uint64_t)b32[10] << 40 | (uint64_t)b32[9] << 48 | (uint64_t)b32[8] << 56; - r->d[3] = (uint64_t)b32[7] | (uint64_t)b32[6] << 8 | (uint64_t)b32[5] << 16 | (uint64_t)b32[4] << 24 | (uint64_t)b32[3] << 32 | (uint64_t)b32[2] << 40 | (uint64_t)b32[1] << 48 | (uint64_t)b32[0] << 56; - over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); - if (overflow) { - *overflow = over; - } -} - -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { - bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3]; - bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2]; - bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1]; - bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; -} - -SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { - return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0; -} - -static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { - uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0); - uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1; - r->d[0] = t & nonzero; t >>= 64; - t += (uint128_t)(~a->d[1]) + SECP256K1_N_1; - r->d[1] = t & nonzero; t >>= 64; - t += (uint128_t)(~a->d[2]) + SECP256K1_N_2; - r->d[2] = t & nonzero; t >>= 64; - t += (uint128_t)(~a->d[3]) + SECP256K1_N_3; - r->d[3] = t & nonzero; -} - -SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { - return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0; -} - -static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { - int yes = 0; - int no = 0; - no |= (a->d[3] < SECP256K1_N_H_3); - yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; - no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; /* No need for a > check. */ - no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; - yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; - yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; - return yes; -} - -static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { - /* If we are flag = 0, mask = 00...00 and this is a no-op; - * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ - uint64_t mask = !flag - 1; - uint64_t nonzero = (secp256k1_scalar_is_zero(r) != 0) - 1; - uint128_t t = (uint128_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); - r->d[0] = t & nonzero; t >>= 64; - t += (uint128_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); - r->d[1] = t & nonzero; t >>= 64; - t += (uint128_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); - r->d[2] = t & nonzero; t >>= 64; - t += (uint128_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); - r->d[3] = t & nonzero; - return 2 * (mask == 0) - 1; -} - -/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ - -/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ -#define muladd(a,b) { \ - uint64_t tl, th; \ - { \ - uint128_t t = (uint128_t)a * b; \ - th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ - tl = t; \ - } \ - c0 += tl; /* overflow is handled on the next line */ \ - th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ - c1 += th; /* overflow is handled on the next line */ \ - c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ - VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ -} - -/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ -#define muladd_fast(a,b) { \ - uint64_t tl, th; \ - { \ - uint128_t t = (uint128_t)a * b; \ - th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ - tl = t; \ - } \ - c0 += tl; /* overflow is handled on the next line */ \ - th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ - c1 += th; /* never overflows by contract (verified in the next line) */ \ - VERIFY_CHECK(c1 >= th); \ -} - -/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ -#define muladd2(a,b) { \ - uint64_t tl, th, th2, tl2; \ - { \ - uint128_t t = (uint128_t)a * b; \ - th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ - tl = t; \ - } \ - th2 = th + th; /* at most 0xFFFFFFFFFFFFFFFE (in case th was 0x7FFFFFFFFFFFFFFF) */ \ - c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ - VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ - tl2 = tl + tl; /* at most 0xFFFFFFFFFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFFFFFFFFFF) */ \ - th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ - c0 += tl2; /* overflow is handled on the next line */ \ - th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ - c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ - VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ - c1 += th2; /* overflow is handled on the next line */ \ - c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ - VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ -} - -/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ -#define sumadd(a) { \ - unsigned int over; \ - c0 += (a); /* overflow is handled on the next line */ \ - over = (c0 < (a)) ? 1 : 0; \ - c1 += over; /* overflow is handled on the next line */ \ - c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ -} - -/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ -#define sumadd_fast(a) { \ - c0 += (a); /* overflow is handled on the next line */ \ - c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ - VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ - VERIFY_CHECK(c2 == 0); \ -} - -/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. */ -#define extract(n) { \ - (n) = c0; \ - c0 = c1; \ - c1 = c2; \ - c2 = 0; \ -} - -/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. c2 is required to be zero. */ -#define extract_fast(n) { \ - (n) = c0; \ - c0 = c1; \ - c1 = 0; \ - VERIFY_CHECK(c2 == 0); \ -} - -static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint64_t *l) { -#ifdef USE_ASM_X86_64 - /* Reduce 512 bits into 385. */ - uint64_t m0, m1, m2, m3, m4, m5, m6; - uint64_t p0, p1, p2, p3, p4; - uint64_t c; - - __asm__ __volatile__( - /* Preload. */ - "movq 32(%%rsi), %%r11\n" - "movq 40(%%rsi), %%r12\n" - "movq 48(%%rsi), %%r13\n" - "movq 56(%%rsi), %%r14\n" - /* Initialize r8,r9,r10 */ - "movq 0(%%rsi), %%r8\n" - "xorq %%r9, %%r9\n" - "xorq %%r10, %%r10\n" - /* (r8,r9) += n0 * c0 */ - "movq %8, %%rax\n" - "mulq %%r11\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - /* extract m0 */ - "movq %%r8, %q0\n" - "xorq %%r8, %%r8\n" - /* (r9,r10) += l1 */ - "addq 8(%%rsi), %%r9\n" - "adcq $0, %%r10\n" - /* (r9,r10,r8) += n1 * c0 */ - "movq %8, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* (r9,r10,r8) += n0 * c1 */ - "movq %9, %%rax\n" - "mulq %%r11\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* extract m1 */ - "movq %%r9, %q1\n" - "xorq %%r9, %%r9\n" - /* (r10,r8,r9) += l2 */ - "addq 16(%%rsi), %%r10\n" - "adcq $0, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += n2 * c0 */ - "movq %8, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += n1 * c1 */ - "movq %9, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += n0 */ - "addq %%r11, %%r10\n" - "adcq $0, %%r8\n" - "adcq $0, %%r9\n" - /* extract m2 */ - "movq %%r10, %q2\n" - "xorq %%r10, %%r10\n" - /* (r8,r9,r10) += l3 */ - "addq 24(%%rsi), %%r8\n" - "adcq $0, %%r9\n" - "adcq $0, %%r10\n" - /* (r8,r9,r10) += n3 * c0 */ - "movq %8, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* (r8,r9,r10) += n2 * c1 */ - "movq %9, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* (r8,r9,r10) += n1 */ - "addq %%r12, %%r8\n" - "adcq $0, %%r9\n" - "adcq $0, %%r10\n" - /* extract m3 */ - "movq %%r8, %q3\n" - "xorq %%r8, %%r8\n" - /* (r9,r10,r8) += n3 * c1 */ - "movq %9, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* (r9,r10,r8) += n2 */ - "addq %%r13, %%r9\n" - "adcq $0, %%r10\n" - "adcq $0, %%r8\n" - /* extract m4 */ - "movq %%r9, %q4\n" - /* (r10,r8) += n3 */ - "addq %%r14, %%r10\n" - "adcq $0, %%r8\n" - /* extract m5 */ - "movq %%r10, %q5\n" - /* extract m6 */ - "movq %%r8, %q6\n" - : "=g"(m0), "=g"(m1), "=g"(m2), "=g"(m3), "=g"(m4), "=g"(m5), "=g"(m6) - : "S"(l), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) - : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc"); - - /* Reduce 385 bits into 258. */ - __asm__ __volatile__( - /* Preload */ - "movq %q9, %%r11\n" - "movq %q10, %%r12\n" - "movq %q11, %%r13\n" - /* Initialize (r8,r9,r10) */ - "movq %q5, %%r8\n" - "xorq %%r9, %%r9\n" - "xorq %%r10, %%r10\n" - /* (r8,r9) += m4 * c0 */ - "movq %12, %%rax\n" - "mulq %%r11\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - /* extract p0 */ - "movq %%r8, %q0\n" - "xorq %%r8, %%r8\n" - /* (r9,r10) += m1 */ - "addq %q6, %%r9\n" - "adcq $0, %%r10\n" - /* (r9,r10,r8) += m5 * c0 */ - "movq %12, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* (r9,r10,r8) += m4 * c1 */ - "movq %13, %%rax\n" - "mulq %%r11\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* extract p1 */ - "movq %%r9, %q1\n" - "xorq %%r9, %%r9\n" - /* (r10,r8,r9) += m2 */ - "addq %q7, %%r10\n" - "adcq $0, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += m6 * c0 */ - "movq %12, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += m5 * c1 */ - "movq %13, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += m4 */ - "addq %%r11, %%r10\n" - "adcq $0, %%r8\n" - "adcq $0, %%r9\n" - /* extract p2 */ - "movq %%r10, %q2\n" - /* (r8,r9) += m3 */ - "addq %q8, %%r8\n" - "adcq $0, %%r9\n" - /* (r8,r9) += m6 * c1 */ - "movq %13, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - /* (r8,r9) += m5 */ - "addq %%r12, %%r8\n" - "adcq $0, %%r9\n" - /* extract p3 */ - "movq %%r8, %q3\n" - /* (r9) += m6 */ - "addq %%r13, %%r9\n" - /* extract p4 */ - "movq %%r9, %q4\n" - : "=&g"(p0), "=&g"(p1), "=&g"(p2), "=g"(p3), "=g"(p4) - : "g"(m0), "g"(m1), "g"(m2), "g"(m3), "g"(m4), "g"(m5), "g"(m6), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) - : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "cc"); - - /* Reduce 258 bits into 256. */ - __asm__ __volatile__( - /* Preload */ - "movq %q5, %%r10\n" - /* (rax,rdx) = p4 * c0 */ - "movq %7, %%rax\n" - "mulq %%r10\n" - /* (rax,rdx) += p0 */ - "addq %q1, %%rax\n" - "adcq $0, %%rdx\n" - /* extract r0 */ - "movq %%rax, 0(%q6)\n" - /* Move to (r8,r9) */ - "movq %%rdx, %%r8\n" - "xorq %%r9, %%r9\n" - /* (r8,r9) += p1 */ - "addq %q2, %%r8\n" - "adcq $0, %%r9\n" - /* (r8,r9) += p4 * c1 */ - "movq %8, %%rax\n" - "mulq %%r10\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - /* Extract r1 */ - "movq %%r8, 8(%q6)\n" - "xorq %%r8, %%r8\n" - /* (r9,r8) += p4 */ - "addq %%r10, %%r9\n" - "adcq $0, %%r8\n" - /* (r9,r8) += p2 */ - "addq %q3, %%r9\n" - "adcq $0, %%r8\n" - /* Extract r2 */ - "movq %%r9, 16(%q6)\n" - "xorq %%r9, %%r9\n" - /* (r8,r9) += p3 */ - "addq %q4, %%r8\n" - "adcq $0, %%r9\n" - /* Extract r3 */ - "movq %%r8, 24(%q6)\n" - /* Extract c */ - "movq %%r9, %q0\n" - : "=g"(c) - : "g"(p0), "g"(p1), "g"(p2), "g"(p3), "g"(p4), "D"(r), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) - : "rax", "rdx", "r8", "r9", "r10", "cc", "memory"); -#else - uint128_t c; - uint64_t c0, c1, c2; - uint64_t n0 = l[4], n1 = l[5], n2 = l[6], n3 = l[7]; - uint64_t m0, m1, m2, m3, m4, m5; - uint32_t m6; - uint64_t p0, p1, p2, p3; - uint32_t p4; - - /* Reduce 512 bits into 385. */ - /* m[0..6] = l[0..3] + n[0..3] * SECP256K1_N_C. */ - c0 = l[0]; c1 = 0; c2 = 0; - muladd_fast(n0, SECP256K1_N_C_0); - extract_fast(m0); - sumadd_fast(l[1]); - muladd(n1, SECP256K1_N_C_0); - muladd(n0, SECP256K1_N_C_1); - extract(m1); - sumadd(l[2]); - muladd(n2, SECP256K1_N_C_0); - muladd(n1, SECP256K1_N_C_1); - sumadd(n0); - extract(m2); - sumadd(l[3]); - muladd(n3, SECP256K1_N_C_0); - muladd(n2, SECP256K1_N_C_1); - sumadd(n1); - extract(m3); - muladd(n3, SECP256K1_N_C_1); - sumadd(n2); - extract(m4); - sumadd_fast(n3); - extract_fast(m5); - VERIFY_CHECK(c0 <= 1); - m6 = c0; - - /* Reduce 385 bits into 258. */ - /* p[0..4] = m[0..3] + m[4..6] * SECP256K1_N_C. */ - c0 = m0; c1 = 0; c2 = 0; - muladd_fast(m4, SECP256K1_N_C_0); - extract_fast(p0); - sumadd_fast(m1); - muladd(m5, SECP256K1_N_C_0); - muladd(m4, SECP256K1_N_C_1); - extract(p1); - sumadd(m2); - muladd(m6, SECP256K1_N_C_0); - muladd(m5, SECP256K1_N_C_1); - sumadd(m4); - extract(p2); - sumadd_fast(m3); - muladd_fast(m6, SECP256K1_N_C_1); - sumadd_fast(m5); - extract_fast(p3); - p4 = c0 + m6; - VERIFY_CHECK(p4 <= 2); - - /* Reduce 258 bits into 256. */ - /* r[0..3] = p[0..3] + p[4] * SECP256K1_N_C. */ - c = p0 + (uint128_t)SECP256K1_N_C_0 * p4; - r->d[0] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; - c += p1 + (uint128_t)SECP256K1_N_C_1 * p4; - r->d[1] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; - c += p2 + (uint128_t)p4; - r->d[2] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; - c += p3; - r->d[3] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; -#endif - - /* Final reduction of r. */ - secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); -} - -static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, const secp256k1_scalar *b) { -#ifdef USE_ASM_X86_64 - const uint64_t *pb = b->d; - __asm__ __volatile__( - /* Preload */ - "movq 0(%%rdi), %%r15\n" - "movq 8(%%rdi), %%rbx\n" - "movq 16(%%rdi), %%rcx\n" - "movq 0(%%rdx), %%r11\n" - "movq 8(%%rdx), %%r12\n" - "movq 16(%%rdx), %%r13\n" - "movq 24(%%rdx), %%r14\n" - /* (rax,rdx) = a0 * b0 */ - "movq %%r15, %%rax\n" - "mulq %%r11\n" - /* Extract l0 */ - "movq %%rax, 0(%%rsi)\n" - /* (r8,r9,r10) = (rdx) */ - "movq %%rdx, %%r8\n" - "xorq %%r9, %%r9\n" - "xorq %%r10, %%r10\n" - /* (r8,r9,r10) += a0 * b1 */ - "movq %%r15, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* (r8,r9,r10) += a1 * b0 */ - "movq %%rbx, %%rax\n" - "mulq %%r11\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* Extract l1 */ - "movq %%r8, 8(%%rsi)\n" - "xorq %%r8, %%r8\n" - /* (r9,r10,r8) += a0 * b2 */ - "movq %%r15, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* (r9,r10,r8) += a1 * b1 */ - "movq %%rbx, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* (r9,r10,r8) += a2 * b0 */ - "movq %%rcx, %%rax\n" - "mulq %%r11\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* Extract l2 */ - "movq %%r9, 16(%%rsi)\n" - "xorq %%r9, %%r9\n" - /* (r10,r8,r9) += a0 * b3 */ - "movq %%r15, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* Preload a3 */ - "movq 24(%%rdi), %%r15\n" - /* (r10,r8,r9) += a1 * b2 */ - "movq %%rbx, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += a2 * b1 */ - "movq %%rcx, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += a3 * b0 */ - "movq %%r15, %%rax\n" - "mulq %%r11\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* Extract l3 */ - "movq %%r10, 24(%%rsi)\n" - "xorq %%r10, %%r10\n" - /* (r8,r9,r10) += a1 * b3 */ - "movq %%rbx, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* (r8,r9,r10) += a2 * b2 */ - "movq %%rcx, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* (r8,r9,r10) += a3 * b1 */ - "movq %%r15, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* Extract l4 */ - "movq %%r8, 32(%%rsi)\n" - "xorq %%r8, %%r8\n" - /* (r9,r10,r8) += a2 * b3 */ - "movq %%rcx, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* (r9,r10,r8) += a3 * b2 */ - "movq %%r15, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* Extract l5 */ - "movq %%r9, 40(%%rsi)\n" - /* (r10,r8) += a3 * b3 */ - "movq %%r15, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - /* Extract l6 */ - "movq %%r10, 48(%%rsi)\n" - /* Extract l7 */ - "movq %%r8, 56(%%rsi)\n" - : "+d"(pb) - : "S"(l), "D"(a->d) - : "rax", "rbx", "rcx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "cc", "memory"); -#else - /* 160 bit accumulator. */ - uint64_t c0 = 0, c1 = 0; - uint32_t c2 = 0; - - /* l[0..7] = a[0..3] * b[0..3]. */ - muladd_fast(a->d[0], b->d[0]); - extract_fast(l[0]); - muladd(a->d[0], b->d[1]); - muladd(a->d[1], b->d[0]); - extract(l[1]); - muladd(a->d[0], b->d[2]); - muladd(a->d[1], b->d[1]); - muladd(a->d[2], b->d[0]); - extract(l[2]); - muladd(a->d[0], b->d[3]); - muladd(a->d[1], b->d[2]); - muladd(a->d[2], b->d[1]); - muladd(a->d[3], b->d[0]); - extract(l[3]); - muladd(a->d[1], b->d[3]); - muladd(a->d[2], b->d[2]); - muladd(a->d[3], b->d[1]); - extract(l[4]); - muladd(a->d[2], b->d[3]); - muladd(a->d[3], b->d[2]); - extract(l[5]); - muladd_fast(a->d[3], b->d[3]); - extract_fast(l[6]); - VERIFY_CHECK(c1 == 0); - l[7] = c0; -#endif -} - -static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar *a) { -#ifdef USE_ASM_X86_64 - __asm__ __volatile__( - /* Preload */ - "movq 0(%%rdi), %%r11\n" - "movq 8(%%rdi), %%r12\n" - "movq 16(%%rdi), %%r13\n" - "movq 24(%%rdi), %%r14\n" - /* (rax,rdx) = a0 * a0 */ - "movq %%r11, %%rax\n" - "mulq %%r11\n" - /* Extract l0 */ - "movq %%rax, 0(%%rsi)\n" - /* (r8,r9,r10) = (rdx,0) */ - "movq %%rdx, %%r8\n" - "xorq %%r9, %%r9\n" - "xorq %%r10, %%r10\n" - /* (r8,r9,r10) += 2 * a0 * a1 */ - "movq %%r11, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* Extract l1 */ - "movq %%r8, 8(%%rsi)\n" - "xorq %%r8, %%r8\n" - /* (r9,r10,r8) += 2 * a0 * a2 */ - "movq %%r11, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* (r9,r10,r8) += a1 * a1 */ - "movq %%r12, %%rax\n" - "mulq %%r12\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* Extract l2 */ - "movq %%r9, 16(%%rsi)\n" - "xorq %%r9, %%r9\n" - /* (r10,r8,r9) += 2 * a0 * a3 */ - "movq %%r11, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* (r10,r8,r9) += 2 * a1 * a2 */ - "movq %%r12, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - "adcq $0, %%r9\n" - /* Extract l3 */ - "movq %%r10, 24(%%rsi)\n" - "xorq %%r10, %%r10\n" - /* (r8,r9,r10) += 2 * a1 * a3 */ - "movq %%r12, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* (r8,r9,r10) += a2 * a2 */ - "movq %%r13, %%rax\n" - "mulq %%r13\n" - "addq %%rax, %%r8\n" - "adcq %%rdx, %%r9\n" - "adcq $0, %%r10\n" - /* Extract l4 */ - "movq %%r8, 32(%%rsi)\n" - "xorq %%r8, %%r8\n" - /* (r9,r10,r8) += 2 * a2 * a3 */ - "movq %%r13, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - "addq %%rax, %%r9\n" - "adcq %%rdx, %%r10\n" - "adcq $0, %%r8\n" - /* Extract l5 */ - "movq %%r9, 40(%%rsi)\n" - /* (r10,r8) += a3 * a3 */ - "movq %%r14, %%rax\n" - "mulq %%r14\n" - "addq %%rax, %%r10\n" - "adcq %%rdx, %%r8\n" - /* Extract l6 */ - "movq %%r10, 48(%%rsi)\n" - /* Extract l7 */ - "movq %%r8, 56(%%rsi)\n" - : - : "S"(l), "D"(a->d) - : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc", "memory"); -#else - /* 160 bit accumulator. */ - uint64_t c0 = 0, c1 = 0; - uint32_t c2 = 0; - - /* l[0..7] = a[0..3] * b[0..3]. */ - muladd_fast(a->d[0], a->d[0]); - extract_fast(l[0]); - muladd2(a->d[0], a->d[1]); - extract(l[1]); - muladd2(a->d[0], a->d[2]); - muladd(a->d[1], a->d[1]); - extract(l[2]); - muladd2(a->d[0], a->d[3]); - muladd2(a->d[1], a->d[2]); - extract(l[3]); - muladd2(a->d[1], a->d[3]); - muladd(a->d[2], a->d[2]); - extract(l[4]); - muladd2(a->d[2], a->d[3]); - extract(l[5]); - muladd_fast(a->d[3], a->d[3]); - extract_fast(l[6]); - VERIFY_CHECK(c1 == 0); - l[7] = c0; -#endif -} - -#undef sumadd -#undef sumadd_fast -#undef muladd -#undef muladd_fast -#undef muladd2 -#undef extract -#undef extract_fast - -static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { - uint64_t l[8]; - secp256k1_scalar_mul_512(l, a, b); - secp256k1_scalar_reduce_512(r, l); -} - -static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { - int ret; - VERIFY_CHECK(n > 0); - VERIFY_CHECK(n < 16); - ret = r->d[0] & ((1 << n) - 1); - r->d[0] = (r->d[0] >> n) + (r->d[1] << (64 - n)); - r->d[1] = (r->d[1] >> n) + (r->d[2] << (64 - n)); - r->d[2] = (r->d[2] >> n) + (r->d[3] << (64 - n)); - r->d[3] = (r->d[3] >> n); - return ret; -} - -static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { - uint64_t l[8]; - secp256k1_scalar_sqr_512(l, a); - secp256k1_scalar_reduce_512(r, l); -} - -#ifdef USE_ENDOMORPHISM -static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { - r1->d[0] = a->d[0]; - r1->d[1] = a->d[1]; - r1->d[2] = 0; - r1->d[3] = 0; - r2->d[0] = a->d[2]; - r2->d[1] = a->d[3]; - r2->d[2] = 0; - r2->d[3] = 0; -} -#endif - -SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { - return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0; -} - -SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { - uint64_t l[8]; - unsigned int shiftlimbs; - unsigned int shiftlow; - unsigned int shifthigh; - VERIFY_CHECK(shift >= 256); - secp256k1_scalar_mul_512(l, a, b); - shiftlimbs = shift >> 6; - shiftlow = shift & 0x3F; - shifthigh = 64 - shiftlow; - r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[1] = shift < 448 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[2] = shift < 384 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0; - secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/scalar_8x32.h b/external/libwally-core/src/secp256k1/src/scalar_8x32.h deleted file mode 100644 index 1319664f6..000000000 --- a/external/libwally-core/src/secp256k1/src/scalar_8x32.h +++ /dev/null @@ -1,19 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_SCALAR_REPR_ -#define _SECP256K1_SCALAR_REPR_ - -#include - -/** A scalar modulo the group order of the secp256k1 curve. */ -typedef struct { - uint32_t d[8]; -} secp256k1_scalar; - -#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/scalar_8x32_impl.h b/external/libwally-core/src/secp256k1/src/scalar_8x32_impl.h deleted file mode 100644 index aae4f35c0..000000000 --- a/external/libwally-core/src/secp256k1/src/scalar_8x32_impl.h +++ /dev/null @@ -1,721 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ -#define _SECP256K1_SCALAR_REPR_IMPL_H_ - -/* Limbs of the secp256k1 order. */ -#define SECP256K1_N_0 ((uint32_t)0xD0364141UL) -#define SECP256K1_N_1 ((uint32_t)0xBFD25E8CUL) -#define SECP256K1_N_2 ((uint32_t)0xAF48A03BUL) -#define SECP256K1_N_3 ((uint32_t)0xBAAEDCE6UL) -#define SECP256K1_N_4 ((uint32_t)0xFFFFFFFEUL) -#define SECP256K1_N_5 ((uint32_t)0xFFFFFFFFUL) -#define SECP256K1_N_6 ((uint32_t)0xFFFFFFFFUL) -#define SECP256K1_N_7 ((uint32_t)0xFFFFFFFFUL) - -/* Limbs of 2^256 minus the secp256k1 order. */ -#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) -#define SECP256K1_N_C_1 (~SECP256K1_N_1) -#define SECP256K1_N_C_2 (~SECP256K1_N_2) -#define SECP256K1_N_C_3 (~SECP256K1_N_3) -#define SECP256K1_N_C_4 (1) - -/* Limbs of half the secp256k1 order. */ -#define SECP256K1_N_H_0 ((uint32_t)0x681B20A0UL) -#define SECP256K1_N_H_1 ((uint32_t)0xDFE92F46UL) -#define SECP256K1_N_H_2 ((uint32_t)0x57A4501DUL) -#define SECP256K1_N_H_3 ((uint32_t)0x5D576E73UL) -#define SECP256K1_N_H_4 ((uint32_t)0xFFFFFFFFUL) -#define SECP256K1_N_H_5 ((uint32_t)0xFFFFFFFFUL) -#define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL) -#define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL) - -SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { - r->d[0] = 0; - r->d[1] = 0; - r->d[2] = 0; - r->d[3] = 0; - r->d[4] = 0; - r->d[5] = 0; - r->d[6] = 0; - r->d[7] = 0; -} - -SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { - r->d[0] = v; - r->d[1] = 0; - r->d[2] = 0; - r->d[3] = 0; - r->d[4] = 0; - r->d[5] = 0; - r->d[6] = 0; - r->d[7] = 0; -} - -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { - VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5); - return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1); -} - -SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { - VERIFY_CHECK(count < 32); - VERIFY_CHECK(offset + count <= 256); - if ((offset + count - 1) >> 5 == offset >> 5) { - return secp256k1_scalar_get_bits(a, offset, count); - } else { - VERIFY_CHECK((offset >> 5) + 1 < 8); - return ((a->d[offset >> 5] >> (offset & 0x1F)) | (a->d[(offset >> 5) + 1] << (32 - (offset & 0x1F)))) & ((((uint32_t)1) << count) - 1); - } -} - -SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { - int yes = 0; - int no = 0; - no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */ - no |= (a->d[6] < SECP256K1_N_6); /* No need for a > check. */ - no |= (a->d[5] < SECP256K1_N_5); /* No need for a > check. */ - no |= (a->d[4] < SECP256K1_N_4); - yes |= (a->d[4] > SECP256K1_N_4) & ~no; - no |= (a->d[3] < SECP256K1_N_3) & ~yes; - yes |= (a->d[3] > SECP256K1_N_3) & ~no; - no |= (a->d[2] < SECP256K1_N_2) & ~yes; - yes |= (a->d[2] > SECP256K1_N_2) & ~no; - no |= (a->d[1] < SECP256K1_N_1) & ~yes; - yes |= (a->d[1] > SECP256K1_N_1) & ~no; - yes |= (a->d[0] >= SECP256K1_N_0) & ~no; - return yes; -} - -SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, uint32_t overflow) { - uint64_t t; - VERIFY_CHECK(overflow <= 1); - t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0; - r->d[0] = t & 0xFFFFFFFFUL; t >>= 32; - t += (uint64_t)r->d[1] + overflow * SECP256K1_N_C_1; - r->d[1] = t & 0xFFFFFFFFUL; t >>= 32; - t += (uint64_t)r->d[2] + overflow * SECP256K1_N_C_2; - r->d[2] = t & 0xFFFFFFFFUL; t >>= 32; - t += (uint64_t)r->d[3] + overflow * SECP256K1_N_C_3; - r->d[3] = t & 0xFFFFFFFFUL; t >>= 32; - t += (uint64_t)r->d[4] + overflow * SECP256K1_N_C_4; - r->d[4] = t & 0xFFFFFFFFUL; t >>= 32; - t += (uint64_t)r->d[5]; - r->d[5] = t & 0xFFFFFFFFUL; t >>= 32; - t += (uint64_t)r->d[6]; - r->d[6] = t & 0xFFFFFFFFUL; t >>= 32; - t += (uint64_t)r->d[7]; - r->d[7] = t & 0xFFFFFFFFUL; - return overflow; -} - -static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { - int overflow; - uint64_t t = (uint64_t)a->d[0] + b->d[0]; - r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)a->d[1] + b->d[1]; - r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)a->d[2] + b->d[2]; - r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)a->d[3] + b->d[3]; - r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)a->d[4] + b->d[4]; - r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)a->d[5] + b->d[5]; - r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)a->d[6] + b->d[6]; - r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)a->d[7] + b->d[7]; - r->d[7] = t & 0xFFFFFFFFULL; t >>= 32; - overflow = t + secp256k1_scalar_check_overflow(r); - VERIFY_CHECK(overflow == 0 || overflow == 1); - secp256k1_scalar_reduce(r, overflow); - return overflow; -} - -static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { - uint64_t t; - VERIFY_CHECK(bit < 256); - bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 5) > 7 makes this a noop */ - t = (uint64_t)r->d[0] + (((uint32_t)((bit >> 5) == 0)) << (bit & 0x1F)); - r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)r->d[1] + (((uint32_t)((bit >> 5) == 1)) << (bit & 0x1F)); - r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)r->d[2] + (((uint32_t)((bit >> 5) == 2)) << (bit & 0x1F)); - r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)r->d[3] + (((uint32_t)((bit >> 5) == 3)) << (bit & 0x1F)); - r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)r->d[4] + (((uint32_t)((bit >> 5) == 4)) << (bit & 0x1F)); - r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)r->d[5] + (((uint32_t)((bit >> 5) == 5)) << (bit & 0x1F)); - r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)r->d[6] + (((uint32_t)((bit >> 5) == 6)) << (bit & 0x1F)); - r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; - t += (uint64_t)r->d[7] + (((uint32_t)((bit >> 5) == 7)) << (bit & 0x1F)); - r->d[7] = t & 0xFFFFFFFFULL; -#ifdef VERIFY - VERIFY_CHECK((t >> 32) == 0); - VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); -#endif -} - -static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { - int over; - r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24; - r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24; - r->d[2] = (uint32_t)b32[23] | (uint32_t)b32[22] << 8 | (uint32_t)b32[21] << 16 | (uint32_t)b32[20] << 24; - r->d[3] = (uint32_t)b32[19] | (uint32_t)b32[18] << 8 | (uint32_t)b32[17] << 16 | (uint32_t)b32[16] << 24; - r->d[4] = (uint32_t)b32[15] | (uint32_t)b32[14] << 8 | (uint32_t)b32[13] << 16 | (uint32_t)b32[12] << 24; - r->d[5] = (uint32_t)b32[11] | (uint32_t)b32[10] << 8 | (uint32_t)b32[9] << 16 | (uint32_t)b32[8] << 24; - r->d[6] = (uint32_t)b32[7] | (uint32_t)b32[6] << 8 | (uint32_t)b32[5] << 16 | (uint32_t)b32[4] << 24; - r->d[7] = (uint32_t)b32[3] | (uint32_t)b32[2] << 8 | (uint32_t)b32[1] << 16 | (uint32_t)b32[0] << 24; - over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); - if (overflow) { - *overflow = over; - } -} - -static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { - bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7]; - bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6]; - bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5]; - bin[12] = a->d[4] >> 24; bin[13] = a->d[4] >> 16; bin[14] = a->d[4] >> 8; bin[15] = a->d[4]; - bin[16] = a->d[3] >> 24; bin[17] = a->d[3] >> 16; bin[18] = a->d[3] >> 8; bin[19] = a->d[3]; - bin[20] = a->d[2] >> 24; bin[21] = a->d[2] >> 16; bin[22] = a->d[2] >> 8; bin[23] = a->d[2]; - bin[24] = a->d[1] >> 24; bin[25] = a->d[1] >> 16; bin[26] = a->d[1] >> 8; bin[27] = a->d[1]; - bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; -} - -SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { - return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; -} - -static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { - uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0); - uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1; - r->d[0] = t & nonzero; t >>= 32; - t += (uint64_t)(~a->d[1]) + SECP256K1_N_1; - r->d[1] = t & nonzero; t >>= 32; - t += (uint64_t)(~a->d[2]) + SECP256K1_N_2; - r->d[2] = t & nonzero; t >>= 32; - t += (uint64_t)(~a->d[3]) + SECP256K1_N_3; - r->d[3] = t & nonzero; t >>= 32; - t += (uint64_t)(~a->d[4]) + SECP256K1_N_4; - r->d[4] = t & nonzero; t >>= 32; - t += (uint64_t)(~a->d[5]) + SECP256K1_N_5; - r->d[5] = t & nonzero; t >>= 32; - t += (uint64_t)(~a->d[6]) + SECP256K1_N_6; - r->d[6] = t & nonzero; t >>= 32; - t += (uint64_t)(~a->d[7]) + SECP256K1_N_7; - r->d[7] = t & nonzero; -} - -SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { - return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; -} - -static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { - int yes = 0; - int no = 0; - no |= (a->d[7] < SECP256K1_N_H_7); - yes |= (a->d[7] > SECP256K1_N_H_7) & ~no; - no |= (a->d[6] < SECP256K1_N_H_6) & ~yes; /* No need for a > check. */ - no |= (a->d[5] < SECP256K1_N_H_5) & ~yes; /* No need for a > check. */ - no |= (a->d[4] < SECP256K1_N_H_4) & ~yes; /* No need for a > check. */ - no |= (a->d[3] < SECP256K1_N_H_3) & ~yes; - yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; - no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; - yes |= (a->d[2] > SECP256K1_N_H_2) & ~no; - no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; - yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; - yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; - return yes; -} - -static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { - /* If we are flag = 0, mask = 00...00 and this is a no-op; - * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ - uint32_t mask = !flag - 1; - uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(r) == 0); - uint64_t t = (uint64_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); - r->d[0] = t & nonzero; t >>= 32; - t += (uint64_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); - r->d[1] = t & nonzero; t >>= 32; - t += (uint64_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); - r->d[2] = t & nonzero; t >>= 32; - t += (uint64_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); - r->d[3] = t & nonzero; t >>= 32; - t += (uint64_t)(r->d[4] ^ mask) + (SECP256K1_N_4 & mask); - r->d[4] = t & nonzero; t >>= 32; - t += (uint64_t)(r->d[5] ^ mask) + (SECP256K1_N_5 & mask); - r->d[5] = t & nonzero; t >>= 32; - t += (uint64_t)(r->d[6] ^ mask) + (SECP256K1_N_6 & mask); - r->d[6] = t & nonzero; t >>= 32; - t += (uint64_t)(r->d[7] ^ mask) + (SECP256K1_N_7 & mask); - r->d[7] = t & nonzero; - return 2 * (mask == 0) - 1; -} - - -/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ - -/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ -#define muladd(a,b) { \ - uint32_t tl, th; \ - { \ - uint64_t t = (uint64_t)a * b; \ - th = t >> 32; /* at most 0xFFFFFFFE */ \ - tl = t; \ - } \ - c0 += tl; /* overflow is handled on the next line */ \ - th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ - c1 += th; /* overflow is handled on the next line */ \ - c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ - VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ -} - -/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ -#define muladd_fast(a,b) { \ - uint32_t tl, th; \ - { \ - uint64_t t = (uint64_t)a * b; \ - th = t >> 32; /* at most 0xFFFFFFFE */ \ - tl = t; \ - } \ - c0 += tl; /* overflow is handled on the next line */ \ - th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ - c1 += th; /* never overflows by contract (verified in the next line) */ \ - VERIFY_CHECK(c1 >= th); \ -} - -/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ -#define muladd2(a,b) { \ - uint32_t tl, th, th2, tl2; \ - { \ - uint64_t t = (uint64_t)a * b; \ - th = t >> 32; /* at most 0xFFFFFFFE */ \ - tl = t; \ - } \ - th2 = th + th; /* at most 0xFFFFFFFE (in case th was 0x7FFFFFFF) */ \ - c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ - VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ - tl2 = tl + tl; /* at most 0xFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFF) */ \ - th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ - c0 += tl2; /* overflow is handled on the next line */ \ - th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ - c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ - VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ - c1 += th2; /* overflow is handled on the next line */ \ - c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ - VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ -} - -/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ -#define sumadd(a) { \ - unsigned int over; \ - c0 += (a); /* overflow is handled on the next line */ \ - over = (c0 < (a)) ? 1 : 0; \ - c1 += over; /* overflow is handled on the next line */ \ - c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ -} - -/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ -#define sumadd_fast(a) { \ - c0 += (a); /* overflow is handled on the next line */ \ - c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ - VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ - VERIFY_CHECK(c2 == 0); \ -} - -/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. */ -#define extract(n) { \ - (n) = c0; \ - c0 = c1; \ - c1 = c2; \ - c2 = 0; \ -} - -/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. c2 is required to be zero. */ -#define extract_fast(n) { \ - (n) = c0; \ - c0 = c1; \ - c1 = 0; \ - VERIFY_CHECK(c2 == 0); \ -} - -static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint32_t *l) { - uint64_t c; - uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15]; - uint32_t m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12; - uint32_t p0, p1, p2, p3, p4, p5, p6, p7, p8; - - /* 96 bit accumulator. */ - uint32_t c0, c1, c2; - - /* Reduce 512 bits into 385. */ - /* m[0..12] = l[0..7] + n[0..7] * SECP256K1_N_C. */ - c0 = l[0]; c1 = 0; c2 = 0; - muladd_fast(n0, SECP256K1_N_C_0); - extract_fast(m0); - sumadd_fast(l[1]); - muladd(n1, SECP256K1_N_C_0); - muladd(n0, SECP256K1_N_C_1); - extract(m1); - sumadd(l[2]); - muladd(n2, SECP256K1_N_C_0); - muladd(n1, SECP256K1_N_C_1); - muladd(n0, SECP256K1_N_C_2); - extract(m2); - sumadd(l[3]); - muladd(n3, SECP256K1_N_C_0); - muladd(n2, SECP256K1_N_C_1); - muladd(n1, SECP256K1_N_C_2); - muladd(n0, SECP256K1_N_C_3); - extract(m3); - sumadd(l[4]); - muladd(n4, SECP256K1_N_C_0); - muladd(n3, SECP256K1_N_C_1); - muladd(n2, SECP256K1_N_C_2); - muladd(n1, SECP256K1_N_C_3); - sumadd(n0); - extract(m4); - sumadd(l[5]); - muladd(n5, SECP256K1_N_C_0); - muladd(n4, SECP256K1_N_C_1); - muladd(n3, SECP256K1_N_C_2); - muladd(n2, SECP256K1_N_C_3); - sumadd(n1); - extract(m5); - sumadd(l[6]); - muladd(n6, SECP256K1_N_C_0); - muladd(n5, SECP256K1_N_C_1); - muladd(n4, SECP256K1_N_C_2); - muladd(n3, SECP256K1_N_C_3); - sumadd(n2); - extract(m6); - sumadd(l[7]); - muladd(n7, SECP256K1_N_C_0); - muladd(n6, SECP256K1_N_C_1); - muladd(n5, SECP256K1_N_C_2); - muladd(n4, SECP256K1_N_C_3); - sumadd(n3); - extract(m7); - muladd(n7, SECP256K1_N_C_1); - muladd(n6, SECP256K1_N_C_2); - muladd(n5, SECP256K1_N_C_3); - sumadd(n4); - extract(m8); - muladd(n7, SECP256K1_N_C_2); - muladd(n6, SECP256K1_N_C_3); - sumadd(n5); - extract(m9); - muladd(n7, SECP256K1_N_C_3); - sumadd(n6); - extract(m10); - sumadd_fast(n7); - extract_fast(m11); - VERIFY_CHECK(c0 <= 1); - m12 = c0; - - /* Reduce 385 bits into 258. */ - /* p[0..8] = m[0..7] + m[8..12] * SECP256K1_N_C. */ - c0 = m0; c1 = 0; c2 = 0; - muladd_fast(m8, SECP256K1_N_C_0); - extract_fast(p0); - sumadd_fast(m1); - muladd(m9, SECP256K1_N_C_0); - muladd(m8, SECP256K1_N_C_1); - extract(p1); - sumadd(m2); - muladd(m10, SECP256K1_N_C_0); - muladd(m9, SECP256K1_N_C_1); - muladd(m8, SECP256K1_N_C_2); - extract(p2); - sumadd(m3); - muladd(m11, SECP256K1_N_C_0); - muladd(m10, SECP256K1_N_C_1); - muladd(m9, SECP256K1_N_C_2); - muladd(m8, SECP256K1_N_C_3); - extract(p3); - sumadd(m4); - muladd(m12, SECP256K1_N_C_0); - muladd(m11, SECP256K1_N_C_1); - muladd(m10, SECP256K1_N_C_2); - muladd(m9, SECP256K1_N_C_3); - sumadd(m8); - extract(p4); - sumadd(m5); - muladd(m12, SECP256K1_N_C_1); - muladd(m11, SECP256K1_N_C_2); - muladd(m10, SECP256K1_N_C_3); - sumadd(m9); - extract(p5); - sumadd(m6); - muladd(m12, SECP256K1_N_C_2); - muladd(m11, SECP256K1_N_C_3); - sumadd(m10); - extract(p6); - sumadd_fast(m7); - muladd_fast(m12, SECP256K1_N_C_3); - sumadd_fast(m11); - extract_fast(p7); - p8 = c0 + m12; - VERIFY_CHECK(p8 <= 2); - - /* Reduce 258 bits into 256. */ - /* r[0..7] = p[0..7] + p[8] * SECP256K1_N_C. */ - c = p0 + (uint64_t)SECP256K1_N_C_0 * p8; - r->d[0] = c & 0xFFFFFFFFUL; c >>= 32; - c += p1 + (uint64_t)SECP256K1_N_C_1 * p8; - r->d[1] = c & 0xFFFFFFFFUL; c >>= 32; - c += p2 + (uint64_t)SECP256K1_N_C_2 * p8; - r->d[2] = c & 0xFFFFFFFFUL; c >>= 32; - c += p3 + (uint64_t)SECP256K1_N_C_3 * p8; - r->d[3] = c & 0xFFFFFFFFUL; c >>= 32; - c += p4 + (uint64_t)p8; - r->d[4] = c & 0xFFFFFFFFUL; c >>= 32; - c += p5; - r->d[5] = c & 0xFFFFFFFFUL; c >>= 32; - c += p6; - r->d[6] = c & 0xFFFFFFFFUL; c >>= 32; - c += p7; - r->d[7] = c & 0xFFFFFFFFUL; c >>= 32; - - /* Final reduction of r. */ - secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); -} - -static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar *a, const secp256k1_scalar *b) { - /* 96 bit accumulator. */ - uint32_t c0 = 0, c1 = 0, c2 = 0; - - /* l[0..15] = a[0..7] * b[0..7]. */ - muladd_fast(a->d[0], b->d[0]); - extract_fast(l[0]); - muladd(a->d[0], b->d[1]); - muladd(a->d[1], b->d[0]); - extract(l[1]); - muladd(a->d[0], b->d[2]); - muladd(a->d[1], b->d[1]); - muladd(a->d[2], b->d[0]); - extract(l[2]); - muladd(a->d[0], b->d[3]); - muladd(a->d[1], b->d[2]); - muladd(a->d[2], b->d[1]); - muladd(a->d[3], b->d[0]); - extract(l[3]); - muladd(a->d[0], b->d[4]); - muladd(a->d[1], b->d[3]); - muladd(a->d[2], b->d[2]); - muladd(a->d[3], b->d[1]); - muladd(a->d[4], b->d[0]); - extract(l[4]); - muladd(a->d[0], b->d[5]); - muladd(a->d[1], b->d[4]); - muladd(a->d[2], b->d[3]); - muladd(a->d[3], b->d[2]); - muladd(a->d[4], b->d[1]); - muladd(a->d[5], b->d[0]); - extract(l[5]); - muladd(a->d[0], b->d[6]); - muladd(a->d[1], b->d[5]); - muladd(a->d[2], b->d[4]); - muladd(a->d[3], b->d[3]); - muladd(a->d[4], b->d[2]); - muladd(a->d[5], b->d[1]); - muladd(a->d[6], b->d[0]); - extract(l[6]); - muladd(a->d[0], b->d[7]); - muladd(a->d[1], b->d[6]); - muladd(a->d[2], b->d[5]); - muladd(a->d[3], b->d[4]); - muladd(a->d[4], b->d[3]); - muladd(a->d[5], b->d[2]); - muladd(a->d[6], b->d[1]); - muladd(a->d[7], b->d[0]); - extract(l[7]); - muladd(a->d[1], b->d[7]); - muladd(a->d[2], b->d[6]); - muladd(a->d[3], b->d[5]); - muladd(a->d[4], b->d[4]); - muladd(a->d[5], b->d[3]); - muladd(a->d[6], b->d[2]); - muladd(a->d[7], b->d[1]); - extract(l[8]); - muladd(a->d[2], b->d[7]); - muladd(a->d[3], b->d[6]); - muladd(a->d[4], b->d[5]); - muladd(a->d[5], b->d[4]); - muladd(a->d[6], b->d[3]); - muladd(a->d[7], b->d[2]); - extract(l[9]); - muladd(a->d[3], b->d[7]); - muladd(a->d[4], b->d[6]); - muladd(a->d[5], b->d[5]); - muladd(a->d[6], b->d[4]); - muladd(a->d[7], b->d[3]); - extract(l[10]); - muladd(a->d[4], b->d[7]); - muladd(a->d[5], b->d[6]); - muladd(a->d[6], b->d[5]); - muladd(a->d[7], b->d[4]); - extract(l[11]); - muladd(a->d[5], b->d[7]); - muladd(a->d[6], b->d[6]); - muladd(a->d[7], b->d[5]); - extract(l[12]); - muladd(a->d[6], b->d[7]); - muladd(a->d[7], b->d[6]); - extract(l[13]); - muladd_fast(a->d[7], b->d[7]); - extract_fast(l[14]); - VERIFY_CHECK(c1 == 0); - l[15] = c0; -} - -static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar *a) { - /* 96 bit accumulator. */ - uint32_t c0 = 0, c1 = 0, c2 = 0; - - /* l[0..15] = a[0..7]^2. */ - muladd_fast(a->d[0], a->d[0]); - extract_fast(l[0]); - muladd2(a->d[0], a->d[1]); - extract(l[1]); - muladd2(a->d[0], a->d[2]); - muladd(a->d[1], a->d[1]); - extract(l[2]); - muladd2(a->d[0], a->d[3]); - muladd2(a->d[1], a->d[2]); - extract(l[3]); - muladd2(a->d[0], a->d[4]); - muladd2(a->d[1], a->d[3]); - muladd(a->d[2], a->d[2]); - extract(l[4]); - muladd2(a->d[0], a->d[5]); - muladd2(a->d[1], a->d[4]); - muladd2(a->d[2], a->d[3]); - extract(l[5]); - muladd2(a->d[0], a->d[6]); - muladd2(a->d[1], a->d[5]); - muladd2(a->d[2], a->d[4]); - muladd(a->d[3], a->d[3]); - extract(l[6]); - muladd2(a->d[0], a->d[7]); - muladd2(a->d[1], a->d[6]); - muladd2(a->d[2], a->d[5]); - muladd2(a->d[3], a->d[4]); - extract(l[7]); - muladd2(a->d[1], a->d[7]); - muladd2(a->d[2], a->d[6]); - muladd2(a->d[3], a->d[5]); - muladd(a->d[4], a->d[4]); - extract(l[8]); - muladd2(a->d[2], a->d[7]); - muladd2(a->d[3], a->d[6]); - muladd2(a->d[4], a->d[5]); - extract(l[9]); - muladd2(a->d[3], a->d[7]); - muladd2(a->d[4], a->d[6]); - muladd(a->d[5], a->d[5]); - extract(l[10]); - muladd2(a->d[4], a->d[7]); - muladd2(a->d[5], a->d[6]); - extract(l[11]); - muladd2(a->d[5], a->d[7]); - muladd(a->d[6], a->d[6]); - extract(l[12]); - muladd2(a->d[6], a->d[7]); - extract(l[13]); - muladd_fast(a->d[7], a->d[7]); - extract_fast(l[14]); - VERIFY_CHECK(c1 == 0); - l[15] = c0; -} - -#undef sumadd -#undef sumadd_fast -#undef muladd -#undef muladd_fast -#undef muladd2 -#undef extract -#undef extract_fast - -static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { - uint32_t l[16]; - secp256k1_scalar_mul_512(l, a, b); - secp256k1_scalar_reduce_512(r, l); -} - -static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { - int ret; - VERIFY_CHECK(n > 0); - VERIFY_CHECK(n < 16); - ret = r->d[0] & ((1 << n) - 1); - r->d[0] = (r->d[0] >> n) + (r->d[1] << (32 - n)); - r->d[1] = (r->d[1] >> n) + (r->d[2] << (32 - n)); - r->d[2] = (r->d[2] >> n) + (r->d[3] << (32 - n)); - r->d[3] = (r->d[3] >> n) + (r->d[4] << (32 - n)); - r->d[4] = (r->d[4] >> n) + (r->d[5] << (32 - n)); - r->d[5] = (r->d[5] >> n) + (r->d[6] << (32 - n)); - r->d[6] = (r->d[6] >> n) + (r->d[7] << (32 - n)); - r->d[7] = (r->d[7] >> n); - return ret; -} - -static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { - uint32_t l[16]; - secp256k1_scalar_sqr_512(l, a); - secp256k1_scalar_reduce_512(r, l); -} - -#ifdef USE_ENDOMORPHISM -static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { - r1->d[0] = a->d[0]; - r1->d[1] = a->d[1]; - r1->d[2] = a->d[2]; - r1->d[3] = a->d[3]; - r1->d[4] = 0; - r1->d[5] = 0; - r1->d[6] = 0; - r1->d[7] = 0; - r2->d[0] = a->d[4]; - r2->d[1] = a->d[5]; - r2->d[2] = a->d[6]; - r2->d[3] = a->d[7]; - r2->d[4] = 0; - r2->d[5] = 0; - r2->d[6] = 0; - r2->d[7] = 0; -} -#endif - -SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { - return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0; -} - -SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { - uint32_t l[16]; - unsigned int shiftlimbs; - unsigned int shiftlow; - unsigned int shifthigh; - VERIFY_CHECK(shift >= 256); - secp256k1_scalar_mul_512(l, a, b); - shiftlimbs = shift >> 5; - shiftlow = shift & 0x1F; - shifthigh = 32 - shiftlow; - r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 480 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[1] = shift < 480 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[2] = shift < 448 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 416 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[3] = shift < 416 ? (l[3 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[4 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[4] = shift < 384 ? (l[4 + shiftlimbs] >> shiftlow | (shift < 352 && shiftlow ? (l[5 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[5] = shift < 352 ? (l[5 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[6 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[6] = shift < 320 ? (l[6 + shiftlimbs] >> shiftlow | (shift < 288 && shiftlow ? (l[7 + shiftlimbs] << shifthigh) : 0)) : 0; - r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow) : 0; - secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1); -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/scalar_impl.h b/external/libwally-core/src/secp256k1/src/scalar_impl.h deleted file mode 100644 index c5baf4df4..000000000 --- a/external/libwally-core/src/secp256k1/src/scalar_impl.h +++ /dev/null @@ -1,335 +0,0 @@ -/********************************************************************** - * Copyright (c) 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_SCALAR_IMPL_H_ -#define _SECP256K1_SCALAR_IMPL_H_ - -#include "group.h" -#include "scalar.h" - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#if defined(USE_SCALAR_4X64) -#include "scalar_4x64_impl.h" -#elif defined(USE_SCALAR_8X32) -#include "scalar_8x32_impl.h" -#else -#error "Please select scalar implementation" -#endif - -#ifndef USE_NUM_NONE -static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a) { - unsigned char c[32]; - secp256k1_scalar_get_b32(c, a); - secp256k1_num_set_bin(r, c, 32); -} - -/** secp256k1 curve order, see secp256k1_ecdsa_const_order_as_fe in ecdsa_impl.h */ -static void secp256k1_scalar_order_get_num(secp256k1_num *r) { - static const unsigned char order[32] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, - 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, - 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 - }; - secp256k1_num_set_bin(r, order, 32); -} -#endif - -static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) { - secp256k1_scalar *t; - int i; - /* First compute x ^ (2^N - 1) for some values of N. */ - secp256k1_scalar x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127; - - secp256k1_scalar_sqr(&x2, x); - secp256k1_scalar_mul(&x2, &x2, x); - - secp256k1_scalar_sqr(&x3, &x2); - secp256k1_scalar_mul(&x3, &x3, x); - - secp256k1_scalar_sqr(&x4, &x3); - secp256k1_scalar_mul(&x4, &x4, x); - - secp256k1_scalar_sqr(&x6, &x4); - secp256k1_scalar_sqr(&x6, &x6); - secp256k1_scalar_mul(&x6, &x6, &x2); - - secp256k1_scalar_sqr(&x7, &x6); - secp256k1_scalar_mul(&x7, &x7, x); - - secp256k1_scalar_sqr(&x8, &x7); - secp256k1_scalar_mul(&x8, &x8, x); - - secp256k1_scalar_sqr(&x15, &x8); - for (i = 0; i < 6; i++) { - secp256k1_scalar_sqr(&x15, &x15); - } - secp256k1_scalar_mul(&x15, &x15, &x7); - - secp256k1_scalar_sqr(&x30, &x15); - for (i = 0; i < 14; i++) { - secp256k1_scalar_sqr(&x30, &x30); - } - secp256k1_scalar_mul(&x30, &x30, &x15); - - secp256k1_scalar_sqr(&x60, &x30); - for (i = 0; i < 29; i++) { - secp256k1_scalar_sqr(&x60, &x60); - } - secp256k1_scalar_mul(&x60, &x60, &x30); - - secp256k1_scalar_sqr(&x120, &x60); - for (i = 0; i < 59; i++) { - secp256k1_scalar_sqr(&x120, &x120); - } - secp256k1_scalar_mul(&x120, &x120, &x60); - - secp256k1_scalar_sqr(&x127, &x120); - for (i = 0; i < 6; i++) { - secp256k1_scalar_sqr(&x127, &x127); - } - secp256k1_scalar_mul(&x127, &x127, &x7); - - /* Then accumulate the final result (t starts at x127). */ - t = &x127; - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 4; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 4; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 3; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 4; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 5; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 4; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 5; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x4); /* 1111 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 4; i++) { /* 000 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 10; i++) { /* 0000000 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 4; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x3); /* 111 */ - for (i = 0; i < 9; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x8); /* 11111111 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 5; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x4); /* 1111 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 5; i++) { /* 000 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 4; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 2; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 8; i++) { /* 000000 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 3; i++) { /* 0 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, &x2); /* 11 */ - for (i = 0; i < 3; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 6; i++) { /* 00000 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(t, t, x); /* 1 */ - for (i = 0; i < 8; i++) { /* 00 */ - secp256k1_scalar_sqr(t, t); - } - secp256k1_scalar_mul(r, t, &x6); /* 111111 */ -} - -SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { - /* d[0] is present and is the lowest word for all representations */ - return !(a->d[0] & 1); -} - -static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) { -#if defined(USE_SCALAR_INV_BUILTIN) - secp256k1_scalar_inverse(r, x); -#elif defined(USE_SCALAR_INV_NUM) - unsigned char b[32]; - secp256k1_num n, m; - secp256k1_scalar t = *x; - secp256k1_scalar_get_b32(b, &t); - secp256k1_num_set_bin(&n, b, 32); - secp256k1_scalar_order_get_num(&m); - secp256k1_num_mod_inverse(&n, &n, &m); - secp256k1_num_get_bin(b, 32, &n); - secp256k1_scalar_set_b32(r, b, NULL); - /* Verify that the inverse was computed correctly, without GMP code. */ - secp256k1_scalar_mul(&t, &t, r); - CHECK(secp256k1_scalar_is_one(&t)); -#else -#error "Please select scalar inverse implementation" -#endif -} - -#ifdef USE_ENDOMORPHISM -/** - * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where - * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a, - * 0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78,0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72} - * - * "Guide to Elliptic Curve Cryptography" (Hankerson, Menezes, Vanstone) gives an algorithm - * (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1 - * and k2 have a small size. - * It relies on constants a1, b1, a2, b2. These constants for the value of lambda above are: - * - * - a1 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} - * - b1 = -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3} - * - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8} - * - b2 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} - * - * The algorithm then computes c1 = round(b1 * k / n) and c2 = round(b2 * k / n), and gives - * k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and - * compute k1 as k - k2 * lambda, avoiding the need for constants a1 and a2. - * - * g1, g2 are precomputed constants used to replace division with a rounded multiplication - * when decomposing the scalar for an endomorphism-based point multiplication. - * - * The possibility of using precomputed estimates is mentioned in "Guide to Elliptic Curve - * Cryptography" (Hankerson, Menezes, Vanstone) in section 3.5. - * - * The derivation is described in the paper "Efficient Software Implementation of Public-Key - * Cryptography on Sensor Networks Using the MSP430X Microcontroller" (Gouvea, Oliveira, Lopez), - * Section 4.3 (here we use a somewhat higher-precision estimate): - * d = a1*b2 - b1*a2 - * g1 = round((2^272)*b2/d) - * g2 = round((2^272)*b1/d) - * - * (Note that 'd' is also equal to the curve order here because [a1,b1] and [a2,b2] are found - * as outputs of the Extended Euclidean Algorithm on inputs 'order' and 'lambda'). - * - * The function below splits a in r1 and r2, such that r1 + lambda * r2 == a (mod order). - */ - -static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { - secp256k1_scalar c1, c2; - static const secp256k1_scalar minus_lambda = SECP256K1_SCALAR_CONST( - 0xAC9C52B3UL, 0x3FA3CF1FUL, 0x5AD9E3FDUL, 0x77ED9BA4UL, - 0xA880B9FCUL, 0x8EC739C2UL, 0xE0CFC810UL, 0xB51283CFUL - ); - static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST( - 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, - 0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL - ); - static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST( - 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, - 0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL - ); - static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST( - 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00003086UL, - 0xD221A7D4UL, 0x6BCDE86CUL, 0x90E49284UL, 0xEB153DABUL - ); - static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST( - 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0000E443UL, - 0x7ED6010EUL, 0x88286F54UL, 0x7FA90ABFUL, 0xE4C42212UL - ); - VERIFY_CHECK(r1 != a); - VERIFY_CHECK(r2 != a); - /* these _var calls are constant time since the shift amount is constant */ - secp256k1_scalar_mul_shift_var(&c1, a, &g1, 272); - secp256k1_scalar_mul_shift_var(&c2, a, &g2, 272); - secp256k1_scalar_mul(&c1, &c1, &minus_b1); - secp256k1_scalar_mul(&c2, &c2, &minus_b2); - secp256k1_scalar_add(r2, &c1, &c2); - secp256k1_scalar_mul(r1, r2, &minus_lambda); - secp256k1_scalar_add(r1, r1, a); -} -#endif - -#endif diff --git a/external/libwally-core/src/secp256k1/src/secp256k1.c b/external/libwally-core/src/secp256k1/src/secp256k1.c deleted file mode 100755 index fa076ca6d..000000000 --- a/external/libwally-core/src/secp256k1/src/secp256k1.c +++ /dev/null @@ -1,586 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#include "include/secp256k1.h" - -#include "util.h" -#include "num_impl.h" -#include "field_impl.h" -#include "scalar_impl.h" -#include "group_impl.h" -#include "ecmult_impl.h" -#include "ecmult_const_impl.h" -#include "ecmult_gen_impl.h" -#include "ecdsa_impl.h" -#include "eckey_impl.h" -#include "hash_impl.h" - -#ifdef ENABLE_MODULE_RANGEPROOF -# include "modules/rangeproof/pedersen.h" -# include "modules/rangeproof/rangeproof.h" -#endif - -#define ARG_CHECK(cond) do { \ - if (EXPECT(!(cond), 0)) { \ - secp256k1_callback_call(&ctx->illegal_callback, #cond); \ - return 0; \ - } \ -} while(0) - -static void default_illegal_callback_fn(const char* str, void* data) { - (void)data; - fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str); - abort(); -} - -static const secp256k1_callback default_illegal_callback = { - default_illegal_callback_fn, - NULL -}; - -static void default_error_callback_fn(const char* str, void* data) { - (void)data; - fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); - abort(); -} - -static const secp256k1_callback default_error_callback = { - default_error_callback_fn, - NULL -}; - - -struct secp256k1_context_struct { - secp256k1_ecmult_context ecmult_ctx; - secp256k1_ecmult_gen_context ecmult_gen_ctx; -#ifdef ENABLE_MODULE_RANGEPROOF - secp256k1_pedersen_context pedersen_ctx; - secp256k1_rangeproof_context rangeproof_ctx; -#endif - secp256k1_callback illegal_callback; - secp256k1_callback error_callback; -}; - -secp256k1_context* secp256k1_context_create(unsigned int flags) { - secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context)); - ret->illegal_callback = default_illegal_callback; - ret->error_callback = default_error_callback; - - if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) { - secp256k1_callback_call(&ret->illegal_callback, - "Invalid flags"); - free(ret); - return NULL; - } - - secp256k1_ecmult_context_init(&ret->ecmult_ctx); - secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx); -#ifdef ENABLE_MODULE_RANGEPROOF - secp256k1_pedersen_context_init(&ret->pedersen_ctx); - secp256k1_rangeproof_context_init(&ret->rangeproof_ctx); -#endif - - if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) { - secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &ret->error_callback); - } - if (flags & SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) { - secp256k1_ecmult_context_build(&ret->ecmult_ctx, &ret->error_callback); - } - - return ret; -} - -secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) { - secp256k1_context* ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, sizeof(secp256k1_context)); - ret->illegal_callback = ctx->illegal_callback; - ret->error_callback = ctx->error_callback; - secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback); - secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback); -#ifdef ENABLE_MODULE_RANGEPROOF - secp256k1_pedersen_context_clone(&ret->pedersen_ctx, &ctx->pedersen_ctx, &ctx->error_callback); - secp256k1_rangeproof_context_clone(&ret->rangeproof_ctx, &ctx->rangeproof_ctx, &ctx->error_callback); -#endif - return ret; -} - -void secp256k1_context_destroy(secp256k1_context* ctx) { - if (ctx != NULL) { - secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); - secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); -#ifdef ENABLE_MODULE_RANGEPROOF - secp256k1_pedersen_context_clear(&ctx->pedersen_ctx); - secp256k1_rangeproof_context_clear(&ctx->rangeproof_ctx); -#endif - - free(ctx); - } -} - -void secp256k1_context_set_illegal_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { - if (fun == NULL) { - fun = default_illegal_callback_fn; - } - ctx->illegal_callback.fn = fun; - ctx->illegal_callback.data = data; -} - -void secp256k1_context_set_error_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { - if (fun == NULL) { - fun = default_error_callback_fn; - } - ctx->error_callback.fn = fun; - ctx->error_callback.data = data; -} - -static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge, const secp256k1_pubkey* pubkey) { - if (sizeof(secp256k1_ge_storage) == 64) { - /* When the secp256k1_ge_storage type is exactly 64 byte, use its - * representation inside secp256k1_pubkey, as conversion is very fast. - * Note that secp256k1_pubkey_save must use the same representation. */ - secp256k1_ge_storage s; - memcpy(&s, &pubkey->data[0], 64); - secp256k1_ge_from_storage(ge, &s); - } else { - /* Otherwise, fall back to 32-byte big endian for X and Y. */ - secp256k1_fe x, y; - secp256k1_fe_set_b32(&x, pubkey->data); - secp256k1_fe_set_b32(&y, pubkey->data + 32); - secp256k1_ge_set_xy(ge, &x, &y); - } - ARG_CHECK(!secp256k1_fe_is_zero(&ge->x)); - return 1; -} - -static void secp256k1_pubkey_save(secp256k1_pubkey* pubkey, secp256k1_ge* ge) { - if (sizeof(secp256k1_ge_storage) == 64) { - secp256k1_ge_storage s; - secp256k1_ge_to_storage(&s, ge); - memcpy(&pubkey->data[0], &s, 64); - } else { - VERIFY_CHECK(!secp256k1_ge_is_infinity(ge)); - secp256k1_fe_normalize_var(&ge->x); - secp256k1_fe_normalize_var(&ge->y); - secp256k1_fe_get_b32(pubkey->data, &ge->x); - secp256k1_fe_get_b32(pubkey->data + 32, &ge->y); - } -} - -int secp256k1_ec_pubkey_parse(const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen) { - secp256k1_ge Q; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(pubkey != NULL); - memset(pubkey, 0, sizeof(*pubkey)); - ARG_CHECK(input != NULL); - if (!secp256k1_eckey_pubkey_parse(&Q, input, inputlen)) { - return 0; - } - secp256k1_pubkey_save(pubkey, &Q); - secp256k1_ge_clear(&Q); - return 1; -} - -int secp256k1_ec_pubkey_serialize(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey* pubkey, unsigned int flags) { - secp256k1_ge Q; - size_t len; - int ret = 0; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(outputlen != NULL); - ARG_CHECK(*outputlen >= ((flags & SECP256K1_FLAGS_BIT_COMPRESSION) ? 33 : 65)); - len = *outputlen; - *outputlen = 0; - ARG_CHECK(output != NULL); - memset(output, 0, len); - ARG_CHECK(pubkey != NULL); - ARG_CHECK((flags & SECP256K1_FLAGS_TYPE_MASK) == SECP256K1_FLAGS_TYPE_COMPRESSION); - if (secp256k1_pubkey_load(ctx, &Q, pubkey)) { - ret = secp256k1_eckey_pubkey_serialize(&Q, output, &len, flags & SECP256K1_FLAGS_BIT_COMPRESSION); - if (ret) { - *outputlen = len; - } - } - return ret; -} - -static void secp256k1_ecdsa_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_ecdsa_signature* sig) { - (void)ctx; - if (sizeof(secp256k1_scalar) == 32) { - /* When the secp256k1_scalar type is exactly 32 byte, use its - * representation inside secp256k1_ecdsa_signature, as conversion is very fast. - * Note that secp256k1_ecdsa_signature_save must use the same representation. */ - memcpy(r, &sig->data[0], 32); - memcpy(s, &sig->data[32], 32); - } else { - secp256k1_scalar_set_b32(r, &sig->data[0], NULL); - secp256k1_scalar_set_b32(s, &sig->data[32], NULL); - } -} - -static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s) { - if (sizeof(secp256k1_scalar) == 32) { - memcpy(&sig->data[0], r, 32); - memcpy(&sig->data[32], s, 32); - } else { - secp256k1_scalar_get_b32(&sig->data[0], r); - secp256k1_scalar_get_b32(&sig->data[32], s); - } -} - -int secp256k1_ecdsa_signature_parse_der(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { - secp256k1_scalar r, s; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(sig != NULL); - ARG_CHECK(input != NULL); - - if (secp256k1_ecdsa_sig_parse(&r, &s, input, inputlen)) { - secp256k1_ecdsa_signature_save(sig, &r, &s); - return 1; - } else { - memset(sig, 0, sizeof(*sig)); - return 0; - } -} - -int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input64) { - secp256k1_scalar r, s; - int ret = 1; - int overflow = 0; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(sig != NULL); - ARG_CHECK(input64 != NULL); - - secp256k1_scalar_set_b32(&r, &input64[0], &overflow); - ret &= !overflow; - secp256k1_scalar_set_b32(&s, &input64[32], &overflow); - ret &= !overflow; - if (ret) { - secp256k1_ecdsa_signature_save(sig, &r, &s); - } else { - memset(sig, 0, sizeof(*sig)); - } - return ret; -} - -int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature* sig) { - secp256k1_scalar r, s; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(output != NULL); - ARG_CHECK(outputlen != NULL); - ARG_CHECK(sig != NULL); - - secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); - return secp256k1_ecdsa_sig_serialize(output, outputlen, &r, &s); -} - -int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, const secp256k1_ecdsa_signature* sig) { - secp256k1_scalar r, s; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(output64 != NULL); - ARG_CHECK(sig != NULL); - - secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); - secp256k1_scalar_get_b32(&output64[0], &r); - secp256k1_scalar_get_b32(&output64[32], &s); - return 1; -} - -int secp256k1_ecdsa_signature_normalize(const secp256k1_context* ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) { - secp256k1_scalar r, s; - int ret = 0; - - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(sigin != NULL); - - secp256k1_ecdsa_signature_load(ctx, &r, &s, sigin); - ret = secp256k1_scalar_is_high(&s); - if (sigout != NULL) { - if (ret) { - secp256k1_scalar_negate(&s, &s); - } - secp256k1_ecdsa_signature_save(sigout, &r, &s); - } - - return ret; -} - -int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) { - secp256k1_ge q; - secp256k1_scalar r, s; - secp256k1_scalar m; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(sig != NULL); - ARG_CHECK(pubkey != NULL); - - secp256k1_scalar_set_b32(&m, msg32, NULL); - secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); - return (!secp256k1_scalar_is_high(&s) && - secp256k1_pubkey_load(ctx, &q, pubkey) && - secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &r, &s, &q, &m)); -} - -static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { - unsigned char keydata[112]; - int keylen = 64; - secp256k1_rfc6979_hmac_sha256_t rng; - unsigned int i; - /* We feed a byte array to the PRNG as input, consisting of: - * - the private key (32 bytes) and message (32 bytes), see RFC 6979 3.2d. - * - optionally 32 extra bytes of data, see RFC 6979 3.6 Additional Data. - * - optionally 16 extra bytes with the algorithm name. - * Because the arguments have distinct fixed lengths it is not possible for - * different argument mixtures to emulate each other and result in the same - * nonces. - */ - memcpy(keydata, key32, 32); - memcpy(keydata + 32, msg32, 32); - if (data != NULL) { - memcpy(keydata + 64, data, 32); - keylen = 96; - } - if (algo16 != NULL) { - memcpy(keydata + keylen, algo16, 16); - keylen += 16; - } - secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, keylen); - memset(keydata, 0, sizeof(keydata)); - for (i = 0; i <= counter; i++) { - secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); - } - secp256k1_rfc6979_hmac_sha256_finalize(&rng); - return 1; -} - -const secp256k1_nonce_function secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; -const secp256k1_nonce_function secp256k1_nonce_function_default = nonce_function_rfc6979; - -int secp256k1_ecdsa_sign(const secp256k1_context* ctx, secp256k1_ecdsa_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { - secp256k1_scalar r, s; - secp256k1_scalar sec, non, msg; - int ret = 0; - int overflow = 0; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(msg32 != NULL); - ARG_CHECK(signature != NULL); - ARG_CHECK(seckey != NULL); - if (noncefp == NULL) { - noncefp = secp256k1_nonce_function_default; - } - - secp256k1_scalar_set_b32(&sec, seckey, &overflow); - /* Fail if the secret key is invalid. */ - if (!overflow && !secp256k1_scalar_is_zero(&sec)) { - unsigned char nonce32[32]; - unsigned int count = 0; - secp256k1_scalar_set_b32(&msg, msg32, NULL); - while (1) { - ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); - if (!ret) { - break; - } - secp256k1_scalar_set_b32(&non, nonce32, &overflow); - if (!overflow && !secp256k1_scalar_is_zero(&non)) { - if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, NULL)) { - break; - } - } - count++; - } - memset(nonce32, 0, 32); - secp256k1_scalar_clear(&msg); - secp256k1_scalar_clear(&non); - secp256k1_scalar_clear(&sec); - } - if (ret) { - secp256k1_ecdsa_signature_save(signature, &r, &s); - } else { - memset(signature, 0, sizeof(*signature)); - } - return ret; -} - -int secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char *seckey) { - secp256k1_scalar sec; - int ret; - int overflow; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(seckey != NULL); - - secp256k1_scalar_set_b32(&sec, seckey, &overflow); - ret = !overflow && !secp256k1_scalar_is_zero(&sec); - secp256k1_scalar_clear(&sec); - return ret; -} - -int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) { - secp256k1_gej pj; - secp256k1_ge p; - secp256k1_scalar sec; - int overflow; - int ret = 0; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(pubkey != NULL); - memset(pubkey, 0, sizeof(*pubkey)); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - ARG_CHECK(seckey != NULL); - - secp256k1_scalar_set_b32(&sec, seckey, &overflow); - ret = (!overflow) & (!secp256k1_scalar_is_zero(&sec)); - if (ret) { - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec); - secp256k1_ge_set_gej(&p, &pj); - secp256k1_pubkey_save(pubkey, &p); - } - secp256k1_scalar_clear(&sec); - return ret; -} - -int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { - secp256k1_scalar term; - secp256k1_scalar sec; - int ret = 0; - int overflow = 0; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(seckey != NULL); - ARG_CHECK(tweak != NULL); - - secp256k1_scalar_set_b32(&term, tweak, &overflow); - secp256k1_scalar_set_b32(&sec, seckey, NULL); - - ret = !overflow && secp256k1_eckey_privkey_tweak_add(&sec, &term); - memset(seckey, 0, 32); - if (ret) { - secp256k1_scalar_get_b32(seckey, &sec); - } - - secp256k1_scalar_clear(&sec); - secp256k1_scalar_clear(&term); - return ret; -} - -int secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { - secp256k1_ge p; - secp256k1_scalar term; - int ret = 0; - int overflow = 0; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(pubkey != NULL); - ARG_CHECK(tweak != NULL); - - secp256k1_scalar_set_b32(&term, tweak, &overflow); - ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); - memset(pubkey, 0, sizeof(*pubkey)); - if (ret) { - if (secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term)) { - secp256k1_pubkey_save(pubkey, &p); - } else { - ret = 0; - } - } - - return ret; -} - -int secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { - secp256k1_scalar factor; - secp256k1_scalar sec; - int ret = 0; - int overflow = 0; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(seckey != NULL); - ARG_CHECK(tweak != NULL); - - secp256k1_scalar_set_b32(&factor, tweak, &overflow); - secp256k1_scalar_set_b32(&sec, seckey, NULL); - ret = !overflow && secp256k1_eckey_privkey_tweak_mul(&sec, &factor); - memset(seckey, 0, 32); - if (ret) { - secp256k1_scalar_get_b32(seckey, &sec); - } - - secp256k1_scalar_clear(&sec); - secp256k1_scalar_clear(&factor); - return ret; -} - -int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { - secp256k1_ge p; - secp256k1_scalar factor; - int ret = 0; - int overflow = 0; - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); - ARG_CHECK(pubkey != NULL); - ARG_CHECK(tweak != NULL); - - secp256k1_scalar_set_b32(&factor, tweak, &overflow); - ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); - memset(pubkey, 0, sizeof(*pubkey)); - if (ret) { - if (secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor)) { - secp256k1_pubkey_save(pubkey, &p); - } else { - ret = 0; - } - } - - return ret; -} - -int secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) { - VERIFY_CHECK(ctx != NULL); - ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); - secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); - return 1; -} - -int secp256k1_ec_pubkey_combine(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, const secp256k1_pubkey * const *pubnonces, size_t n) { - size_t i; - secp256k1_gej Qj; - secp256k1_ge Q; - - ARG_CHECK(pubnonce != NULL); - memset(pubnonce, 0, sizeof(*pubnonce)); - ARG_CHECK(n >= 1); - ARG_CHECK(pubnonces != NULL); - - secp256k1_gej_set_infinity(&Qj); - - for (i = 0; i < n; i++) { - secp256k1_pubkey_load(ctx, &Q, pubnonces[i]); - secp256k1_gej_add_ge(&Qj, &Qj, &Q); - } - if (secp256k1_gej_is_infinity(&Qj)) { - return 0; - } - secp256k1_ge_set_gej(&Q, &Qj); - secp256k1_pubkey_save(pubnonce, &Q); - return 1; -} - -#ifdef ENABLE_MODULE_ECDH -# include "modules/ecdh/main_impl.h" -#endif - -#ifdef ENABLE_MODULE_SCHNORR -# include "modules/schnorr/main_impl.h" -#endif - -#ifdef ENABLE_MODULE_RECOVERY -# include "modules/recovery/main_impl.h" -#endif - -#ifdef ENABLE_MODULE_RANGEPROOF -# include "modules/rangeproof/main_impl.h" -#endif diff --git a/external/libwally-core/src/secp256k1/src/testrand.h b/external/libwally-core/src/secp256k1/src/testrand.h deleted file mode 100644 index c99314922..000000000 --- a/external/libwally-core/src/secp256k1/src/testrand.h +++ /dev/null @@ -1,41 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013, 2014 Pieter Wuille * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_TESTRAND_H_ -#define _SECP256K1_TESTRAND_H_ - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -/* A non-cryptographic RNG used only for test infrastructure. */ - -/** Seed the pseudorandom number generator for testing. */ -SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16); - -/** Generate a pseudorandom number in the range [0..2**32-1]. */ -static uint32_t secp256k1_rand32(void); - -/** Generate a pseudorandom number in the range [0..2**bits-1]. Bits must be 1 or - * more. */ -static uint32_t secp256k1_rand_bits(int bits); - -/** Generate a pseudorandom number in the range [0..range-1]. */ -static uint32_t secp256k1_rand_int(uint32_t range); - -/** Generate a pseudorandom 32-byte array. */ -static void secp256k1_rand256(unsigned char *b32); - -/** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */ -static void secp256k1_rand256_test(unsigned char *b32); - -/** Generate pseudorandom bytes with long sequences of zero and one bits. */ -static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len); - -/** Generate a pseudorandom 64-bit integer in the range min..max, inclusive. */ -static int64_t secp256k1_rands64(uint64_t min, uint64_t max); - -#endif diff --git a/external/libwally-core/src/secp256k1/src/testrand_impl.h b/external/libwally-core/src/secp256k1/src/testrand_impl.h deleted file mode 100644 index b5450401d..000000000 --- a/external/libwally-core/src/secp256k1/src/testrand_impl.h +++ /dev/null @@ -1,127 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille, Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_TESTRAND_IMPL_H_ -#define _SECP256K1_TESTRAND_IMPL_H_ - -#include -#include - -#include "testrand.h" -#include "hash.h" - -static secp256k1_rfc6979_hmac_sha256_t secp256k1_test_rng; -static uint32_t secp256k1_test_rng_precomputed[8]; -static int secp256k1_test_rng_precomputed_used = 8; -static uint64_t secp256k1_test_rng_integer; -static int secp256k1_test_rng_integer_bits_left = 0; - -SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) { - secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, seed16, 16); -} - -SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { - if (secp256k1_test_rng_precomputed_used == 8) { - secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, (unsigned char*)(&secp256k1_test_rng_precomputed[0]), sizeof(secp256k1_test_rng_precomputed)); - secp256k1_test_rng_precomputed_used = 0; - } - return secp256k1_test_rng_precomputed[secp256k1_test_rng_precomputed_used++]; -} - -static uint32_t secp256k1_rand_bits(int bits) { - uint32_t ret; - if (secp256k1_test_rng_integer_bits_left < bits) { - secp256k1_test_rng_integer |= (((uint64_t)secp256k1_rand32()) << secp256k1_test_rng_integer_bits_left); - secp256k1_test_rng_integer_bits_left += 32; - } - ret = secp256k1_test_rng_integer; - secp256k1_test_rng_integer >>= bits; - secp256k1_test_rng_integer_bits_left -= bits; - ret &= ((~((uint32_t)0)) >> (32 - bits)); - return ret; -} - -static uint32_t secp256k1_rand_int(uint32_t range) { - /* We want a uniform integer between 0 and range-1, inclusive. - * B is the smallest number such that range <= 2**B. - * two mechanisms implemented here: - * - generate B bits numbers until one below range is found, and return it - * - find the largest multiple M of range that is <= 2**(B+A), generate B+A - * bits numbers until one below M is found, and return it modulo range - * The second mechanism consumes A more bits of entropy in every iteration, - * but may need fewer iterations due to M being closer to 2**(B+A) then - * range is to 2**B. The array below (indexed by B) contains a 0 when the - * first mechanism is to be used, and the number A otherwise. - */ - static const int addbits[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0}; - uint32_t trange, mult; - int bits = 0; - if (range <= 1) { - return 0; - } - trange = range - 1; - while (trange > 0) { - trange >>= 1; - bits++; - } - if (addbits[bits]) { - bits = bits + addbits[bits]; - mult = ((~((uint32_t)0)) >> (32 - bits)) / range; - trange = range * mult; - } else { - trange = range; - mult = 1; - } - while(1) { - uint32_t x = secp256k1_rand_bits(bits); - if (x < trange) { - return (mult == 1) ? x : (x % range); - } - } -} - -static void secp256k1_rand256(unsigned char *b32) { - secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, b32, 32); -} - -static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len) { - size_t bits = 0; - memset(bytes, 0, len); - while (bits < len * 8) { - int now; - uint32_t val; - now = 1 + (secp256k1_rand_bits(6) * secp256k1_rand_bits(5) + 16) / 31; - val = secp256k1_rand_bits(1); - while (now > 0 && bits < len * 8) { - bytes[bits / 8] |= val << (bits % 8); - now--; - bits++; - } - } -} - -static void secp256k1_rand256_test(unsigned char *b32) { - secp256k1_rand_bytes_test(b32, 32); -} - -SECP256K1_INLINE static int64_t secp256k1_rands64(uint64_t min, uint64_t max) { - uint64_t range; - uint64_t r; - uint64_t clz; - VERIFY_CHECK(max >= min); - if (max == min) { - return min; - } - range = max - min; - clz = secp256k1_clz64_var(range); - do { - r = ((uint64_t)secp256k1_rand32() << 32) | secp256k1_rand32(); - r >>= clz; - } while (r > range); - return min + (int64_t)r; -} - -#endif diff --git a/external/libwally-core/src/secp256k1/src/tests.c b/external/libwally-core/src/secp256k1/src/tests.c deleted file mode 100644 index e927f087d..000000000 --- a/external/libwally-core/src/secp256k1/src/tests.c +++ /dev/null @@ -1,4580 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille, Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#include -#include - -#include - -#include "secp256k1.c" -#include "include/secp256k1.h" -#include "testrand_impl.h" - -#ifdef ENABLE_OPENSSL_TESTS -#include "openssl/bn.h" -#include "openssl/ec.h" -#include "openssl/ecdsa.h" -#include "openssl/obj_mac.h" -#endif - -#include "contrib/lax_der_parsing.c" -#include "contrib/lax_der_privatekey_parsing.c" - -#if !defined(VG_CHECK) -# if defined(VALGRIND) -# include -# define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y)) -# define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y)) -# else -# define VG_UNDEF(x,y) -# define VG_CHECK(x,y) -# endif -#endif - -static int count = 64; -static secp256k1_context *ctx = NULL; - -static void counting_illegal_callback_fn(const char* str, void* data) { - /* Dummy callback function that just counts. */ - int32_t *p; - (void)str; - p = data; - (*p)++; -} - -static void uncounting_illegal_callback_fn(const char* str, void* data) { - /* Dummy callback function that just counts (backwards). */ - int32_t *p; - (void)str; - p = data; - (*p)--; -} - -void random_field_element_test(secp256k1_fe *fe) { - do { - unsigned char b32[32]; - secp256k1_rand256_test(b32); - if (secp256k1_fe_set_b32(fe, b32)) { - break; - } - } while(1); -} - -void random_field_element_magnitude(secp256k1_fe *fe) { - secp256k1_fe zero; - int n = secp256k1_rand_int(9); - secp256k1_fe_normalize(fe); - if (n == 0) { - return; - } - secp256k1_fe_clear(&zero); - secp256k1_fe_negate(&zero, &zero, 0); - secp256k1_fe_mul_int(&zero, n - 1); - secp256k1_fe_add(fe, &zero); - VERIFY_CHECK(fe->magnitude == n); -} - -void random_group_element_test(secp256k1_ge *ge) { - secp256k1_fe fe; - do { - random_field_element_test(&fe); - if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand_bits(1))) { - secp256k1_fe_normalize(&ge->y); - break; - } - } while(1); -} - -void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge) { - secp256k1_fe z2, z3; - do { - random_field_element_test(&gej->z); - if (!secp256k1_fe_is_zero(&gej->z)) { - break; - } - } while(1); - secp256k1_fe_sqr(&z2, &gej->z); - secp256k1_fe_mul(&z3, &z2, &gej->z); - secp256k1_fe_mul(&gej->x, &ge->x, &z2); - secp256k1_fe_mul(&gej->y, &ge->y, &z3); - gej->infinity = ge->infinity; -} - -void random_scalar_order_test(secp256k1_scalar *num) { - do { - unsigned char b32[32]; - int overflow = 0; - secp256k1_rand256_test(b32); - secp256k1_scalar_set_b32(num, b32, &overflow); - if (overflow || secp256k1_scalar_is_zero(num)) { - continue; - } - break; - } while(1); -} - -void random_scalar_order(secp256k1_scalar *num) { - do { - unsigned char b32[32]; - int overflow = 0; - secp256k1_rand256(b32); - secp256k1_scalar_set_b32(num, b32, &overflow); - if (overflow || secp256k1_scalar_is_zero(num)) { - continue; - } - break; - } while(1); -} - -void run_util_tests(void) { - int i; - uint64_t r; - uint64_t r2; - uint64_t r3; - int64_t s; - CHECK(secp256k1_clz64_var(0) == 64); - CHECK(secp256k1_clz64_var(1) == 63); - CHECK(secp256k1_clz64_var(2) == 62); - CHECK(secp256k1_clz64_var(3) == 62); - CHECK(secp256k1_clz64_var(~0ULL) == 0); - CHECK(secp256k1_clz64_var((~0ULL) - 1) == 0); - CHECK(secp256k1_clz64_var((~0ULL) >> 1) == 1); - CHECK(secp256k1_clz64_var((~0ULL) >> 2) == 2); - CHECK(secp256k1_sign_and_abs64(&r, INT64_MAX) == 0); - CHECK(r == INT64_MAX); - CHECK(secp256k1_sign_and_abs64(&r, INT64_MAX - 1) == 0); - CHECK(r == INT64_MAX - 1); - CHECK(secp256k1_sign_and_abs64(&r, INT64_MIN) == 1); - CHECK(r == (uint64_t)INT64_MAX + 1); - CHECK(secp256k1_sign_and_abs64(&r, INT64_MIN + 1) == 1); - CHECK(r == (uint64_t)INT64_MAX); - CHECK(secp256k1_sign_and_abs64(&r, 0) == 0); - CHECK(r == 0); - CHECK(secp256k1_sign_and_abs64(&r, 1) == 0); - CHECK(r == 1); - CHECK(secp256k1_sign_and_abs64(&r, -1) == 1); - CHECK(r == 1); - CHECK(secp256k1_sign_and_abs64(&r, 2) == 0); - CHECK(r == 2); - CHECK(secp256k1_sign_and_abs64(&r, -2) == 1); - CHECK(r == 2); - for (i = 0; i < 10; i++) { - CHECK(secp256k1_clz64_var((~0ULL) - secp256k1_rand32()) == 0); - r = ((uint64_t)secp256k1_rand32() << 32) | secp256k1_rand32(); - r2 = secp256k1_rands64(0, r); - CHECK(r2 <= r); - r3 = secp256k1_rands64(r2, r); - CHECK((r3 >= r2) && (r3 <= r)); - r = secp256k1_rands64(0, INT64_MAX); - s = (int64_t)r * (secp256k1_rand32()&1?-1:1); - CHECK(secp256k1_sign_and_abs64(&r2, s) == (s < 0)); - CHECK(r2 == r); - } -} - -void run_context_tests(void) { - secp256k1_pubkey pubkey; - secp256k1_ecdsa_signature sig; - unsigned char ctmp[32]; - int32_t ecount; - int32_t ecount2; - secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); - secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); - secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); - secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - - secp256k1_gej pubj; - secp256k1_ge pub; - secp256k1_scalar msg, key, nonce; - secp256k1_scalar sigr, sigs; - - ecount = 0; - ecount2 = 10; - secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); - secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount2); - secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, NULL); - CHECK(vrfy->error_callback.fn != sign->error_callback.fn); - - /*** clone and destroy all of them to make sure cloning was complete ***/ - { - secp256k1_context *ctx_tmp; - - ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp); - ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp); - ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_destroy(ctx_tmp); - ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp); - } - - /* Verify that the error callback makes it across the clone. */ - CHECK(vrfy->error_callback.fn != sign->error_callback.fn); - /* And that it resets back to default. */ - secp256k1_context_set_error_callback(sign, NULL, NULL); - CHECK(vrfy->error_callback.fn == sign->error_callback.fn); - - /*** attempt to use them ***/ - random_scalar_order_test(&msg); - random_scalar_order_test(&key); - secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key); - secp256k1_ge_set_gej(&pub, &pubj); - - /* Verify context-type checking illegal-argument errors. */ - memset(ctmp, 1, 32); - CHECK(secp256k1_ec_pubkey_create(vrfy, &pubkey, ctmp) == 0); - CHECK(ecount == 1); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_create(sign, &pubkey, ctmp) == 1); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ecdsa_sign(vrfy, &sig, ctmp, ctmp, NULL, NULL) == 0); - CHECK(ecount == 2); - VG_UNDEF(&sig, sizeof(sig)); - CHECK(secp256k1_ecdsa_sign(sign, &sig, ctmp, ctmp, NULL, NULL) == 1); - VG_CHECK(&sig, sizeof(sig)); - CHECK(ecount2 == 10); - CHECK(secp256k1_ecdsa_verify(sign, &sig, ctmp, &pubkey) == 0); - CHECK(ecount2 == 11); - CHECK(secp256k1_ecdsa_verify(vrfy, &sig, ctmp, &pubkey) == 1); - CHECK(ecount == 2); - CHECK(secp256k1_ec_pubkey_tweak_add(sign, &pubkey, ctmp) == 0); - CHECK(ecount2 == 12); - CHECK(secp256k1_ec_pubkey_tweak_add(vrfy, &pubkey, ctmp) == 1); - CHECK(ecount == 2); - CHECK(secp256k1_ec_pubkey_tweak_mul(sign, &pubkey, ctmp) == 0); - CHECK(ecount2 == 13); - CHECK(secp256k1_ec_pubkey_tweak_mul(vrfy, &pubkey, ctmp) == 1); - CHECK(ecount == 2); - CHECK(secp256k1_context_randomize(vrfy, ctmp) == 0); - CHECK(ecount == 3); - CHECK(secp256k1_context_randomize(sign, NULL) == 1); - CHECK(ecount2 == 13); - secp256k1_context_set_illegal_callback(vrfy, NULL, NULL); - secp256k1_context_set_illegal_callback(sign, NULL, NULL); - - /* This shouldn't leak memory, due to already-set tests. */ - secp256k1_ecmult_gen_context_build(&sign->ecmult_gen_ctx, NULL); - secp256k1_ecmult_context_build(&vrfy->ecmult_ctx, NULL); - - /* obtain a working nonce */ - do { - random_scalar_order_test(&nonce); - } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); - - /* try signing */ - CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); - CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); - - /* try verifying */ - CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sigr, &sigs, &pub, &msg)); - CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sigr, &sigs, &pub, &msg)); - - /* cleanup */ - secp256k1_context_destroy(none); - secp256k1_context_destroy(sign); - secp256k1_context_destroy(vrfy); - secp256k1_context_destroy(both); - /* Defined as no-op. */ - secp256k1_context_destroy(NULL); -} - -/***** HASH TESTS *****/ - -void run_sha256_tests(void) { - static const char *inputs[8] = { - "", "abc", "message digest", "secure hash algorithm", "SHA256 is considered to be safe", - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "For this sample, this 63-byte string will be used as input data", - "This is exactly 64 bytes long, not counting the terminating byte" - }; - static const unsigned char outputs[8][32] = { - {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}, - {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}, - {0xf7, 0x84, 0x6f, 0x55, 0xcf, 0x23, 0xe1, 0x4e, 0xeb, 0xea, 0xb5, 0xb4, 0xe1, 0x55, 0x0c, 0xad, 0x5b, 0x50, 0x9e, 0x33, 0x48, 0xfb, 0xc4, 0xef, 0xa3, 0xa1, 0x41, 0x3d, 0x39, 0x3c, 0xb6, 0x50}, - {0xf3, 0x0c, 0xeb, 0x2b, 0xb2, 0x82, 0x9e, 0x79, 0xe4, 0xca, 0x97, 0x53, 0xd3, 0x5a, 0x8e, 0xcc, 0x00, 0x26, 0x2d, 0x16, 0x4c, 0xc0, 0x77, 0x08, 0x02, 0x95, 0x38, 0x1c, 0xbd, 0x64, 0x3f, 0x0d}, - {0x68, 0x19, 0xd9, 0x15, 0xc7, 0x3f, 0x4d, 0x1e, 0x77, 0xe4, 0xe1, 0xb5, 0x2d, 0x1f, 0xa0, 0xf9, 0xcf, 0x9b, 0xea, 0xea, 0xd3, 0x93, 0x9f, 0x15, 0x87, 0x4b, 0xd9, 0x88, 0xe2, 0xa2, 0x36, 0x30}, - {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1}, - {0xf0, 0x8a, 0x78, 0xcb, 0xba, 0xee, 0x08, 0x2b, 0x05, 0x2a, 0xe0, 0x70, 0x8f, 0x32, 0xfa, 0x1e, 0x50, 0xc5, 0xc4, 0x21, 0xaa, 0x77, 0x2b, 0xa5, 0xdb, 0xb4, 0x06, 0xa2, 0xea, 0x6b, 0xe3, 0x42}, - {0xab, 0x64, 0xef, 0xf7, 0xe8, 0x8e, 0x2e, 0x46, 0x16, 0x5e, 0x29, 0xf2, 0xbc, 0xe4, 0x18, 0x26, 0xbd, 0x4c, 0x7b, 0x35, 0x52, 0xf6, 0xb3, 0x82, 0xa9, 0xe7, 0xd3, 0xaf, 0x47, 0xc2, 0x45, 0xf8} - }; - int i; - for (i = 0; i < 8; i++) { - unsigned char out[32]; - secp256k1_sha256_t hasher; - secp256k1_sha256_initialize(&hasher); - secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); - secp256k1_sha256_finalize(&hasher, out); - CHECK(memcmp(out, outputs[i], 32) == 0); - if (strlen(inputs[i]) > 0) { - int split = secp256k1_rand_int(strlen(inputs[i])); - secp256k1_sha256_initialize(&hasher); - secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); - secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); - secp256k1_sha256_finalize(&hasher, out); - CHECK(memcmp(out, outputs[i], 32) == 0); - } - } -} - -void run_hmac_sha256_tests(void) { - static const char *keys[6] = { - "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", - "\x4a\x65\x66\x65", - "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", - "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", - "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", - "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" - }; - static const char *inputs[6] = { - "\x48\x69\x20\x54\x68\x65\x72\x65", - "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f", - "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", - "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd", - "\x54\x65\x73\x74\x20\x55\x73\x69\x6e\x67\x20\x4c\x61\x72\x67\x65\x72\x20\x54\x68\x61\x6e\x20\x42\x6c\x6f\x63\x6b\x2d\x53\x69\x7a\x65\x20\x4b\x65\x79\x20\x2d\x20\x48\x61\x73\x68\x20\x4b\x65\x79\x20\x46\x69\x72\x73\x74", - "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68\x6d\x2e" - }; - static const unsigned char outputs[6][32] = { - {0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7}, - {0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43}, - {0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe}, - {0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b}, - {0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54}, - {0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2} - }; - int i; - for (i = 0; i < 6; i++) { - secp256k1_hmac_sha256_t hasher; - unsigned char out[32]; - secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); - secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); - secp256k1_hmac_sha256_finalize(&hasher, out); - CHECK(memcmp(out, outputs[i], 32) == 0); - if (strlen(inputs[i]) > 0) { - int split = secp256k1_rand_int(strlen(inputs[i])); - secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); - secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); - secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); - secp256k1_hmac_sha256_finalize(&hasher, out); - CHECK(memcmp(out, outputs[i], 32) == 0); - } - } -} - -void run_rfc6979_hmac_sha256_tests(void) { - static const unsigned char key1[65] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a, 0}; - static const unsigned char out1[3][32] = { - {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb}, - {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a}, - {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e} - }; - - static const unsigned char key2[64] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; - static const unsigned char out2[3][32] = { - {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95}, - {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9}, - {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94} - }; - - secp256k1_rfc6979_hmac_sha256_t rng; - unsigned char out[32]; - int i; - - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64); - for (i = 0; i < 3; i++) { - secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); - CHECK(memcmp(out, out1[i], 32) == 0); - } - secp256k1_rfc6979_hmac_sha256_finalize(&rng); - - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65); - for (i = 0; i < 3; i++) { - secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); - CHECK(memcmp(out, out1[i], 32) != 0); - } - secp256k1_rfc6979_hmac_sha256_finalize(&rng); - - secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64); - for (i = 0; i < 3; i++) { - secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); - CHECK(memcmp(out, out2[i], 32) == 0); - } - secp256k1_rfc6979_hmac_sha256_finalize(&rng); -} - -/***** RANDOM TESTS *****/ - -void test_rand_bits(int rand32, int bits) { - /* (1-1/2^B)^rounds[B] < 1/10^9, so rounds is the number of iterations to - * get a false negative chance below once in a billion */ - static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316}; - /* We try multiplying the results with various odd numbers, which shouldn't - * influence the uniform distribution modulo a power of 2. */ - static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011}; - /* We only select up to 6 bits from the output to analyse */ - unsigned int usebits = bits > 6 ? 6 : bits; - unsigned int maxshift = bits - usebits; - /* For each of the maxshift+1 usebits-bit sequences inside a bits-bit - number, track all observed outcomes, one per bit in a uint64_t. */ - uint64_t x[6][27] = {{0}}; - unsigned int i, shift, m; - /* Multiply the output of all rand calls with the odd number m, which - should not change the uniformity of its distribution. */ - for (i = 0; i < rounds[usebits]; i++) { - uint32_t r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits)); - CHECK((((uint64_t)r) >> bits) == 0); - for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { - uint32_t rm = r * mults[m]; - for (shift = 0; shift <= maxshift; shift++) { - x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1))); - } - } - } - for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { - for (shift = 0; shift <= maxshift; shift++) { - /* Test that the lower usebits bits of x[shift] are 1 */ - CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0); - } - } -} - -/* Subrange must be a whole divisor of range, and at most 64 */ -void test_rand_int(uint32_t range, uint32_t subrange) { - /* (1-1/subrange)^rounds < 1/10^9 */ - int rounds = (subrange * 2073) / 100; - int i; - uint64_t x = 0; - CHECK((range % subrange) == 0); - for (i = 0; i < rounds; i++) { - uint32_t r = secp256k1_rand_int(range); - CHECK(r < range); - r = r % subrange; - x |= (((uint64_t)1) << r); - } - /* Test that the lower subrange bits of x are 1. */ - CHECK(((~x) << (64 - subrange)) == 0); -} - -void run_rand_bits(void) { - size_t b; - test_rand_bits(1, 32); - for (b = 1; b <= 32; b++) { - test_rand_bits(0, b); - } -} - -void run_rand_int(void) { - static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432}; - static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64}; - unsigned int m, s; - for (m = 0; m < sizeof(ms) / sizeof(ms[0]); m++) { - for (s = 0; s < sizeof(ss) / sizeof(ss[0]); s++) { - test_rand_int(ms[m] * ss[s], ss[s]); - } - } -} - -/***** NUM TESTS *****/ - -#ifndef USE_NUM_NONE -void random_num_negate(secp256k1_num *num) { - if (secp256k1_rand_bits(1)) { - secp256k1_num_negate(num); - } -} - -void random_num_order_test(secp256k1_num *num) { - secp256k1_scalar sc; - random_scalar_order_test(&sc); - secp256k1_scalar_get_num(num, &sc); -} - -void random_num_order(secp256k1_num *num) { - secp256k1_scalar sc; - random_scalar_order(&sc); - secp256k1_scalar_get_num(num, &sc); -} - -void test_num_negate(void) { - secp256k1_num n1; - secp256k1_num n2; - random_num_order_test(&n1); /* n1 = R */ - random_num_negate(&n1); - secp256k1_num_copy(&n2, &n1); /* n2 = R */ - secp256k1_num_sub(&n1, &n2, &n1); /* n1 = n2-n1 = 0 */ - CHECK(secp256k1_num_is_zero(&n1)); - secp256k1_num_copy(&n1, &n2); /* n1 = R */ - secp256k1_num_negate(&n1); /* n1 = -R */ - CHECK(!secp256k1_num_is_zero(&n1)); - secp256k1_num_add(&n1, &n2, &n1); /* n1 = n2+n1 = 0 */ - CHECK(secp256k1_num_is_zero(&n1)); - secp256k1_num_copy(&n1, &n2); /* n1 = R */ - secp256k1_num_negate(&n1); /* n1 = -R */ - CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2)); - secp256k1_num_negate(&n1); /* n1 = R */ - CHECK(secp256k1_num_eq(&n1, &n2)); -} - -void test_num_add_sub(void) { - int i; - secp256k1_scalar s; - secp256k1_num n1; - secp256k1_num n2; - secp256k1_num n1p2, n2p1, n1m2, n2m1; - random_num_order_test(&n1); /* n1 = R1 */ - if (secp256k1_rand_bits(1)) { - random_num_negate(&n1); - } - random_num_order_test(&n2); /* n2 = R2 */ - if (secp256k1_rand_bits(1)) { - random_num_negate(&n2); - } - secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */ - secp256k1_num_add(&n2p1, &n2, &n1); /* n2p1 = R2 + R1 */ - secp256k1_num_sub(&n1m2, &n1, &n2); /* n1m2 = R1 - R2 */ - secp256k1_num_sub(&n2m1, &n2, &n1); /* n2m1 = R2 - R1 */ - CHECK(secp256k1_num_eq(&n1p2, &n2p1)); - CHECK(!secp256k1_num_eq(&n1p2, &n1m2)); - secp256k1_num_negate(&n2m1); /* n2m1 = -R2 + R1 */ - CHECK(secp256k1_num_eq(&n2m1, &n1m2)); - CHECK(!secp256k1_num_eq(&n2m1, &n1)); - secp256k1_num_add(&n2m1, &n2m1, &n2); /* n2m1 = -R2 + R1 + R2 = R1 */ - CHECK(secp256k1_num_eq(&n2m1, &n1)); - CHECK(!secp256k1_num_eq(&n2p1, &n1)); - secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */ - CHECK(secp256k1_num_eq(&n2p1, &n1)); - - /* check is_one */ - secp256k1_scalar_set_int(&s, 1); - secp256k1_scalar_get_num(&n1, &s); - CHECK(secp256k1_num_is_one(&n1)); - /* check that 2^n + 1 is never 1 */ - secp256k1_scalar_get_num(&n2, &s); - for (i = 0; i < 250; ++i) { - secp256k1_num_add(&n1, &n1, &n1); /* n1 *= 2 */ - secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = n1 + 1 */ - CHECK(!secp256k1_num_is_one(&n1p2)); - } -} - -void test_num_mod(void) { - int i; - secp256k1_scalar s; - secp256k1_num order, n; - - /* check that 0 mod anything is 0 */ - random_scalar_order_test(&s); - secp256k1_scalar_get_num(&order, &s); - secp256k1_scalar_set_int(&s, 0); - secp256k1_scalar_get_num(&n, &s); - secp256k1_num_mod(&n, &order); - CHECK(secp256k1_num_is_zero(&n)); - - /* check that anything mod 1 is 0 */ - secp256k1_scalar_set_int(&s, 1); - secp256k1_scalar_get_num(&order, &s); - secp256k1_scalar_get_num(&n, &s); - secp256k1_num_mod(&n, &order); - CHECK(secp256k1_num_is_zero(&n)); - - /* check that increasing the number past 2^256 does not break this */ - random_scalar_order_test(&s); - secp256k1_scalar_get_num(&n, &s); - /* multiply by 2^8, which'll test this case with high probability */ - for (i = 0; i < 8; ++i) { - secp256k1_num_add(&n, &n, &n); - } - secp256k1_num_mod(&n, &order); - CHECK(secp256k1_num_is_zero(&n)); -} - -void test_num_jacobi(void) { - secp256k1_scalar sqr; - secp256k1_scalar small; - secp256k1_scalar five; /* five is not a quadratic residue */ - secp256k1_num order, n; - int i; - /* squares mod 5 are 1, 4 */ - const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 }; - - /* check some small values with 5 as the order */ - secp256k1_scalar_set_int(&five, 5); - secp256k1_scalar_get_num(&order, &five); - for (i = 0; i < 10; ++i) { - secp256k1_scalar_set_int(&small, i); - secp256k1_scalar_get_num(&n, &small); - CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]); - } - - /** test large values with 5 as group order */ - secp256k1_scalar_get_num(&order, &five); - /* we first need a scalar which is not a multiple of 5 */ - do { - secp256k1_num fiven; - random_scalar_order_test(&sqr); - secp256k1_scalar_get_num(&fiven, &five); - secp256k1_scalar_get_num(&n, &sqr); - secp256k1_num_mod(&n, &fiven); - } while (secp256k1_num_is_zero(&n)); - /* next force it to be a residue. 2 is a nonresidue mod 5 so we can - * just multiply by two, i.e. add the number to itself */ - if (secp256k1_num_jacobi(&n, &order) == -1) { - secp256k1_num_add(&n, &n, &n); - } - - /* test residue */ - CHECK(secp256k1_num_jacobi(&n, &order) == 1); - /* test nonresidue */ - secp256k1_num_add(&n, &n, &n); - CHECK(secp256k1_num_jacobi(&n, &order) == -1); - - /** test with secp group order as order */ - secp256k1_scalar_order_get_num(&order); - random_scalar_order_test(&sqr); - secp256k1_scalar_sqr(&sqr, &sqr); - /* test residue */ - secp256k1_scalar_get_num(&n, &sqr); - CHECK(secp256k1_num_jacobi(&n, &order) == 1); - /* test nonresidue */ - secp256k1_scalar_mul(&sqr, &sqr, &five); - secp256k1_scalar_get_num(&n, &sqr); - CHECK(secp256k1_num_jacobi(&n, &order) == -1); - /* test multiple of the order*/ - CHECK(secp256k1_num_jacobi(&order, &order) == 0); - - /* check one less than the order */ - secp256k1_scalar_set_int(&small, 1); - secp256k1_scalar_get_num(&n, &small); - secp256k1_num_sub(&n, &order, &n); - CHECK(secp256k1_num_jacobi(&n, &order) == 1); /* sage confirms this is 1 */ -} - -void run_num_smalltests(void) { - int i; - for (i = 0; i < 100*count; i++) { - test_num_negate(); - test_num_add_sub(); - test_num_mod(); - test_num_jacobi(); - } -} -#endif - -/***** SCALAR TESTS *****/ - -void scalar_test(void) { - secp256k1_scalar s; - secp256k1_scalar s1; - secp256k1_scalar s2; -#ifndef USE_NUM_NONE - secp256k1_num snum, s1num, s2num; - secp256k1_num order, half_order; -#endif - unsigned char c[32]; - - /* Set 's' to a random scalar, with value 'snum'. */ - random_scalar_order_test(&s); - - /* Set 's1' to a random scalar, with value 's1num'. */ - random_scalar_order_test(&s1); - - /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */ - random_scalar_order_test(&s2); - secp256k1_scalar_get_b32(c, &s2); - -#ifndef USE_NUM_NONE - secp256k1_scalar_get_num(&snum, &s); - secp256k1_scalar_get_num(&s1num, &s1); - secp256k1_scalar_get_num(&s2num, &s2); - - secp256k1_scalar_order_get_num(&order); - half_order = order; - secp256k1_num_shift(&half_order, 1); -#endif - - { - int i; - /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */ - secp256k1_scalar n; - secp256k1_scalar_set_int(&n, 0); - for (i = 0; i < 256; i += 4) { - secp256k1_scalar t; - int j; - secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4)); - for (j = 0; j < 4; j++) { - secp256k1_scalar_add(&n, &n, &n); - } - secp256k1_scalar_add(&n, &n, &t); - } - CHECK(secp256k1_scalar_eq(&n, &s)); - } - - { - /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */ - secp256k1_scalar n; - int i = 0; - secp256k1_scalar_set_int(&n, 0); - while (i < 256) { - secp256k1_scalar t; - int j; - int now = secp256k1_rand_int(15) + 1; - if (now + i > 256) { - now = 256 - i; - } - secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now)); - for (j = 0; j < now; j++) { - secp256k1_scalar_add(&n, &n, &n); - } - secp256k1_scalar_add(&n, &n, &t); - i += now; - } - CHECK(secp256k1_scalar_eq(&n, &s)); - } - -#ifndef USE_NUM_NONE - { - /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ - secp256k1_num rnum; - secp256k1_num r2num; - secp256k1_scalar r; - secp256k1_num_add(&rnum, &snum, &s2num); - secp256k1_num_mod(&rnum, &order); - secp256k1_scalar_add(&r, &s, &s2); - secp256k1_scalar_get_num(&r2num, &r); - CHECK(secp256k1_num_eq(&rnum, &r2num)); - } - - { - /* Test that multiplying the scalars is equal to multiplying their numbers modulo the order. */ - secp256k1_scalar r; - secp256k1_num r2num; - secp256k1_num rnum; - secp256k1_num_mul(&rnum, &snum, &s2num); - secp256k1_num_mod(&rnum, &order); - secp256k1_scalar_mul(&r, &s, &s2); - secp256k1_scalar_get_num(&r2num, &r); - CHECK(secp256k1_num_eq(&rnum, &r2num)); - /* The result can only be zero if at least one of the factors was zero. */ - CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2))); - /* The results can only be equal to one of the factors if that factor was zero, or the other factor was one. */ - CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2))); - CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s))); - } - - { - secp256k1_scalar neg; - secp256k1_num negnum; - secp256k1_num negnum2; - /* Check that comparison with zero matches comparison with zero on the number. */ - CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s)); - /* Check that comparison with the half order is equal to testing for high scalar. */ - CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0)); - secp256k1_scalar_negate(&neg, &s); - secp256k1_num_sub(&negnum, &order, &snum); - secp256k1_num_mod(&negnum, &order); - /* Check that comparison with the half order is equal to testing for high scalar after negation. */ - CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0)); - /* Negating should change the high property, unless the value was already zero. */ - CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s)); - secp256k1_scalar_get_num(&negnum2, &neg); - /* Negating a scalar should be equal to (order - n) mod order on the number. */ - CHECK(secp256k1_num_eq(&negnum, &negnum2)); - secp256k1_scalar_add(&neg, &neg, &s); - /* Adding a number to its negation should result in zero. */ - CHECK(secp256k1_scalar_is_zero(&neg)); - secp256k1_scalar_negate(&neg, &neg); - /* Negating zero should still result in zero. */ - CHECK(secp256k1_scalar_is_zero(&neg)); - } - - { - /* Test secp256k1_scalar_mul_shift_var. */ - secp256k1_scalar r; - secp256k1_num one; - secp256k1_num rnum; - secp256k1_num rnum2; - unsigned char cone[1] = {0x01}; - unsigned int shift = 256 + secp256k1_rand_int(257); - secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift); - secp256k1_num_mul(&rnum, &s1num, &s2num); - secp256k1_num_shift(&rnum, shift - 1); - secp256k1_num_set_bin(&one, cone, 1); - secp256k1_num_add(&rnum, &rnum, &one); - secp256k1_num_shift(&rnum, 1); - secp256k1_scalar_get_num(&rnum2, &r); - CHECK(secp256k1_num_eq(&rnum, &rnum2)); - } - - { - /* test secp256k1_scalar_shr_int */ - secp256k1_scalar r; - int i; - random_scalar_order_test(&r); - for (i = 0; i < 100; ++i) { - int low; - int shift = 1 + secp256k1_rand_int(15); - int expected = r.d[0] % (1 << shift); - low = secp256k1_scalar_shr_int(&r, shift); - CHECK(expected == low); - } - } -#endif - - { - /* Test that scalar inverses are equal to the inverse of their number modulo the order. */ - if (!secp256k1_scalar_is_zero(&s)) { - secp256k1_scalar inv; -#ifndef USE_NUM_NONE - secp256k1_num invnum; - secp256k1_num invnum2; -#endif - secp256k1_scalar_inverse(&inv, &s); -#ifndef USE_NUM_NONE - secp256k1_num_mod_inverse(&invnum, &snum, &order); - secp256k1_scalar_get_num(&invnum2, &inv); - CHECK(secp256k1_num_eq(&invnum, &invnum2)); -#endif - secp256k1_scalar_mul(&inv, &inv, &s); - /* Multiplying a scalar with its inverse must result in one. */ - CHECK(secp256k1_scalar_is_one(&inv)); - secp256k1_scalar_inverse(&inv, &inv); - /* Inverting one must result in one. */ - CHECK(secp256k1_scalar_is_one(&inv)); -#ifndef USE_NUM_NONE - secp256k1_scalar_get_num(&invnum, &inv); - CHECK(secp256k1_num_is_one(&invnum)); -#endif - } - } - - { - /* Test commutativity of add. */ - secp256k1_scalar r1, r2; - secp256k1_scalar_add(&r1, &s1, &s2); - secp256k1_scalar_add(&r2, &s2, &s1); - CHECK(secp256k1_scalar_eq(&r1, &r2)); - } - - { - secp256k1_scalar r1, r2; - secp256k1_scalar b; - int i; - /* Test add_bit. */ - int bit = secp256k1_rand_bits(8); - secp256k1_scalar_set_int(&b, 1); - CHECK(secp256k1_scalar_is_one(&b)); - for (i = 0; i < bit; i++) { - secp256k1_scalar_add(&b, &b, &b); - } - r1 = s1; - r2 = s1; - if (!secp256k1_scalar_add(&r1, &r1, &b)) { - /* No overflow happened. */ - secp256k1_scalar_cadd_bit(&r2, bit, 1); - CHECK(secp256k1_scalar_eq(&r1, &r2)); - /* cadd is a noop when flag is zero */ - secp256k1_scalar_cadd_bit(&r2, bit, 0); - CHECK(secp256k1_scalar_eq(&r1, &r2)); - } - } - - { - /* Test commutativity of mul. */ - secp256k1_scalar r1, r2; - secp256k1_scalar_mul(&r1, &s1, &s2); - secp256k1_scalar_mul(&r2, &s2, &s1); - CHECK(secp256k1_scalar_eq(&r1, &r2)); - } - - { - /* Test associativity of add. */ - secp256k1_scalar r1, r2; - secp256k1_scalar_add(&r1, &s1, &s2); - secp256k1_scalar_add(&r1, &r1, &s); - secp256k1_scalar_add(&r2, &s2, &s); - secp256k1_scalar_add(&r2, &s1, &r2); - CHECK(secp256k1_scalar_eq(&r1, &r2)); - } - - { - /* Test associativity of mul. */ - secp256k1_scalar r1, r2; - secp256k1_scalar_mul(&r1, &s1, &s2); - secp256k1_scalar_mul(&r1, &r1, &s); - secp256k1_scalar_mul(&r2, &s2, &s); - secp256k1_scalar_mul(&r2, &s1, &r2); - CHECK(secp256k1_scalar_eq(&r1, &r2)); - } - - { - /* Test distributitivity of mul over add. */ - secp256k1_scalar r1, r2, t; - secp256k1_scalar_add(&r1, &s1, &s2); - secp256k1_scalar_mul(&r1, &r1, &s); - secp256k1_scalar_mul(&r2, &s1, &s); - secp256k1_scalar_mul(&t, &s2, &s); - secp256k1_scalar_add(&r2, &r2, &t); - CHECK(secp256k1_scalar_eq(&r1, &r2)); - } - - { - /* Test square. */ - secp256k1_scalar r1, r2; - secp256k1_scalar_sqr(&r1, &s1); - secp256k1_scalar_mul(&r2, &s1, &s1); - CHECK(secp256k1_scalar_eq(&r1, &r2)); - } - - { - /* Test multiplicative identity. */ - secp256k1_scalar r1, v1; - secp256k1_scalar_set_int(&v1,1); - secp256k1_scalar_mul(&r1, &s1, &v1); - CHECK(secp256k1_scalar_eq(&r1, &s1)); - } - - { - /* Test additive identity. */ - secp256k1_scalar r1, v0; - secp256k1_scalar_set_int(&v0,0); - secp256k1_scalar_add(&r1, &s1, &v0); - CHECK(secp256k1_scalar_eq(&r1, &s1)); - } - - { - /* Test zero product property. */ - secp256k1_scalar r1, v0; - secp256k1_scalar_set_int(&v0,0); - secp256k1_scalar_mul(&r1, &s1, &v0); - CHECK(secp256k1_scalar_eq(&r1, &v0)); - } - -} - -void run_scalar_tests(void) { - int i; - for (i = 0; i < 128 * count; i++) { - scalar_test(); - } - - { - /* (-1)+1 should be zero. */ - secp256k1_scalar s, o; - secp256k1_scalar_set_int(&s, 1); - CHECK(secp256k1_scalar_is_one(&s)); - secp256k1_scalar_negate(&o, &s); - secp256k1_scalar_add(&o, &o, &s); - CHECK(secp256k1_scalar_is_zero(&o)); - secp256k1_scalar_negate(&o, &o); - CHECK(secp256k1_scalar_is_zero(&o)); - } - -#ifndef USE_NUM_NONE - { - /* A scalar with value of the curve order should be 0. */ - secp256k1_num order; - secp256k1_scalar zero; - unsigned char bin[32]; - int overflow = 0; - secp256k1_scalar_order_get_num(&order); - secp256k1_num_get_bin(bin, 32, &order); - secp256k1_scalar_set_b32(&zero, bin, &overflow); - CHECK(overflow == 1); - CHECK(secp256k1_scalar_is_zero(&zero)); - } -#endif - - { - /* Does check_overflow check catch all ones? */ - static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST( - 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, - 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL - ); - CHECK(secp256k1_scalar_check_overflow(&overflowed)); - } - - { - /* Static test vectors. - * These were reduced from ~10^12 random vectors based on comparison-decision - * and edge-case coverage on 32-bit and 64-bit implementations. - * The responses were generated with Sage 5.9. - */ - secp256k1_scalar x; - secp256k1_scalar y; - secp256k1_scalar z; - secp256k1_scalar zz; - secp256k1_scalar one; - secp256k1_scalar r1; - secp256k1_scalar r2; -#if defined(USE_SCALAR_INV_NUM) - secp256k1_scalar zzv; -#endif - int overflow; - unsigned char chal[33][2][32] = { - {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}}, - {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}}, - {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00}, - {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}}, - {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, - 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}}, - {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, - 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}}, - {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f, - 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, - 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, - {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff, - 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0}, - {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, - {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00, - 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, - 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, - {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, - {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f}, - {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}}, - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, - 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, - 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff}, - {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}}, - {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff, - 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f, - 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}}, - {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00}, - {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}}, - {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, - 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}}, - {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00}, - {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, - {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, - 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}}, - {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}}, - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, - 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}}, - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, - {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, - 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}}, - {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, - 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, - {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, - 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, - 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, - 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}}, - {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00}, - {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, - 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, - 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}}, - {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, - {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, - {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f, - 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}}, - {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00, - 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, - 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, - 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0}, - {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, - 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}}, - {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, - 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, - 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}, - {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, - 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, - 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}} - }; - unsigned char res[33][2][32] = { - {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9, - 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1, - 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6, - 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35}, - {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d, - 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c, - 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49, - 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}}, - {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22, - 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c, - 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f, - 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8}, - {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77, - 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4, - 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59, - 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}}, - {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef, - 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab, - 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55, - 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c}, - {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96, - 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f, - 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12, - 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}}, - {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c, - 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf, - 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9, - 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48}, - {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42, - 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5, - 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c, - 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}}, - {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb, - 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74, - 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6, - 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63}, - {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3, - 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99, - 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58, - 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}}, - {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b, - 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7, - 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f, - 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0}, - {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d, - 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d, - 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9, - 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}}, - {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7, - 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70, - 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06, - 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e}, - {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9, - 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79, - 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e, - 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}}, - {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb, - 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5, - 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a, - 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe}, - {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48, - 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e, - 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc, - 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}}, - {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b, - 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0, - 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53, - 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8}, - {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c, - 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01, - 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f, - 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}}, - {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7, - 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c, - 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92, - 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30}, - {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62, - 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e, - 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb, - 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}}, - {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25, - 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d, - 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0, - 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13}, - {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60, - 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00, - 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4, - 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}}, - {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31, - 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4, - 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88, - 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa}, - {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57, - 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38, - 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51, - 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}}, - {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c, - 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f, - 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2, - 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4}, - {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01, - 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4, - 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86, - 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}}, - {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5, - 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51, - 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3, - 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62}, - {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c, - 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91, - 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c, - 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}}, - {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e, - 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56, - 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58, - 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4}, - {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41, - 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7, - 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92, - 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}}, - {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec, - 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19, - 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3, - 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4}, - {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87, - 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a, - 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92, - 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}}, - {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64, - 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3, - 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f, - 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33}, - {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c, - 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d, - 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea, - 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}}, - {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7, - 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a, - 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae, - 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe}, - {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc, - 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39, - 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14, - 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}}, - {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23, - 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d, - 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2, - 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16}, - {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c, - 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84, - 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0, - 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}}, - {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb, - 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94, - 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b, - 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e}, - {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54, - 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00, - 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb, - 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}}, - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, - {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, - 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, - 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, - 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}, - {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, - 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, - 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, - 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, - {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0, - 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b, - 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94, - 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8}, - {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26, - 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d, - 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a, - 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}}, - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, - 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd}, - {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, - 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, - 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, - 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, - {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, - 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, - {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39, - 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea, - 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf, - 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae}, - {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b, - 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb, - 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6, - 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}}, - {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a, - 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f, - 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9, - 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56}, - {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93, - 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07, - 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71, - 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}}, - {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87, - 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9, - 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55, - 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73}, - {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d, - 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86, - 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb, - 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}}, - {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2, - 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7, - 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41, - 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7}, - {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06, - 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04, - 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08, - 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}}, - {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2, - 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b, - 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40, - 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68}, - {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e, - 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a, - 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b, - 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}}, - {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67, - 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f, - 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a, - 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51}, - {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2, - 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38, - 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34, - 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}}, - {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, - 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, - 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, - 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}, - {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, - 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, - 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, - 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}} - }; - secp256k1_scalar_set_int(&one, 1); - for (i = 0; i < 33; i++) { - secp256k1_scalar_set_b32(&x, chal[i][0], &overflow); - CHECK(!overflow); - secp256k1_scalar_set_b32(&y, chal[i][1], &overflow); - CHECK(!overflow); - secp256k1_scalar_set_b32(&r1, res[i][0], &overflow); - CHECK(!overflow); - secp256k1_scalar_set_b32(&r2, res[i][1], &overflow); - CHECK(!overflow); - secp256k1_scalar_mul(&z, &x, &y); - CHECK(!secp256k1_scalar_check_overflow(&z)); - CHECK(secp256k1_scalar_eq(&r1, &z)); - if (!secp256k1_scalar_is_zero(&y)) { - secp256k1_scalar_inverse(&zz, &y); - CHECK(!secp256k1_scalar_check_overflow(&zz)); -#if defined(USE_SCALAR_INV_NUM) - secp256k1_scalar_inverse_var(&zzv, &y); - CHECK(secp256k1_scalar_eq(&zzv, &zz)); -#endif - secp256k1_scalar_mul(&z, &z, &zz); - CHECK(!secp256k1_scalar_check_overflow(&z)); - CHECK(secp256k1_scalar_eq(&x, &z)); - secp256k1_scalar_mul(&zz, &zz, &y); - CHECK(!secp256k1_scalar_check_overflow(&zz)); - CHECK(secp256k1_scalar_eq(&one, &zz)); - } - secp256k1_scalar_mul(&z, &x, &x); - CHECK(!secp256k1_scalar_check_overflow(&z)); - secp256k1_scalar_sqr(&zz, &x); - CHECK(!secp256k1_scalar_check_overflow(&zz)); - CHECK(secp256k1_scalar_eq(&zz, &z)); - CHECK(secp256k1_scalar_eq(&r2, &zz)); - } - } -} - -/***** FIELD TESTS *****/ - -void random_fe(secp256k1_fe *x) { - unsigned char bin[32]; - do { - secp256k1_rand256(bin); - if (secp256k1_fe_set_b32(x, bin)) { - return; - } - } while(1); -} - -void random_fe_test(secp256k1_fe *x) { - unsigned char bin[32]; - do { - secp256k1_rand256_test(bin); - if (secp256k1_fe_set_b32(x, bin)) { - return; - } - } while(1); -} - -void random_fe_non_zero(secp256k1_fe *nz) { - int tries = 10; - while (--tries >= 0) { - random_fe(nz); - secp256k1_fe_normalize(nz); - if (!secp256k1_fe_is_zero(nz)) { - break; - } - } - /* Infinitesimal probability of spurious failure here */ - CHECK(tries >= 0); -} - -void random_fe_non_square(secp256k1_fe *ns) { - secp256k1_fe r; - random_fe_non_zero(ns); - if (secp256k1_fe_sqrt(&r, ns)) { - secp256k1_fe_negate(ns, ns, 1); - } -} - -int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { - secp256k1_fe an = *a; - secp256k1_fe bn = *b; - secp256k1_fe_normalize_weak(&an); - secp256k1_fe_normalize_var(&bn); - return secp256k1_fe_equal_var(&an, &bn); -} - -int check_fe_inverse(const secp256k1_fe *a, const secp256k1_fe *ai) { - secp256k1_fe x; - secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_fe_mul(&x, a, ai); - return check_fe_equal(&x, &one); -} - -void run_field_convert(void) { - static const unsigned char b32[32] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, - 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40 - }; - static const secp256k1_fe_storage fes = SECP256K1_FE_STORAGE_CONST( - 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, - 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL - ); - static const secp256k1_fe fe = SECP256K1_FE_CONST( - 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, - 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL - ); - secp256k1_fe fe2; - unsigned char b322[32]; - secp256k1_fe_storage fes2; - /* Check conversions to fe. */ - CHECK(secp256k1_fe_set_b32(&fe2, b32)); - CHECK(secp256k1_fe_equal_var(&fe, &fe2)); - secp256k1_fe_from_storage(&fe2, &fes); - CHECK(secp256k1_fe_equal_var(&fe, &fe2)); - /* Check conversion from fe. */ - secp256k1_fe_get_b32(b322, &fe); - CHECK(memcmp(b322, b32, 32) == 0); - secp256k1_fe_to_storage(&fes2, &fe); - CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0); -} - -int fe_memcmp(const secp256k1_fe *a, const secp256k1_fe *b) { - secp256k1_fe t = *b; -#ifdef VERIFY - t.magnitude = a->magnitude; - t.normalized = a->normalized; -#endif - return memcmp(a, &t, sizeof(secp256k1_fe)); -} - -void run_field_misc(void) { - secp256k1_fe x; - secp256k1_fe y; - secp256k1_fe z; - secp256k1_fe q; - secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); - int i, j; - for (i = 0; i < 5*count; i++) { - secp256k1_fe_storage xs, ys, zs; - random_fe(&x); - random_fe_non_zero(&y); - /* Test the fe equality and comparison operations. */ - CHECK(secp256k1_fe_cmp_var(&x, &x) == 0); - CHECK(secp256k1_fe_equal_var(&x, &x)); - z = x; - secp256k1_fe_add(&z,&y); - /* Test fe conditional move; z is not normalized here. */ - q = x; - secp256k1_fe_cmov(&x, &z, 0); - VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude); - secp256k1_fe_cmov(&x, &x, 1); - CHECK(fe_memcmp(&x, &z) != 0); - CHECK(fe_memcmp(&x, &q) == 0); - secp256k1_fe_cmov(&q, &z, 1); - VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude); - CHECK(fe_memcmp(&q, &z) == 0); - secp256k1_fe_normalize_var(&x); - secp256k1_fe_normalize_var(&z); - CHECK(!secp256k1_fe_equal_var(&x, &z)); - secp256k1_fe_normalize_var(&q); - secp256k1_fe_cmov(&q, &z, (i&1)); - VERIFY_CHECK(q.normalized && q.magnitude == 1); - for (j = 0; j < 6; j++) { - secp256k1_fe_negate(&z, &z, j+1); - secp256k1_fe_normalize_var(&q); - secp256k1_fe_cmov(&q, &z, (j&1)); - VERIFY_CHECK(!q.normalized && q.magnitude == (j+2)); - } - secp256k1_fe_normalize_var(&z); - /* Test storage conversion and conditional moves. */ - secp256k1_fe_to_storage(&xs, &x); - secp256k1_fe_to_storage(&ys, &y); - secp256k1_fe_to_storage(&zs, &z); - secp256k1_fe_storage_cmov(&zs, &xs, 0); - secp256k1_fe_storage_cmov(&zs, &zs, 1); - CHECK(memcmp(&xs, &zs, sizeof(xs)) != 0); - secp256k1_fe_storage_cmov(&ys, &xs, 1); - CHECK(memcmp(&xs, &ys, sizeof(xs)) == 0); - secp256k1_fe_from_storage(&x, &xs); - secp256k1_fe_from_storage(&y, &ys); - secp256k1_fe_from_storage(&z, &zs); - /* Test that mul_int, mul, and add agree. */ - secp256k1_fe_add(&y, &x); - secp256k1_fe_add(&y, &x); - z = x; - secp256k1_fe_mul_int(&z, 3); - CHECK(check_fe_equal(&y, &z)); - secp256k1_fe_add(&y, &x); - secp256k1_fe_add(&z, &x); - CHECK(check_fe_equal(&z, &y)); - z = x; - secp256k1_fe_mul_int(&z, 5); - secp256k1_fe_mul(&q, &x, &fe5); - CHECK(check_fe_equal(&z, &q)); - secp256k1_fe_negate(&x, &x, 1); - secp256k1_fe_add(&z, &x); - secp256k1_fe_add(&q, &x); - CHECK(check_fe_equal(&y, &z)); - CHECK(check_fe_equal(&q, &y)); - } -} - -void run_field_inv(void) { - secp256k1_fe x, xi, xii; - int i; - for (i = 0; i < 10*count; i++) { - random_fe_non_zero(&x); - secp256k1_fe_inv(&xi, &x); - CHECK(check_fe_inverse(&x, &xi)); - secp256k1_fe_inv(&xii, &xi); - CHECK(check_fe_equal(&x, &xii)); - } -} - -void run_field_inv_var(void) { - secp256k1_fe x, xi, xii; - int i; - for (i = 0; i < 10*count; i++) { - random_fe_non_zero(&x); - secp256k1_fe_inv_var(&xi, &x); - CHECK(check_fe_inverse(&x, &xi)); - secp256k1_fe_inv_var(&xii, &xi); - CHECK(check_fe_equal(&x, &xii)); - } -} - -void run_field_inv_all_var(void) { - secp256k1_fe x[16], xi[16], xii[16]; - int i; - /* Check it's safe to call for 0 elements */ - secp256k1_fe_inv_all_var(xi, x, 0); - for (i = 0; i < count; i++) { - size_t j; - size_t len = secp256k1_rand_int(15) + 1; - for (j = 0; j < len; j++) { - random_fe_non_zero(&x[j]); - } - secp256k1_fe_inv_all_var(xi, x, len); - for (j = 0; j < len; j++) { - CHECK(check_fe_inverse(&x[j], &xi[j])); - } - secp256k1_fe_inv_all_var(xii, xi, len); - for (j = 0; j < len; j++) { - CHECK(check_fe_equal(&x[j], &xii[j])); - } - } -} - -void run_sqr(void) { - secp256k1_fe x, s; - - { - int i; - secp256k1_fe_set_int(&x, 1); - secp256k1_fe_negate(&x, &x, 1); - - for (i = 1; i <= 512; ++i) { - secp256k1_fe_mul_int(&x, 2); - secp256k1_fe_normalize(&x); - secp256k1_fe_sqr(&s, &x); - } - } -} - -void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) { - secp256k1_fe r1, r2; - int v = secp256k1_fe_sqrt(&r1, a); - CHECK((v == 0) == (k == NULL)); - - if (k != NULL) { - /* Check that the returned root is +/- the given known answer */ - secp256k1_fe_negate(&r2, &r1, 1); - secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k); - secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2); - CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2)); - } -} - -void run_sqrt(void) { - secp256k1_fe ns, x, s, t; - int i; - - /* Check sqrt(0) is 0 */ - secp256k1_fe_set_int(&x, 0); - secp256k1_fe_sqr(&s, &x); - test_sqrt(&s, &x); - - /* Check sqrt of small squares (and their negatives) */ - for (i = 1; i <= 100; i++) { - secp256k1_fe_set_int(&x, i); - secp256k1_fe_sqr(&s, &x); - test_sqrt(&s, &x); - secp256k1_fe_negate(&t, &s, 1); - test_sqrt(&t, NULL); - } - - /* Consistency checks for large random values */ - for (i = 0; i < 10; i++) { - int j; - random_fe_non_square(&ns); - for (j = 0; j < count; j++) { - random_fe(&x); - secp256k1_fe_sqr(&s, &x); - test_sqrt(&s, &x); - secp256k1_fe_negate(&t, &s, 1); - test_sqrt(&t, NULL); - secp256k1_fe_mul(&t, &s, &ns); - test_sqrt(&t, NULL); - } - } -} - -/***** GROUP TESTS *****/ - -void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { - CHECK(a->infinity == b->infinity); - if (a->infinity) { - return; - } - CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); - CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); -} - -/* This compares jacobian points including their Z, not just their geometric meaning. */ -int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) { - secp256k1_gej a2; - secp256k1_gej b2; - int ret = 1; - ret &= a->infinity == b->infinity; - if (ret && !a->infinity) { - a2 = *a; - b2 = *b; - secp256k1_fe_normalize(&a2.x); - secp256k1_fe_normalize(&a2.y); - secp256k1_fe_normalize(&a2.z); - secp256k1_fe_normalize(&b2.x); - secp256k1_fe_normalize(&b2.y); - secp256k1_fe_normalize(&b2.z); - ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0; - ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0; - ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0; - } - return ret; -} - -void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { - secp256k1_fe z2s; - secp256k1_fe u1, u2, s1, s2; - CHECK(a->infinity == b->infinity); - if (a->infinity) { - return; - } - /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ - secp256k1_fe_sqr(&z2s, &b->z); - secp256k1_fe_mul(&u1, &a->x, &z2s); - u2 = b->x; secp256k1_fe_normalize_weak(&u2); - secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); - s2 = b->y; secp256k1_fe_normalize_weak(&s2); - CHECK(secp256k1_fe_equal_var(&u1, &u2)); - CHECK(secp256k1_fe_equal_var(&s1, &s2)); -} - -void test_ge(void) { - int i, i1; -#ifdef USE_ENDOMORPHISM - int runs = 6; -#else - int runs = 4; -#endif - /* Points: (infinity, p1, p1, -p1, -p1, p2, p2, -p2, -p2, p3, p3, -p3, -p3, p4, p4, -p4, -p4). - * The second in each pair of identical points uses a random Z coordinate in the Jacobian form. - * All magnitudes are randomized. - * All 17*17 combinations of points are added to each other, using all applicable methods. - * - * When the endomorphism code is compiled in, p5 = lambda*p1 and p6 = lambda^2*p1 are added as well. - */ - secp256k1_ge *ge = (secp256k1_ge *)malloc(sizeof(secp256k1_ge) * (1 + 4 * runs)); - secp256k1_gej *gej = (secp256k1_gej *)malloc(sizeof(secp256k1_gej) * (1 + 4 * runs)); - secp256k1_fe *zinv = (secp256k1_fe *)malloc(sizeof(secp256k1_fe) * (1 + 4 * runs)); - secp256k1_fe zf; - secp256k1_fe zfi2, zfi3; - - secp256k1_gej_set_infinity(&gej[0]); - secp256k1_ge_clear(&ge[0]); - secp256k1_ge_set_gej_var(&ge[0], &gej[0]); - for (i = 0; i < runs; i++) { - int j; - secp256k1_ge g; - random_group_element_test(&g); -#ifdef USE_ENDOMORPHISM - if (i >= runs - 2) { - secp256k1_ge_mul_lambda(&g, &ge[1]); - } - if (i >= runs - 1) { - secp256k1_ge_mul_lambda(&g, &g); - } -#endif - ge[1 + 4 * i] = g; - ge[2 + 4 * i] = g; - secp256k1_ge_neg(&ge[3 + 4 * i], &g); - secp256k1_ge_neg(&ge[4 + 4 * i], &g); - secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]); - random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]); - secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]); - random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]); - for (j = 0; j < 4; j++) { - random_field_element_magnitude(&ge[1 + j + 4 * i].x); - random_field_element_magnitude(&ge[1 + j + 4 * i].y); - random_field_element_magnitude(&gej[1 + j + 4 * i].x); - random_field_element_magnitude(&gej[1 + j + 4 * i].y); - random_field_element_magnitude(&gej[1 + j + 4 * i].z); - } - } - - /* Compute z inverses. */ - { - secp256k1_fe *zs = malloc(sizeof(secp256k1_fe) * (1 + 4 * runs)); - for (i = 0; i < 4 * runs + 1; i++) { - if (i == 0) { - /* The point at infinity does not have a meaningful z inverse. Any should do. */ - do { - random_field_element_test(&zs[i]); - } while(secp256k1_fe_is_zero(&zs[i])); - } else { - zs[i] = gej[i].z; - } - } - secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1); - free(zs); - } - - /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */ - do { - random_field_element_test(&zf); - } while(secp256k1_fe_is_zero(&zf)); - random_field_element_magnitude(&zf); - secp256k1_fe_inv_var(&zfi3, &zf); - secp256k1_fe_sqr(&zfi2, &zfi3); - secp256k1_fe_mul(&zfi3, &zfi3, &zfi2); - - for (i1 = 0; i1 < 1 + 4 * runs; i1++) { - int i2; - for (i2 = 0; i2 < 1 + 4 * runs; i2++) { - /* Compute reference result using gej + gej (var). */ - secp256k1_gej refj, resj; - secp256k1_ge ref; - secp256k1_fe zr; - secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); - /* Check Z ratio. */ - if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) { - secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); - CHECK(secp256k1_fe_equal_var(&zrz, &refj.z)); - } - secp256k1_ge_set_gej_var(&ref, &refj); - - /* Test gej + ge with Z ratio result (var). */ - secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); - ge_equals_gej(&ref, &resj); - if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) { - secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); - CHECK(secp256k1_fe_equal_var(&zrz, &resj.z)); - } - - /* Test gej + ge (var, with additional Z factor). */ - { - secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */ - secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2); - secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3); - random_field_element_magnitude(&ge2_zfi.x); - random_field_element_magnitude(&ge2_zfi.y); - secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf); - ge_equals_gej(&ref, &resj); - } - - /* Test gej + ge (const). */ - if (i2 != 0) { - /* secp256k1_gej_add_ge does not support its second argument being infinity. */ - secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]); - ge_equals_gej(&ref, &resj); - } - - /* Test doubling (var). */ - if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) { - secp256k1_fe zr2; - /* Normal doubling with Z ratio result. */ - secp256k1_gej_double_var(&resj, &gej[i1], &zr2); - ge_equals_gej(&ref, &resj); - /* Check Z ratio. */ - secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z); - CHECK(secp256k1_fe_equal_var(&zr2, &resj.z)); - /* Normal doubling. */ - secp256k1_gej_double_var(&resj, &gej[i2], NULL); - ge_equals_gej(&ref, &resj); - } - - /* Test adding opposites. */ - if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) { - CHECK(secp256k1_ge_is_infinity(&ref)); - } - - /* Test adding infinity. */ - if (i1 == 0) { - CHECK(secp256k1_ge_is_infinity(&ge[i1])); - CHECK(secp256k1_gej_is_infinity(&gej[i1])); - ge_equals_gej(&ref, &gej[i2]); - } - if (i2 == 0) { - CHECK(secp256k1_ge_is_infinity(&ge[i2])); - CHECK(secp256k1_gej_is_infinity(&gej[i2])); - ge_equals_gej(&ref, &gej[i1]); - } - } - } - - /* Test adding all points together in random order equals infinity. */ - { - secp256k1_gej sum = SECP256K1_GEJ_CONST_INFINITY; - secp256k1_gej *gej_shuffled = (secp256k1_gej *)malloc((4 * runs + 1) * sizeof(secp256k1_gej)); - for (i = 0; i < 4 * runs + 1; i++) { - gej_shuffled[i] = gej[i]; - } - for (i = 0; i < 4 * runs + 1; i++) { - int swap = i + secp256k1_rand_int(4 * runs + 1 - i); - if (swap != i) { - secp256k1_gej t = gej_shuffled[i]; - gej_shuffled[i] = gej_shuffled[swap]; - gej_shuffled[swap] = t; - } - } - for (i = 0; i < 4 * runs + 1; i++) { - secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL); - } - CHECK(secp256k1_gej_is_infinity(&sum)); - free(gej_shuffled); - } - - /* Test batch gej -> ge conversion with and without known z ratios. */ - { - secp256k1_fe *zr = (secp256k1_fe *)malloc((4 * runs + 1) * sizeof(secp256k1_fe)); - secp256k1_ge *ge_set_table = (secp256k1_ge *)malloc((4 * runs + 1) * sizeof(secp256k1_ge)); - secp256k1_ge *ge_set_all = (secp256k1_ge *)malloc((4 * runs + 1) * sizeof(secp256k1_ge)); - for (i = 0; i < 4 * runs + 1; i++) { - /* Compute gej[i + 1].z / gez[i].z (with gej[n].z taken to be 1). */ - if (i < 4 * runs) { - secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z); - } - } - secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1); - secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->error_callback); - for (i = 0; i < 4 * runs + 1; i++) { - secp256k1_fe s; - random_fe_non_zero(&s); - secp256k1_gej_rescale(&gej[i], &s); - ge_equals_gej(&ge_set_table[i], &gej[i]); - ge_equals_gej(&ge_set_all[i], &gej[i]); - } - free(ge_set_table); - free(ge_set_all); - free(zr); - } - - free(ge); - free(gej); - free(zinv); -} - -void test_add_neg_y_diff_x(void) { - /* The point of this test is to check that we can add two points - * whose y-coordinates are negatives of each other but whose x - * coordinates differ. If the x-coordinates were the same, these - * points would be negatives of each other and their sum is - * infinity. This is cool because it "covers up" any degeneracy - * in the addition algorithm that would cause the xy coordinates - * of the sum to be wrong (since infinity has no xy coordinates). - * HOWEVER, if the x-coordinates are different, infinity is the - * wrong answer, and such degeneracies are exposed. This is the - * root of https://github.com/bitcoin-core/secp256k1/issues/257 - * which this test is a regression test for. - * - * These points were generated in sage as - * # secp256k1 params - * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) - * C = EllipticCurve ([F (0), F (7)]) - * G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) - * N = FiniteField(G.order()) - * - * # endomorphism values (lambda is 1^{1/3} in N, beta is 1^{1/3} in F) - * x = polygen(N) - * lam = (1 - x^3).roots()[1][0] - * - * # random "bad pair" - * P = C.random_element() - * Q = -int(lam) * P - * print " P: %x %x" % P.xy() - * print " Q: %x %x" % Q.xy() - * print "P + Q: %x %x" % (P + Q).xy() - */ - secp256k1_gej aj = SECP256K1_GEJ_CONST( - 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30, - 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb, - 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8, - 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d - ); - secp256k1_gej bj = SECP256K1_GEJ_CONST( - 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86, - 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7, - 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57, - 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2 - ); - secp256k1_gej sumj = SECP256K1_GEJ_CONST( - 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027, - 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a, - 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08, - 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe - ); - secp256k1_ge b; - secp256k1_gej resj; - secp256k1_ge res; - secp256k1_ge_set_gej(&b, &bj); - - secp256k1_gej_add_var(&resj, &aj, &bj, NULL); - secp256k1_ge_set_gej(&res, &resj); - ge_equals_gej(&res, &sumj); - - secp256k1_gej_add_ge(&resj, &aj, &b); - secp256k1_ge_set_gej(&res, &resj); - ge_equals_gej(&res, &sumj); - - secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL); - secp256k1_ge_set_gej(&res, &resj); - ge_equals_gej(&res, &sumj); -} - -void run_ge(void) { - int i; - for (i = 0; i < count * 32; i++) { - test_ge(); - } - test_add_neg_y_diff_x(); -} - -void test_ec_combine(void) { - secp256k1_scalar sum = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); - secp256k1_pubkey data[6]; - const secp256k1_pubkey* d[6]; - secp256k1_pubkey sd; - secp256k1_pubkey sd2; - secp256k1_gej Qj; - secp256k1_ge Q; - int i; - for (i = 1; i <= 6; i++) { - secp256k1_scalar s; - random_scalar_order_test(&s); - secp256k1_scalar_add(&sum, &sum, &s); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &s); - secp256k1_ge_set_gej(&Q, &Qj); - secp256k1_pubkey_save(&data[i - 1], &Q); - d[i - 1] = &data[i - 1]; - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &sum); - secp256k1_ge_set_gej(&Q, &Qj); - secp256k1_pubkey_save(&sd, &Q); - CHECK(secp256k1_ec_pubkey_combine(ctx, &sd2, d, i) == 1); - CHECK(memcmp(&sd, &sd2, sizeof(sd)) == 0); - } -} - -void run_ec_combine(void) { - int i; - for (i = 0; i < count * 8; i++) { - test_ec_combine(); - } -} - -void test_group_decompress(const secp256k1_fe* x) { - /* The input itself, normalized. */ - secp256k1_fe fex = *x; - secp256k1_fe fez; - /* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */ - secp256k1_ge ge_quad, ge_even, ge_odd; - secp256k1_gej gej_quad; - /* Return values of the above calls. */ - int res_quad, res_even, res_odd; - - secp256k1_fe_normalize_var(&fex); - - res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex); - res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0); - res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1); - - CHECK(res_quad == res_even); - CHECK(res_quad == res_odd); - - if (res_quad) { - secp256k1_fe_normalize_var(&ge_quad.x); - secp256k1_fe_normalize_var(&ge_odd.x); - secp256k1_fe_normalize_var(&ge_even.x); - secp256k1_fe_normalize_var(&ge_quad.y); - secp256k1_fe_normalize_var(&ge_odd.y); - secp256k1_fe_normalize_var(&ge_even.y); - - /* No infinity allowed. */ - CHECK(!ge_quad.infinity); - CHECK(!ge_even.infinity); - CHECK(!ge_odd.infinity); - - /* Check that the x coordinates check out. */ - CHECK(secp256k1_fe_equal_var(&ge_quad.x, x)); - CHECK(secp256k1_fe_equal_var(&ge_even.x, x)); - CHECK(secp256k1_fe_equal_var(&ge_odd.x, x)); - - /* Check that the Y coordinate result in ge_quad is a square. */ - CHECK(secp256k1_fe_is_quad_var(&ge_quad.y)); - - /* Check odd/even Y in ge_odd, ge_even. */ - CHECK(secp256k1_fe_is_odd(&ge_odd.y)); - CHECK(!secp256k1_fe_is_odd(&ge_even.y)); - - /* Check secp256k1_gej_has_quad_y_var. */ - secp256k1_gej_set_ge(&gej_quad, &ge_quad); - CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); - do { - random_fe_test(&fez); - } while (secp256k1_fe_is_zero(&fez)); - secp256k1_gej_rescale(&gej_quad, &fez); - CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); - secp256k1_gej_neg(&gej_quad, &gej_quad); - CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); - do { - random_fe_test(&fez); - } while (secp256k1_fe_is_zero(&fez)); - secp256k1_gej_rescale(&gej_quad, &fez); - CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); - secp256k1_gej_neg(&gej_quad, &gej_quad); - CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); - } -} - -void run_group_decompress(void) { - int i; - for (i = 0; i < count * 4; i++) { - secp256k1_fe fe; - random_fe_test(&fe); - test_group_decompress(&fe); - } -} - -/***** ECMULT TESTS *****/ - -void run_ecmult_chain(void) { - /* random starting point A (on the curve) */ - secp256k1_gej a = SECP256K1_GEJ_CONST( - 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3, - 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004, - 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f, - 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f - ); - /* two random initial factors xn and gn */ - secp256k1_scalar xn = SECP256K1_SCALAR_CONST( - 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c, - 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407 - ); - secp256k1_scalar gn = SECP256K1_SCALAR_CONST( - 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9, - 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de - ); - /* two small multipliers to be applied to xn and gn in every iteration: */ - static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); - static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); - /* accumulators with the resulting coefficients to A and G */ - secp256k1_scalar ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_scalar ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); - /* actual points */ - secp256k1_gej x; - secp256k1_gej x2; - int i; - - /* the point being computed */ - x = a; - for (i = 0; i < 200*count; i++) { - /* in each iteration, compute X = xn*X + gn*G; */ - secp256k1_ecmult(&ctx->ecmult_ctx, &x, &x, &xn, &gn); - /* also compute ae and ge: the actual accumulated factors for A and G */ - /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */ - secp256k1_scalar_mul(&ae, &ae, &xn); - secp256k1_scalar_mul(&ge, &ge, &xn); - secp256k1_scalar_add(&ge, &ge, &gn); - /* modify xn and gn */ - secp256k1_scalar_mul(&xn, &xn, &xf); - secp256k1_scalar_mul(&gn, &gn, &gf); - - /* verify */ - if (i == 19999) { - /* expected result after 19999 iterations */ - secp256k1_gej rp = SECP256K1_GEJ_CONST( - 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE, - 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830, - 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D, - 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88 - ); - - secp256k1_gej_neg(&rp, &rp); - secp256k1_gej_add_var(&rp, &rp, &x, NULL); - CHECK(secp256k1_gej_is_infinity(&rp)); - } - } - /* redo the computation, but directly with the resulting ae and ge coefficients: */ - secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge); - secp256k1_gej_neg(&x2, &x2); - secp256k1_gej_add_var(&x2, &x2, &x, NULL); - CHECK(secp256k1_gej_is_infinity(&x2)); -} - -void test_point_times_order(const secp256k1_gej *point) { - /* X * (point + G) + (order-X) * (pointer + G) = 0 */ - secp256k1_scalar x; - secp256k1_scalar nx; - secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); - secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_gej res1, res2; - secp256k1_ge res3; - unsigned char pub[65]; - size_t psize = 65; - random_scalar_order_test(&x); - secp256k1_scalar_negate(&nx, &x); - secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */ - secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */ - secp256k1_gej_add_var(&res1, &res1, &res2, NULL); - CHECK(secp256k1_gej_is_infinity(&res1)); - CHECK(secp256k1_gej_is_valid_var(&res1) == 0); - secp256k1_ge_set_gej(&res3, &res1); - CHECK(secp256k1_ge_is_infinity(&res3)); - CHECK(secp256k1_ge_is_valid_var(&res3) == 0); - CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0); - psize = 65; - CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0); - /* check zero/one edge cases */ - secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &zero); - secp256k1_ge_set_gej(&res3, &res1); - CHECK(secp256k1_ge_is_infinity(&res3)); - secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &one, &zero); - secp256k1_ge_set_gej(&res3, &res1); - ge_equals_gej(&res3, point); - secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &one); - secp256k1_ge_set_gej(&res3, &res1); - ge_equals_ge(&res3, &secp256k1_ge_const_g); -} - -void run_point_times_order(void) { - int i; - secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); - static const secp256k1_fe xr = SECP256K1_FE_CONST( - 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C, - 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45 - ); - for (i = 0; i < 500; i++) { - secp256k1_ge p; - if (secp256k1_ge_set_xo_var(&p, &x, 1)) { - secp256k1_gej j; - CHECK(secp256k1_ge_is_valid_var(&p)); - secp256k1_gej_set_ge(&j, &p); - CHECK(secp256k1_gej_is_valid_var(&j)); - test_point_times_order(&j); - } - secp256k1_fe_sqr(&x, &x); - } - secp256k1_fe_normalize_var(&x); - CHECK(secp256k1_fe_equal_var(&x, &xr)); -} - -void ecmult_const_random_mult(void) { - /* random starting point A (on the curve) */ - secp256k1_ge a = SECP256K1_GE_CONST( - 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b, - 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a, - 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c, - 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d - ); - /* random initial factor xn */ - secp256k1_scalar xn = SECP256K1_SCALAR_CONST( - 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327, - 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b - ); - /* expected xn * A (from sage) */ - secp256k1_ge expected_b = SECP256K1_GE_CONST( - 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd, - 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786, - 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f, - 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956 - ); - secp256k1_gej b; - secp256k1_ecmult_const(&b, &a, &xn); - - CHECK(secp256k1_ge_is_valid_var(&a)); - ge_equals_gej(&expected_b, &b); -} - -void ecmult_const_commutativity(void) { - secp256k1_scalar a; - secp256k1_scalar b; - secp256k1_gej res1; - secp256k1_gej res2; - secp256k1_ge mid1; - secp256k1_ge mid2; - random_scalar_order_test(&a); - random_scalar_order_test(&b); - - secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a); - secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &b); - secp256k1_ge_set_gej(&mid1, &res1); - secp256k1_ge_set_gej(&mid2, &res2); - secp256k1_ecmult_const(&res1, &mid1, &b); - secp256k1_ecmult_const(&res2, &mid2, &a); - secp256k1_ge_set_gej(&mid1, &res1); - secp256k1_ge_set_gej(&mid2, &res2); - ge_equals_ge(&mid1, &mid2); -} - -void ecmult_const_mult_zero_one(void) { - secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); - secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); - secp256k1_scalar negone; - secp256k1_gej res1; - secp256k1_ge res2; - secp256k1_ge point; - secp256k1_scalar_negate(&negone, &one); - - random_group_element_test(&point); - secp256k1_ecmult_const(&res1, &point, &zero); - secp256k1_ge_set_gej(&res2, &res1); - CHECK(secp256k1_ge_is_infinity(&res2)); - secp256k1_ecmult_const(&res1, &point, &one); - secp256k1_ge_set_gej(&res2, &res1); - ge_equals_ge(&res2, &point); - secp256k1_ecmult_const(&res1, &point, &negone); - secp256k1_gej_neg(&res1, &res1); - secp256k1_ge_set_gej(&res2, &res1); - ge_equals_ge(&res2, &point); -} - -void ecmult_const_chain_multiply(void) { - /* Check known result (randomly generated test problem from sage) */ - const secp256k1_scalar scalar = SECP256K1_SCALAR_CONST( - 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d, - 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b - ); - const secp256k1_gej expected_point = SECP256K1_GEJ_CONST( - 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd, - 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f, - 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196, - 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435 - ); - secp256k1_gej point; - secp256k1_ge res; - int i; - - secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g); - for (i = 0; i < 100; ++i) { - secp256k1_ge tmp; - secp256k1_ge_set_gej(&tmp, &point); - secp256k1_ecmult_const(&point, &tmp, &scalar); - } - secp256k1_ge_set_gej(&res, &point); - ge_equals_gej(&res, &expected_point); -} - -void run_ecmult_const_tests(void) { - ecmult_const_mult_zero_one(); - ecmult_const_random_mult(); - ecmult_const_commutativity(); - ecmult_const_chain_multiply(); -} - -void test_wnaf(const secp256k1_scalar *number, int w) { - secp256k1_scalar x, two, t; - int wnaf[256]; - int zeroes = -1; - int i; - int bits; - secp256k1_scalar_set_int(&x, 0); - secp256k1_scalar_set_int(&two, 2); - bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w); - CHECK(bits <= 256); - for (i = bits-1; i >= 0; i--) { - int v = wnaf[i]; - secp256k1_scalar_mul(&x, &x, &two); - if (v) { - CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */ - zeroes=0; - CHECK((v & 1) == 1); /* check non-zero elements are odd */ - CHECK(v <= (1 << (w-1)) - 1); /* check range below */ - CHECK(v >= -(1 << (w-1)) - 1); /* check range above */ - } else { - CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */ - zeroes++; - } - if (v >= 0) { - secp256k1_scalar_set_int(&t, v); - } else { - secp256k1_scalar_set_int(&t, -v); - secp256k1_scalar_negate(&t, &t); - } - secp256k1_scalar_add(&x, &x, &t); - } - CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */ -} - -void test_constant_wnaf_negate(const secp256k1_scalar *number) { - secp256k1_scalar neg1 = *number; - secp256k1_scalar neg2 = *number; - int sign1 = 1; - int sign2 = 1; - - if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) { - secp256k1_scalar_negate(&neg1, &neg1); - sign1 = -1; - } - sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2)); - CHECK(sign1 == sign2); - CHECK(secp256k1_scalar_eq(&neg1, &neg2)); -} - -void test_constant_wnaf(const secp256k1_scalar *number, int w) { - secp256k1_scalar x, shift; - int wnaf[256] = {0}; - int i; - int skew; - secp256k1_scalar num = *number; - - secp256k1_scalar_set_int(&x, 0); - secp256k1_scalar_set_int(&shift, 1 << w); - /* With USE_ENDOMORPHISM on we only consider 128-bit numbers */ -#ifdef USE_ENDOMORPHISM - for (i = 0; i < 16; ++i) { - secp256k1_scalar_shr_int(&num, 8); - } -#endif - skew = secp256k1_wnaf_const(wnaf, num, w); - - for (i = WNAF_SIZE(w); i >= 0; --i) { - secp256k1_scalar t; - int v = wnaf[i]; - CHECK(v != 0); /* check nonzero */ - CHECK(v & 1); /* check parity */ - CHECK(v > -(1 << w)); /* check range above */ - CHECK(v < (1 << w)); /* check range below */ - - secp256k1_scalar_mul(&x, &x, &shift); - if (v >= 0) { - secp256k1_scalar_set_int(&t, v); - } else { - secp256k1_scalar_set_int(&t, -v); - secp256k1_scalar_negate(&t, &t); - } - secp256k1_scalar_add(&x, &x, &t); - } - /* Skew num because when encoding numbers as odd we use an offset */ - secp256k1_scalar_cadd_bit(&num, skew == 2, 1); - CHECK(secp256k1_scalar_eq(&x, &num)); -} - -void run_wnaf(void) { - int i; - secp256k1_scalar n = {{0}}; - - /* Sanity check: 1 and 2 are the smallest odd and even numbers and should - * have easier-to-diagnose failure modes */ - n.d[0] = 1; - test_constant_wnaf(&n, 4); - n.d[0] = 2; - test_constant_wnaf(&n, 4); - /* Random tests */ - for (i = 0; i < count; i++) { - random_scalar_order(&n); - test_wnaf(&n, 4+(i%10)); - test_constant_wnaf_negate(&n); - test_constant_wnaf(&n, 4 + (i % 10)); - } - secp256k1_scalar_set_int(&n, 0); - CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1); - CHECK(secp256k1_scalar_is_zero(&n)); - CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1); - CHECK(secp256k1_scalar_is_zero(&n)); -} - -void test_ecmult_constants(void) { - /* Test ecmult_gen() for [0..36) and [order-36..0). */ - secp256k1_scalar x; - secp256k1_gej r; - secp256k1_ge ng; - int i; - int j; - secp256k1_ge_neg(&ng, &secp256k1_ge_const_g); - for (i = 0; i < 36; i++ ) { - secp256k1_scalar_set_int(&x, i); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); - for (j = 0; j < i; j++) { - if (j == i - 1) { - ge_equals_gej(&secp256k1_ge_const_g, &r); - } - secp256k1_gej_add_ge(&r, &r, &ng); - } - CHECK(secp256k1_gej_is_infinity(&r)); - } - for (i = 1; i <= 36; i++ ) { - secp256k1_scalar_set_int(&x, i); - secp256k1_scalar_negate(&x, &x); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); - for (j = 0; j < i; j++) { - if (j == i - 1) { - ge_equals_gej(&ng, &r); - } - secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g); - } - CHECK(secp256k1_gej_is_infinity(&r)); - } -} - -void run_ecmult_constants(void) { - test_ecmult_constants(); -} - -void test_ecmult_gen_blind(void) { - /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */ - secp256k1_scalar key; - secp256k1_scalar b; - unsigned char seed32[32]; - secp256k1_gej pgej; - secp256k1_gej pgej2; - secp256k1_gej i; - secp256k1_ge pge; - random_scalar_order_test(&key); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key); - secp256k1_rand256(seed32); - b = ctx->ecmult_gen_ctx.blind; - i = ctx->ecmult_gen_ctx.initial; - secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); - CHECK(!secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej2, &key); - CHECK(!gej_xyz_equals_gej(&pgej, &pgej2)); - CHECK(!gej_xyz_equals_gej(&i, &ctx->ecmult_gen_ctx.initial)); - secp256k1_ge_set_gej(&pge, &pgej); - ge_equals_gej(&pge, &pgej2); -} - -void test_ecmult_gen_blind_reset(void) { - /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */ - secp256k1_scalar b; - secp256k1_gej initial; - secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); - b = ctx->ecmult_gen_ctx.blind; - initial = ctx->ecmult_gen_ctx.initial; - secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); - CHECK(secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); - CHECK(gej_xyz_equals_gej(&initial, &ctx->ecmult_gen_ctx.initial)); -} - -void run_ecmult_gen_blind(void) { - int i; - test_ecmult_gen_blind_reset(); - for (i = 0; i < 10; i++) { - test_ecmult_gen_blind(); - } -} - -#ifdef USE_ENDOMORPHISM -/***** ENDOMORPHISH TESTS *****/ -void test_scalar_split(void) { - secp256k1_scalar full; - secp256k1_scalar s1, slam; - const unsigned char zero[32] = {0}; - unsigned char tmp[32]; - - random_scalar_order_test(&full); - secp256k1_scalar_split_lambda(&s1, &slam, &full); - - /* check that both are <= 128 bits in size */ - if (secp256k1_scalar_is_high(&s1)) { - secp256k1_scalar_negate(&s1, &s1); - } - if (secp256k1_scalar_is_high(&slam)) { - secp256k1_scalar_negate(&slam, &slam); - } - - secp256k1_scalar_get_b32(tmp, &s1); - CHECK(memcmp(zero, tmp, 16) == 0); - secp256k1_scalar_get_b32(tmp, &slam); - CHECK(memcmp(zero, tmp, 16) == 0); -} - -void run_endomorphism_tests(void) { - test_scalar_split(); -} -#endif - -void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) { - unsigned char pubkeyc[65]; - secp256k1_pubkey pubkey; - secp256k1_ge ge; - size_t pubkeyclen; - int32_t ecount; - ecount = 0; - secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); - for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) { - /* Smaller sizes are tested exhaustively elsewhere. */ - int32_t i; - memcpy(&pubkeyc[1], input, 64); - VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen); - for (i = 0; i < 256; i++) { - /* Try all type bytes. */ - int xpass; - int ypass; - int ysign; - pubkeyc[0] = i; - /* What sign does this point have? */ - ysign = (input[63] & 1) + 2; - /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */ - xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2); - /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */ - ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) && - ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65)); - if (xpass || ypass) { - /* These cases must parse. */ - unsigned char pubkeyo[65]; - size_t outl; - memset(&pubkey, 0, sizeof(pubkey)); - VG_UNDEF(&pubkey, sizeof(pubkey)); - ecount = 0; - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); - VG_CHECK(&pubkey, sizeof(pubkey)); - outl = 65; - VG_UNDEF(pubkeyo, 65); - CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1); - VG_CHECK(pubkeyo, outl); - CHECK(outl == 33); - CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0); - CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0])); - if (ypass) { - /* This test isn't always done because we decode with alternative signs, so the y won't match. */ - CHECK(pubkeyo[0] == ysign); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); - memset(&pubkey, 0, sizeof(pubkey)); - VG_UNDEF(&pubkey, sizeof(pubkey)); - secp256k1_pubkey_save(&pubkey, &ge); - VG_CHECK(&pubkey, sizeof(pubkey)); - outl = 65; - VG_UNDEF(pubkeyo, 65); - CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); - VG_CHECK(pubkeyo, outl); - CHECK(outl == 65); - CHECK(pubkeyo[0] == 4); - CHECK(memcmp(&pubkeyo[1], input, 64) == 0); - } - CHECK(ecount == 0); - } else { - /* These cases must fail to parse. */ - memset(&pubkey, 0xfe, sizeof(pubkey)); - ecount = 0; - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 0); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); - CHECK(ecount == 1); - } - } - } - secp256k1_context_set_illegal_callback(ctx, NULL, NULL); -} - -void run_ec_pubkey_parse_test(void) { -#define SECP256K1_EC_PARSE_TEST_NVALID (12) - const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = { - { - /* Point with leading and trailing zeros in x and y serialization. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83, - 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00 - }, - { - /* Point with x equal to a 3rd root of unity.*/ - 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, - 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee, - 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, - 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, - }, - { - /* Point with largest x. (1/2) */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, - 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e, - 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d, - }, - { - /* Point with largest x. (2/2) */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, - 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1, - 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2, - }, - { - /* Point with smallest x. (1/2) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, - 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, - }, - { - /* Point with smallest x. (2/2) */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, - 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, - }, - { - /* Point with largest y. (1/3) */ - 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, - 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, - }, - { - /* Point with largest y. (2/3) */ - 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, - 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, - }, - { - /* Point with largest y. (3/3) */ - 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, - 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, - }, - { - /* Point with smallest y. (1/3) */ - 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, - 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - }, - { - /* Point with smallest y. (2/3) */ - 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, - 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - }, - { - /* Point with smallest y. (3/3) */ - 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, - 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 - } - }; -#define SECP256K1_EC_PARSE_TEST_NXVALID (4) - const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = { - { - /* Valid if y overflow ignored (y = 1 mod p). (1/3) */ - 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, - 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, - }, - { - /* Valid if y overflow ignored (y = 1 mod p). (2/3) */ - 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, - 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, - }, - { - /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/ - 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, - 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, - }, - { - /* x on curve, y is from y^2 = x^3 + 8. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 - } - }; -#define SECP256K1_EC_PARSE_TEST_NINVALID (7) - const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = { - { - /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */ - 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c, - 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - }, - { - /* Valid if x overflow ignored (x = 1 mod p). */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, - 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, - 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, - }, - { - /* Valid if x overflow ignored (x = 1 mod p). */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, - 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, - 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, - }, - { - /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, - 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f, - 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28, - }, - { - /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, - 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0, - 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07, - }, - { - /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d, - 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc, - }, - { - /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2, - 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53 - } - }; - const unsigned char pubkeyc[66] = { - /* Serialization of G. */ - 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, - 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, - 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, - 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, - 0xB8, 0x00 - }; - unsigned char sout[65]; - unsigned char shortkey[2]; - secp256k1_ge ge; - secp256k1_pubkey pubkey; - size_t len; - int32_t i; - int32_t ecount; - int32_t ecount2; - ecount = 0; - /* Nothing should be reading this far into pubkeyc. */ - VG_UNDEF(&pubkeyc[65], 1); - secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); - /* Zero length claimed, fail, zeroize, no illegal arg error. */ - memset(&pubkey, 0xfe, sizeof(pubkey)); - ecount = 0; - VG_UNDEF(shortkey, 2); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 0) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 0); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); - CHECK(ecount == 1); - /* Length one claimed, fail, zeroize, no illegal arg error. */ - for (i = 0; i < 256 ; i++) { - memset(&pubkey, 0xfe, sizeof(pubkey)); - ecount = 0; - shortkey[0] = i; - VG_UNDEF(&shortkey[1], 1); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 1) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 0); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); - CHECK(ecount == 1); - } - /* Length two claimed, fail, zeroize, no illegal arg error. */ - for (i = 0; i < 65536 ; i++) { - memset(&pubkey, 0xfe, sizeof(pubkey)); - ecount = 0; - shortkey[0] = i & 255; - shortkey[1] = i >> 8; - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 2) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 0); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); - CHECK(ecount == 1); - } - memset(&pubkey, 0xfe, sizeof(pubkey)); - ecount = 0; - VG_UNDEF(&pubkey, sizeof(pubkey)); - /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */ - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 33) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 0); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); - CHECK(ecount == 1); - /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */ - CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, pubkeyc, 65) == 0); - CHECK(ecount == 2); - /* NULL input string. Illegal arg and zeroize output. */ - memset(&pubkey, 0xfe, sizeof(pubkey)); - ecount = 0; - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, NULL, 65) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 1); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); - CHECK(ecount == 2); - /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */ - memset(&pubkey, 0xfe, sizeof(pubkey)); - ecount = 0; - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 64) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 0); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); - CHECK(ecount == 1); - /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */ - memset(&pubkey, 0xfe, sizeof(pubkey)); - ecount = 0; - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 66) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 0); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); - CHECK(ecount == 1); - /* Valid parse. */ - memset(&pubkey, 0, sizeof(pubkey)); - ecount = 0; - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 65) == 1); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(ecount == 0); - VG_UNDEF(&ge, sizeof(ge)); - CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); - VG_CHECK(&ge.x, sizeof(ge.x)); - VG_CHECK(&ge.y, sizeof(ge.y)); - VG_CHECK(&ge.infinity, sizeof(ge.infinity)); - ge_equals_ge(&secp256k1_ge_const_g, &ge); - CHECK(ecount == 0); - /* secp256k1_ec_pubkey_serialize illegal args. */ - ecount = 0; - len = 65; - CHECK(secp256k1_ec_pubkey_serialize(ctx, NULL, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); - CHECK(ecount == 1); - CHECK(len == 0); - CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, NULL, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); - CHECK(ecount == 2); - len = 65; - VG_UNDEF(sout, 65); - CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, NULL, SECP256K1_EC_UNCOMPRESSED) == 0); - VG_CHECK(sout, 65); - CHECK(ecount == 3); - CHECK(len == 0); - len = 65; - CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, ~0) == 0); - CHECK(ecount == 4); - CHECK(len == 0); - len = 65; - VG_UNDEF(sout, 65); - CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); - VG_CHECK(sout, 65); - CHECK(ecount == 4); - CHECK(len == 65); - /* Multiple illegal args. Should still set arg error only once. */ - ecount = 0; - ecount2 = 11; - CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); - CHECK(ecount == 1); - /* Does the illegal arg callback actually change the behavior? */ - secp256k1_context_set_illegal_callback(ctx, uncounting_illegal_callback_fn, &ecount2); - CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); - CHECK(ecount == 1); - CHECK(ecount2 == 10); - secp256k1_context_set_illegal_callback(ctx, NULL, NULL); - /* Try a bunch of prefabbed points with all possible encodings. */ - for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) { - ec_pubkey_parse_pointtest(valid[i], 1, 1); - } - for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) { - ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0); - } - for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) { - ec_pubkey_parse_pointtest(invalid[i], 0, 0); - } -} - -void run_eckey_edge_case_test(void) { - const unsigned char orderc[32] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, - 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 - }; - const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00}; - unsigned char ctmp[33]; - unsigned char ctmp2[33]; - secp256k1_pubkey pubkey; - secp256k1_pubkey pubkey2; - secp256k1_pubkey pubkey_one; - secp256k1_pubkey pubkey_negone; - const secp256k1_pubkey *pubkeys[3]; - size_t len; - int32_t ecount; - /* Group order is too large, reject. */ - CHECK(secp256k1_ec_seckey_verify(ctx, orderc) == 0); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, orderc) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - /* Maximum value is too large, reject. */ - memset(ctmp, 255, 32); - CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); - memset(&pubkey, 1, sizeof(pubkey)); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - /* Zero is too small, reject. */ - memset(ctmp, 0, 32); - CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); - memset(&pubkey, 1, sizeof(pubkey)); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - /* One must be accepted. */ - ctmp[31] = 0x01; - CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); - memset(&pubkey, 0, sizeof(pubkey)); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); - pubkey_one = pubkey; - /* Group order + 1 is too large, reject. */ - memcpy(ctmp, orderc, 32); - ctmp[31] = 0x42; - CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); - memset(&pubkey, 1, sizeof(pubkey)); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - /* -1 must be accepted. */ - ctmp[31] = 0x40; - CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); - memset(&pubkey, 0, sizeof(pubkey)); - VG_UNDEF(&pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); - VG_CHECK(&pubkey, sizeof(pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); - pubkey_negone = pubkey; - /* Tweak of zero leaves the value changed. */ - memset(ctmp2, 0, 32); - CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, ctmp2) == 1); - CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40); - memcpy(&pubkey2, &pubkey, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); - CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); - /* Multiply tweak of zero zeroizes the output. */ - CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, ctmp2) == 0); - CHECK(memcmp(zeros, ctmp, 32) == 0); - CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, ctmp2) == 0); - CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); - memcpy(&pubkey, &pubkey2, sizeof(pubkey)); - /* Overflowing key tweak zeroizes. */ - memcpy(ctmp, orderc, 32); - ctmp[31] = 0x40; - CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, orderc) == 0); - CHECK(memcmp(zeros, ctmp, 32) == 0); - memcpy(ctmp, orderc, 32); - ctmp[31] = 0x40; - CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, orderc) == 0); - CHECK(memcmp(zeros, ctmp, 32) == 0); - memcpy(ctmp, orderc, 32); - ctmp[31] = 0x40; - CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, orderc) == 0); - CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); - memcpy(&pubkey, &pubkey2, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, orderc) == 0); - CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); - memcpy(&pubkey, &pubkey2, sizeof(pubkey)); - /* Private key tweaks results in a key of zero. */ - ctmp2[31] = 1; - CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 0); - CHECK(memcmp(zeros, ctmp2, 32) == 0); - ctmp2[31] = 1; - CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); - CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); - memcpy(&pubkey, &pubkey2, sizeof(pubkey)); - /* Tweak computation wraps and results in a key of 1. */ - ctmp2[31] = 2; - CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 1); - CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1); - ctmp2[31] = 2; - CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); - ctmp2[31] = 1; - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, ctmp2) == 1); - CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); - /* Tweak mul * 2 = 1+1. */ - CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); - ctmp2[31] = 2; - CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 1); - CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); - /* Test argument errors. */ - ecount = 0; - secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); - CHECK(ecount == 0); - /* Zeroize pubkey on parse error. */ - memset(&pubkey, 0, 32); - CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); - CHECK(ecount == 1); - CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); - memcpy(&pubkey, &pubkey2, sizeof(pubkey)); - memset(&pubkey2, 0, 32); - CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 0); - CHECK(ecount == 2); - CHECK(memcmp(&pubkey2, zeros, sizeof(pubkey2)) == 0); - /* Plain argument errors. */ - ecount = 0; - CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); - CHECK(ecount == 0); - CHECK(secp256k1_ec_seckey_verify(ctx, NULL) == 0); - CHECK(ecount == 1); - ecount = 0; - memset(ctmp2, 0, 32); - ctmp2[31] = 4; - CHECK(secp256k1_ec_pubkey_tweak_add(ctx, NULL, ctmp2) == 0); - CHECK(ecount == 1); - CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, NULL) == 0); - CHECK(ecount == 2); - ecount = 0; - memset(ctmp2, 0, 32); - ctmp2[31] = 4; - CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, NULL, ctmp2) == 0); - CHECK(ecount == 1); - CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, NULL) == 0); - CHECK(ecount == 2); - ecount = 0; - memset(ctmp2, 0, 32); - CHECK(secp256k1_ec_privkey_tweak_add(ctx, NULL, ctmp2) == 0); - CHECK(ecount == 1); - CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, NULL) == 0); - CHECK(ecount == 2); - ecount = 0; - memset(ctmp2, 0, 32); - ctmp2[31] = 1; - CHECK(secp256k1_ec_privkey_tweak_mul(ctx, NULL, ctmp2) == 0); - CHECK(ecount == 1); - CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, NULL) == 0); - CHECK(ecount == 2); - ecount = 0; - CHECK(secp256k1_ec_pubkey_create(ctx, NULL, ctmp) == 0); - CHECK(ecount == 1); - memset(&pubkey, 1, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); - CHECK(ecount == 2); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - /* secp256k1_ec_pubkey_combine tests. */ - ecount = 0; - pubkeys[0] = &pubkey_one; - VG_UNDEF(&pubkeys[0], sizeof(secp256k1_pubkey *)); - VG_UNDEF(&pubkeys[1], sizeof(secp256k1_pubkey *)); - VG_UNDEF(&pubkeys[2], sizeof(secp256k1_pubkey *)); - memset(&pubkey, 255, sizeof(secp256k1_pubkey)); - VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 0) == 0); - VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - CHECK(ecount == 1); - CHECK(secp256k1_ec_pubkey_combine(ctx, NULL, pubkeys, 1) == 0); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - CHECK(ecount == 2); - memset(&pubkey, 255, sizeof(secp256k1_pubkey)); - VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, NULL, 1) == 0); - VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - CHECK(ecount == 3); - pubkeys[0] = &pubkey_negone; - memset(&pubkey, 255, sizeof(secp256k1_pubkey)); - VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 1) == 1); - VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); - CHECK(ecount == 3); - len = 33; - CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); - CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1); - CHECK(memcmp(ctmp, ctmp2, 33) == 0); - /* Result is infinity. */ - pubkeys[0] = &pubkey_one; - pubkeys[1] = &pubkey_negone; - memset(&pubkey, 255, sizeof(secp256k1_pubkey)); - VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 0); - VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); - CHECK(ecount == 3); - /* Passes through infinity but comes out one. */ - pubkeys[2] = &pubkey_one; - memset(&pubkey, 255, sizeof(secp256k1_pubkey)); - VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 3) == 1); - VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); - CHECK(ecount == 3); - len = 33; - CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); - CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1); - CHECK(memcmp(ctmp, ctmp2, 33) == 0); - /* Adds to two. */ - pubkeys[1] = &pubkey_one; - memset(&pubkey, 255, sizeof(secp256k1_pubkey)); - VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 1); - VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); - CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); - CHECK(ecount == 3); - secp256k1_context_set_illegal_callback(ctx, NULL, NULL); -} - -void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) { - secp256k1_scalar nonce; - do { - random_scalar_order_test(&nonce); - } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid)); -} - -void test_ecdsa_sign_verify(void) { - secp256k1_gej pubj; - secp256k1_ge pub; - secp256k1_scalar one; - secp256k1_scalar msg, key; - secp256k1_scalar sigr, sigs; - int recid; - int getrec; - random_scalar_order_test(&msg); - random_scalar_order_test(&key); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key); - secp256k1_ge_set_gej(&pub, &pubj); - getrec = secp256k1_rand_bits(1); - random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL); - if (getrec) { - CHECK(recid >= 0 && recid < 4); - } - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); - secp256k1_scalar_set_int(&one, 1); - secp256k1_scalar_add(&msg, &msg, &one); - CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); -} - -void run_ecdsa_sign_verify(void) { - int i; - for (i = 0; i < 10*count; i++) { - test_ecdsa_sign_verify(); - } -} - -/** Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted. Use only for testing. */ -static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { - (void)msg32; - (void)key32; - (void)algo16; - memcpy(nonce32, data, 32); - return (counter == 0); -} - -static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { - /* Dummy nonce generator that has a fatal error on the first counter value. */ - if (counter == 0) { - return 0; - } - return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1); -} - -static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { - /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */ - if (counter < 3) { - memset(nonce32, counter==0 ? 0 : 255, 32); - if (counter == 2) { - nonce32[31]--; - } - return 1; - } - if (counter < 5) { - static const unsigned char order[] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, - 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, - 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 - }; - memcpy(nonce32, order, 32); - if (counter == 4) { - nonce32[31]++; - } - return 1; - } - /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */ - /* If someone does fine a case where it retries for secp256k1, we'd like to know. */ - if (counter > 5) { - return 0; - } - return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5); -} - -int is_empty_signature(const secp256k1_ecdsa_signature *sig) { - static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0}; - return memcmp(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0; -} - -void test_ecdsa_end_to_end(void) { - unsigned char extra[32] = {0x00}; - unsigned char privkey[32]; - unsigned char message[32]; - unsigned char privkey2[32]; - secp256k1_ecdsa_signature signature[6]; - secp256k1_scalar r, s; - unsigned char sig[74]; - size_t siglen = 74; - unsigned char pubkeyc[65]; - size_t pubkeyclen = 65; - secp256k1_pubkey pubkey; - unsigned char seckey[300]; - size_t seckeylen = 300; - - /* Generate a random key and message. */ - { - secp256k1_scalar msg, key; - random_scalar_order_test(&msg); - random_scalar_order_test(&key); - secp256k1_scalar_get_b32(privkey, &key); - secp256k1_scalar_get_b32(message, &msg); - } - - /* Construct and verify corresponding public key. */ - CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); - - /* Verify exporting and importing public key. */ - CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyc, &pubkeyclen, &pubkey, secp256k1_rand_bits(1) == 1 ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED)); - memset(&pubkey, 0, sizeof(pubkey)); - CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); - - /* Verify private key import and export. */ - CHECK(ec_privkey_export_der(ctx, seckey, &seckeylen, privkey, secp256k1_rand_bits(1) == 1)); - CHECK(ec_privkey_import_der(ctx, privkey2, seckey, seckeylen) == 1); - CHECK(memcmp(privkey, privkey2, 32) == 0); - - /* Optionally tweak the keys using addition. */ - if (secp256k1_rand_int(3) == 0) { - int ret1; - int ret2; - unsigned char rnd[32]; - secp256k1_pubkey pubkey2; - secp256k1_rand256_test(rnd); - ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd); - ret2 = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, rnd); - CHECK(ret1 == ret2); - if (ret1 == 0) { - return; - } - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); - CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); - } - - /* Optionally tweak the keys using multiplication. */ - if (secp256k1_rand_int(3) == 0) { - int ret1; - int ret2; - unsigned char rnd[32]; - secp256k1_pubkey pubkey2; - secp256k1_rand256_test(rnd); - ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd); - ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, rnd); - CHECK(ret1 == ret2); - if (ret1 == 0) { - return; - } - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); - CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); - } - - /* Sign. */ - CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); - CHECK(secp256k1_ecdsa_sign(ctx, &signature[4], message, privkey, NULL, NULL) == 1); - CHECK(secp256k1_ecdsa_sign(ctx, &signature[1], message, privkey, NULL, extra) == 1); - extra[31] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, &signature[2], message, privkey, NULL, extra) == 1); - extra[31] = 0; - extra[0] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, &signature[3], message, privkey, NULL, extra) == 1); - CHECK(memcmp(&signature[0], &signature[4], sizeof(signature[0])) == 0); - CHECK(memcmp(&signature[0], &signature[1], sizeof(signature[0])) != 0); - CHECK(memcmp(&signature[0], &signature[2], sizeof(signature[0])) != 0); - CHECK(memcmp(&signature[0], &signature[3], sizeof(signature[0])) != 0); - CHECK(memcmp(&signature[1], &signature[2], sizeof(signature[0])) != 0); - CHECK(memcmp(&signature[1], &signature[3], sizeof(signature[0])) != 0); - CHECK(memcmp(&signature[2], &signature[3], sizeof(signature[0])) != 0); - /* Verify. */ - CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[1], message, &pubkey) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[2], message, &pubkey) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[3], message, &pubkey) == 1); - /* Test lower-S form, malleate, verify and fail, test again, malleate again */ - CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[0])); - secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]); - secp256k1_scalar_negate(&s, &s); - secp256k1_ecdsa_signature_save(&signature[5], &r, &s); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 0); - CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); - CHECK(secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); - CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); - CHECK(!secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); - secp256k1_scalar_negate(&s, &s); - secp256k1_ecdsa_signature_save(&signature[5], &r, &s); - CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); - CHECK(memcmp(&signature[5], &signature[0], 64) == 0); - - /* Serialize/parse DER and verify again */ - CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); - memset(&signature[0], 0, sizeof(signature[0])); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); - /* Serialize/destroy/parse DER and verify again. */ - siglen = 74; - CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); - sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 0 || - secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 0); -} - -void test_random_pubkeys(void) { - secp256k1_ge elem; - secp256k1_ge elem2; - unsigned char in[65]; - /* Generate some randomly sized pubkeys. */ - size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33; - if (secp256k1_rand_bits(2) == 0) { - len = secp256k1_rand_bits(6); - } - if (len == 65) { - in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7); - } else { - in[0] = secp256k1_rand_bits(1) ? 2 : 3; - } - if (secp256k1_rand_bits(3) == 0) { - in[0] = secp256k1_rand_bits(8); - } - if (len > 1) { - secp256k1_rand256(&in[1]); - } - if (len > 33) { - secp256k1_rand256(&in[33]); - } - if (secp256k1_eckey_pubkey_parse(&elem, in, len)) { - unsigned char out[65]; - unsigned char firstb; - int res; - size_t size = len; - firstb = in[0]; - /* If the pubkey can be parsed, it should round-trip... */ - CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33)); - CHECK(size == len); - CHECK(memcmp(&in[1], &out[1], len-1) == 0); - /* ... except for the type of hybrid inputs. */ - if ((in[0] != 6) && (in[0] != 7)) { - CHECK(in[0] == out[0]); - } - size = 65; - CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0)); - CHECK(size == 65); - CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size)); - ge_equals_ge(&elem,&elem2); - /* Check that the X9.62 hybrid type is checked. */ - in[0] = secp256k1_rand_bits(1) ? 6 : 7; - res = secp256k1_eckey_pubkey_parse(&elem2, in, size); - if (firstb == 2 || firstb == 3) { - if (in[0] == firstb + 4) { - CHECK(res); - } else { - CHECK(!res); - } - } - if (res) { - ge_equals_ge(&elem,&elem2); - CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0)); - CHECK(memcmp(&in[1], &out[1], 64) == 0); - } - } -} - -void run_random_pubkeys(void) { - int i; - for (i = 0; i < 10*count; i++) { - test_random_pubkeys(); - } -} - -void run_ecdsa_end_to_end(void) { - int i; - for (i = 0; i < 64*count; i++) { - test_ecdsa_end_to_end(); - } -} - -int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) { - static const unsigned char zeroes[32] = {0}; -#ifdef ENABLE_OPENSSL_TESTS - static const unsigned char max_scalar[32] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, - 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40 - }; -#endif - - int ret = 0; - - secp256k1_ecdsa_signature sig_der; - unsigned char roundtrip_der[2048]; - unsigned char compact_der[64]; - size_t len_der = 2048; - int parsed_der = 0, valid_der = 0, roundtrips_der = 0; - - secp256k1_ecdsa_signature sig_der_lax; - unsigned char roundtrip_der_lax[2048]; - unsigned char compact_der_lax[64]; - size_t len_der_lax = 2048; - int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0; - -#ifdef ENABLE_OPENSSL_TESTS - ECDSA_SIG *sig_openssl; - const unsigned char *sigptr; - unsigned char roundtrip_openssl[2048]; - int len_openssl = 2048; - int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0; -#endif - - parsed_der = secp256k1_ecdsa_signature_parse_der(ctx, &sig_der, sig, siglen); - if (parsed_der) { - ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der, &sig_der)) << 0; - valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0); - } - if (valid_der) { - ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der, &len_der, &sig_der)) << 1; - roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0; - } - - parsed_der_lax = ecdsa_signature_parse_der_lax(ctx, &sig_der_lax, sig, siglen); - if (parsed_der_lax) { - ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der_lax, &sig_der_lax)) << 10; - valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0); - } - if (valid_der_lax) { - ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11; - roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0; - } - - if (certainly_der) { - ret |= (!parsed_der) << 2; - } - if (certainly_not_der) { - ret |= (parsed_der) << 17; - } - if (valid_der) { - ret |= (!roundtrips_der) << 3; - } - - if (valid_der) { - ret |= (!roundtrips_der_lax) << 12; - ret |= (len_der != len_der_lax) << 13; - ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14; - } - ret |= (roundtrips_der != roundtrips_der_lax) << 15; - if (parsed_der) { - ret |= (!parsed_der_lax) << 16; - } - -#ifdef ENABLE_OPENSSL_TESTS - sig_openssl = ECDSA_SIG_new(); - sigptr = sig; - parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL); - if (parsed_openssl) { - valid_openssl = !BN_is_negative(sig_openssl->r) && !BN_is_negative(sig_openssl->s) && BN_num_bits(sig_openssl->r) > 0 && BN_num_bits(sig_openssl->r) <= 256 && BN_num_bits(sig_openssl->s) > 0 && BN_num_bits(sig_openssl->s) <= 256; - if (valid_openssl) { - unsigned char tmp[32] = {0}; - BN_bn2bin(sig_openssl->r, tmp + 32 - BN_num_bytes(sig_openssl->r)); - valid_openssl = memcmp(tmp, max_scalar, 32) < 0; - } - if (valid_openssl) { - unsigned char tmp[32] = {0}; - BN_bn2bin(sig_openssl->s, tmp + 32 - BN_num_bytes(sig_openssl->s)); - valid_openssl = memcmp(tmp, max_scalar, 32) < 0; - } - } - len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL); - if (len_openssl <= 2048) { - unsigned char *ptr = roundtrip_openssl; - CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl); - roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0); - } else { - len_openssl = 0; - } - ECDSA_SIG_free(sig_openssl); - - ret |= (parsed_der && !parsed_openssl) << 4; - ret |= (valid_der && !valid_openssl) << 5; - ret |= (roundtrips_openssl && !parsed_der) << 6; - ret |= (roundtrips_der != roundtrips_openssl) << 7; - if (roundtrips_openssl) { - ret |= (len_der != (size_t)len_openssl) << 8; - ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9; - } -#endif - return ret; -} - -static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) { - size_t i; - for (i = 0; i < ptrlen; i++) { - int shift = ptrlen - 1 - i; - if (shift >= 4) { - ptr[i] = 0; - } else { - ptr[i] = (val >> shift) & 0xFF; - } - } -} - -static void damage_array(unsigned char *sig, size_t *len) { - int pos; - int action = secp256k1_rand_bits(3); - if (action < 1 && *len > 3) { - /* Delete a byte. */ - pos = secp256k1_rand_int(*len); - memmove(sig + pos, sig + pos + 1, *len - pos - 1); - (*len)--; - return; - } else if (action < 2 && *len < 2048) { - /* Insert a byte. */ - pos = secp256k1_rand_int(1 + *len); - memmove(sig + pos + 1, sig + pos, *len - pos); - sig[pos] = secp256k1_rand_bits(8); - (*len)++; - return; - } else if (action < 4) { - /* Modify a byte. */ - sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255); - return; - } else { /* action < 8 */ - /* Modify a bit. */ - sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3); - return; - } -} - -static void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) { - int der; - int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2]; - size_t tlen, elen, glen; - int indet; - int n; - - *len = 0; - der = secp256k1_rand_bits(2) == 0; - *certainly_der = der; - *certainly_not_der = 0; - indet = der ? 0 : secp256k1_rand_int(10) == 0; - - for (n = 0; n < 2; n++) { - /* We generate two classes of numbers: nlow==1 "low" ones (up to 32 bytes), nlow==0 "high" ones (32 bytes with 129 top bits set, or larger than 32 bytes) */ - nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0); - /* The length of the number in bytes (the first byte of which will always be nonzero) */ - nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8; - CHECK(nlen[n] <= 232); - /* The top bit of the number. */ - nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1)); - /* The top byte of the number (after the potential hardcoded 16 0xFF characters for "high" 32 bytes numbers) */ - nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127)); - /* The number of zero bytes in front of the number (which is 0 or 1 in case of DER, otherwise we extend up to 300 bytes) */ - nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? secp256k1_rand_int(3) : secp256k1_rand_int(300 - nlen[n]) * secp256k1_rand_int(8) / 8); - if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) { - *certainly_not_der = 1; - } - CHECK(nlen[n] + nzlen[n] <= 300); - /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */ - nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2); - if (!der) { - /* nlenlen[n] max 127 bytes */ - int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; - nlenlen[n] += add; - if (add != 0) { - *certainly_not_der = 1; - } - } - CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427); - } - - /* The total length of the data to go, so far */ - tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1]; - CHECK(tlen <= 856); - - /* The length of the garbage inside the tuple. */ - elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8; - if (elen != 0) { - *certainly_not_der = 1; - } - tlen += elen; - CHECK(tlen <= 980); - - /* The length of the garbage after the end of the tuple. */ - glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8; - if (glen != 0) { - *certainly_not_der = 1; - } - CHECK(tlen + glen <= 990); - - /* Write the tuple header. */ - sig[(*len)++] = 0x30; - if (indet) { - /* Indeterminate length */ - sig[(*len)++] = 0x80; - *certainly_not_der = 1; - } else { - int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2); - if (!der) { - int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; - tlenlen += add; - if (add != 0) { - *certainly_not_der = 1; - } - } - if (tlenlen == 0) { - /* Short length notation */ - sig[(*len)++] = tlen; - } else { - /* Long length notation */ - sig[(*len)++] = 128 + tlenlen; - assign_big_endian(sig + *len, tlenlen, tlen); - *len += tlenlen; - } - tlen += tlenlen; - } - tlen += 2; - CHECK(tlen + glen <= 1119); - - for (n = 0; n < 2; n++) { - /* Write the integer header. */ - sig[(*len)++] = 0x02; - if (nlenlen[n] == 0) { - /* Short length notation */ - sig[(*len)++] = nlen[n] + nzlen[n]; - } else { - /* Long length notation. */ - sig[(*len)++] = 128 + nlenlen[n]; - assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]); - *len += nlenlen[n]; - } - /* Write zero padding */ - while (nzlen[n] > 0) { - sig[(*len)++] = 0x00; - nzlen[n]--; - } - if (nlen[n] == 32 && !nlow[n]) { - /* Special extra 16 0xFF bytes in "high" 32-byte numbers */ - int i; - for (i = 0; i < 16; i++) { - sig[(*len)++] = 0xFF; - } - nlen[n] -= 16; - } - /* Write first byte of number */ - if (nlen[n] > 0) { - sig[(*len)++] = nhbyte[n]; - nlen[n]--; - } - /* Generate remaining random bytes of number */ - secp256k1_rand_bytes_test(sig + *len, nlen[n]); - *len += nlen[n]; - nlen[n] = 0; - } - - /* Generate random garbage inside tuple. */ - secp256k1_rand_bytes_test(sig + *len, elen); - *len += elen; - - /* Generate end-of-contents bytes. */ - if (indet) { - sig[(*len)++] = 0; - sig[(*len)++] = 0; - tlen += 2; - } - CHECK(tlen + glen <= 1121); - - /* Generate random garbage outside tuple. */ - secp256k1_rand_bytes_test(sig + *len, glen); - *len += glen; - tlen += glen; - CHECK(tlen <= 1121); - CHECK(tlen == *len); -} - -void run_ecdsa_der_parse(void) { - int i,j; - for (i = 0; i < 200 * count; i++) { - unsigned char buffer[2048]; - size_t buflen = 0; - int certainly_der = 0; - int certainly_not_der = 0; - random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der); - CHECK(buflen <= 2048); - for (j = 0; j < 16; j++) { - int ret = 0; - if (j > 0) { - damage_array(buffer, &buflen); - /* We don't know anything anymore about the DERness of the result */ - certainly_der = 0; - certainly_not_der = 0; - } - ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der); - if (ret != 0) { - size_t k; - fprintf(stderr, "Failure %x on ", ret); - for (k = 0; k < buflen; k++) { - fprintf(stderr, "%02x ", buffer[k]); - } - fprintf(stderr, "\n"); - } - CHECK(ret == 0); - } - } -} - -/* Tests several edge cases. */ -void test_ecdsa_edge_cases(void) { - int t; - secp256k1_ecdsa_signature sig; - - /* Test the case where ECDSA recomputes a point that is infinity. */ - { - secp256k1_gej keyj; - secp256k1_ge key; - secp256k1_scalar msg; - secp256k1_scalar sr, ss; - secp256k1_scalar_set_int(&ss, 1); - secp256k1_scalar_negate(&ss, &ss); - secp256k1_scalar_inverse(&ss, &ss); - secp256k1_scalar_set_int(&sr, 1); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sr); - secp256k1_ge_set_gej(&key, &keyj); - msg = ss; - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); - } - - /* Verify signature with r of zero fails. */ - { - const unsigned char pubkey_mods_zero[33] = { - 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, - 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, - 0x41 - }; - secp256k1_ge key; - secp256k1_scalar msg; - secp256k1_scalar sr, ss; - secp256k1_scalar_set_int(&ss, 1); - secp256k1_scalar_set_int(&msg, 0); - secp256k1_scalar_set_int(&sr, 0); - CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33)); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); - } - - /* Verify signature with s of zero fails. */ - { - const unsigned char pubkey[33] = { - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01 - }; - secp256k1_ge key; - secp256k1_scalar msg; - secp256k1_scalar sr, ss; - secp256k1_scalar_set_int(&ss, 0); - secp256k1_scalar_set_int(&msg, 0); - secp256k1_scalar_set_int(&sr, 1); - CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); - } - - /* Verify signature with message 0 passes. */ - { - const unsigned char pubkey[33] = { - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02 - }; - const unsigned char pubkey2[33] = { - 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, - 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, - 0x43 - }; - secp256k1_ge key; - secp256k1_ge key2; - secp256k1_scalar msg; - secp256k1_scalar sr, ss; - secp256k1_scalar_set_int(&ss, 2); - secp256k1_scalar_set_int(&msg, 0); - secp256k1_scalar_set_int(&sr, 2); - CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); - CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); - secp256k1_scalar_negate(&ss, &ss); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); - secp256k1_scalar_set_int(&ss, 1); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); - } - - /* Verify signature with message 1 passes. */ - { - const unsigned char pubkey[33] = { - 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22, - 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05, - 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c, - 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76, - 0x25 - }; - const unsigned char pubkey2[33] = { - 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40, - 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae, - 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f, - 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10, - 0x62 - }; - const unsigned char csr[32] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, - 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb - }; - secp256k1_ge key; - secp256k1_ge key2; - secp256k1_scalar msg; - secp256k1_scalar sr, ss; - secp256k1_scalar_set_int(&ss, 1); - secp256k1_scalar_set_int(&msg, 1); - secp256k1_scalar_set_b32(&sr, csr, NULL); - CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); - CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); - secp256k1_scalar_negate(&ss, &ss); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); - secp256k1_scalar_set_int(&ss, 2); - secp256k1_scalar_inverse_var(&ss, &ss); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); - } - - /* Verify signature with message -1 passes. */ - { - const unsigned char pubkey[33] = { - 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0, - 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52, - 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27, - 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20, - 0xf1 - }; - const unsigned char csr[32] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, - 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee - }; - secp256k1_ge key; - secp256k1_scalar msg; - secp256k1_scalar sr, ss; - secp256k1_scalar_set_int(&ss, 1); - secp256k1_scalar_set_int(&msg, 1); - secp256k1_scalar_negate(&msg, &msg); - secp256k1_scalar_set_b32(&sr, csr, NULL); - CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); - secp256k1_scalar_negate(&ss, &ss); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); - secp256k1_scalar_set_int(&ss, 3); - secp256k1_scalar_inverse_var(&ss, &ss); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); - } - - /* Signature where s would be zero. */ - { - secp256k1_pubkey pubkey; - size_t siglen; - int32_t ecount; - unsigned char signature[72]; - static const unsigned char nonce[32] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - }; - static const unsigned char nonce2[32] = { - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, - 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, - 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 - }; - const unsigned char key[32] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - }; - unsigned char msg[32] = { - 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53, - 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7, - 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62, - 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9, - }; - ecount = 0; - secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 0); - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 0); - msg[31] = 0xaa; - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 1); - CHECK(ecount == 0); - CHECK(secp256k1_ecdsa_sign(ctx, NULL, msg, key, precomputed_nonce_function, nonce2) == 0); - CHECK(ecount == 1); - CHECK(secp256k1_ecdsa_sign(ctx, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0); - CHECK(ecount == 2); - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0); - CHECK(ecount == 3); - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 1); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, key) == 1); - CHECK(secp256k1_ecdsa_verify(ctx, NULL, msg, &pubkey) == 0); - CHECK(ecount == 4); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, NULL, &pubkey) == 0); - CHECK(ecount == 5); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, NULL) == 0); - CHECK(ecount == 6); - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 1); - CHECK(ecount == 6); - CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); - CHECK(ecount == 7); - /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */ - CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 0); - CHECK(ecount == 8); - siglen = 72; - CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, NULL, &siglen, &sig) == 0); - CHECK(ecount == 9); - CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, NULL, &sig) == 0); - CHECK(ecount == 10); - CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, NULL) == 0); - CHECK(ecount == 11); - CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 1); - CHECK(ecount == 11); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, NULL, signature, siglen) == 0); - CHECK(ecount == 12); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, NULL, siglen) == 0); - CHECK(ecount == 13); - CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, signature, siglen) == 1); - CHECK(ecount == 13); - siglen = 10; - /* Too little room for a signature does not fail via ARGCHECK. */ - CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 0); - CHECK(ecount == 13); - ecount = 0; - CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, NULL) == 0); - CHECK(ecount == 1); - CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, NULL, &sig) == 0); - CHECK(ecount == 2); - CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, NULL) == 0); - CHECK(ecount == 3); - CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, &sig) == 1); - CHECK(ecount == 3); - CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, NULL, signature) == 0); - CHECK(ecount == 4); - CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, NULL) == 0); - CHECK(ecount == 5); - CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 1); - CHECK(ecount == 5); - memset(signature, 255, 64); - CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 0); - CHECK(ecount == 5); - secp256k1_context_set_illegal_callback(ctx, NULL, NULL); - } - - /* Nonce function corner cases. */ - for (t = 0; t < 2; t++) { - static const unsigned char zero[32] = {0x00}; - int i; - unsigned char key[32]; - unsigned char msg[32]; - secp256k1_ecdsa_signature sig2; - secp256k1_scalar sr[512], ss; - const unsigned char *extra; - extra = t == 0 ? NULL : zero; - memset(msg, 0, 32); - msg[31] = 1; - /* High key results in signature failure. */ - memset(key, 0xFF, 32); - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); - CHECK(is_empty_signature(&sig)); - /* Zero key results in signature failure. */ - memset(key, 0, 32); - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); - CHECK(is_empty_signature(&sig)); - /* Nonce function failure results in signature failure. */ - key[31] = 1; - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_fail, extra) == 0); - CHECK(is_empty_signature(&sig)); - /* The retry loop successfully makes its way to the first good value. */ - CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_retry, extra) == 1); - CHECK(!is_empty_signature(&sig)); - CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, nonce_function_rfc6979, extra) == 1); - CHECK(!is_empty_signature(&sig2)); - CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); - /* The default nonce function is deterministic. */ - CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); - CHECK(!is_empty_signature(&sig2)); - CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); - /* The default nonce function changes output with different messages. */ - for(i = 0; i < 256; i++) { - int j; - msg[0] = i; - CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); - CHECK(!is_empty_signature(&sig2)); - secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); - for (j = 0; j < i; j++) { - CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); - } - } - msg[0] = 0; - msg[31] = 2; - /* The default nonce function changes output with different keys. */ - for(i = 256; i < 512; i++) { - int j; - key[0] = i - 256; - CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); - CHECK(!is_empty_signature(&sig2)); - secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); - for (j = 0; j < i; j++) { - CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); - } - } - key[0] = 0; - } - - { - /* Check that optional nonce arguments do not have equivalent effect. */ - const unsigned char zeros[32] = {0}; - unsigned char nonce[32]; - unsigned char nonce2[32]; - unsigned char nonce3[32]; - unsigned char nonce4[32]; - VG_UNDEF(nonce,32); - VG_UNDEF(nonce2,32); - VG_UNDEF(nonce3,32); - VG_UNDEF(nonce4,32); - CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1); - VG_CHECK(nonce,32); - CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1); - VG_CHECK(nonce2,32); - CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1); - VG_CHECK(nonce3,32); - CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1); - VG_CHECK(nonce4,32); - CHECK(memcmp(nonce, nonce2, 32) != 0); - CHECK(memcmp(nonce, nonce3, 32) != 0); - CHECK(memcmp(nonce, nonce4, 32) != 0); - CHECK(memcmp(nonce2, nonce3, 32) != 0); - CHECK(memcmp(nonce2, nonce4, 32) != 0); - CHECK(memcmp(nonce3, nonce4, 32) != 0); - } - - - /* Privkey export where pubkey is the point at infinity. */ - { - unsigned char privkey[300]; - unsigned char seckey[32] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, - 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41, - }; - size_t outlen = 300; - CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 0)); - outlen = 300; - CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 1)); - } -} - -void run_ecdsa_edge_cases(void) { - test_ecdsa_edge_cases(); -} - -#ifdef ENABLE_OPENSSL_TESTS -EC_KEY *get_openssl_key(const unsigned char *key32) { - unsigned char privkey[300]; - size_t privkeylen; - const unsigned char* pbegin = privkey; - int compr = secp256k1_rand_bits(1); - EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); - CHECK(ec_privkey_export_der(ctx, privkey, &privkeylen, key32, compr)); - CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen)); - CHECK(EC_KEY_check_key(ec_key)); - return ec_key; -} - -void test_ecdsa_openssl(void) { - secp256k1_gej qj; - secp256k1_ge q; - secp256k1_scalar sigr, sigs; - secp256k1_scalar one; - secp256k1_scalar msg2; - secp256k1_scalar key, msg; - EC_KEY *ec_key; - unsigned int sigsize = 80; - size_t secp_sigsize = 80; - unsigned char message[32]; - unsigned char signature[80]; - unsigned char key32[32]; - secp256k1_rand256_test(message); - secp256k1_scalar_set_b32(&msg, message, NULL); - random_scalar_order_test(&key); - secp256k1_scalar_get_b32(key32, &key); - secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key); - secp256k1_ge_set_gej(&q, &qj); - ec_key = get_openssl_key(key32); - CHECK(ec_key != NULL); - CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key)); - CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize)); - CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg)); - secp256k1_scalar_set_int(&one, 1); - secp256k1_scalar_add(&msg2, &msg, &one); - CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg2)); - - random_sign(&sigr, &sigs, &key, &msg, NULL); - CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs)); - CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1); - - EC_KEY_free(ec_key); -} - -void run_ecdsa_openssl(void) { - int i; - for (i = 0; i < 10*count; i++) { - test_ecdsa_openssl(); - } -} -#endif - -#ifdef ENABLE_MODULE_ECDH -# include "modules/ecdh/tests_impl.h" -#endif - -#ifdef ENABLE_MODULE_SCHNORR -# include "modules/schnorr/tests_impl.h" -#endif - -#ifdef ENABLE_MODULE_RECOVERY -# include "modules/recovery/tests_impl.h" -#endif - -#ifdef ENABLE_MODULE_RANGEPROOF -# include "modules/rangeproof/tests_impl.h" -#endif - -int main(int argc, char **argv) { - unsigned char seed16[16] = {0}; - unsigned char run32[32] = {0}; - /* find iteration count */ - if (argc > 1) { - count = strtol(argv[1], NULL, 0); - } - - /* find random seed */ - if (argc > 2) { - int pos = 0; - const char* ch = argv[2]; - while (pos < 16 && ch[0] != 0 && ch[1] != 0) { - unsigned short sh; - if (sscanf(ch, "%2hx", &sh)) { - seed16[pos] = sh; - } else { - break; - } - ch += 2; - pos++; - } - } else { - FILE *frand = fopen("/dev/urandom", "r"); - if ((frand == NULL) || !fread(&seed16, sizeof(seed16), 1, frand)) { - uint64_t t = time(NULL) * (uint64_t)1337; - seed16[0] ^= t; - seed16[1] ^= t >> 8; - seed16[2] ^= t >> 16; - seed16[3] ^= t >> 24; - seed16[4] ^= t >> 32; - seed16[5] ^= t >> 40; - seed16[6] ^= t >> 48; - seed16[7] ^= t >> 56; - } - fclose(frand); - } - secp256k1_rand_seed(seed16); - - printf("test count = %i\n", count); - printf("random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", seed16[0], seed16[1], seed16[2], seed16[3], seed16[4], seed16[5], seed16[6], seed16[7], seed16[8], seed16[9], seed16[10], seed16[11], seed16[12], seed16[13], seed16[14], seed16[15]); - - /* initialize */ - run_context_tests(); - ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); - if (secp256k1_rand_bits(1)) { - secp256k1_rand256(run32); - CHECK(secp256k1_context_randomize(ctx, secp256k1_rand_bits(1) ? run32 : NULL)); - } - - run_rand_bits(); - run_rand_int(); - run_util_tests(); - - run_sha256_tests(); - run_hmac_sha256_tests(); - run_rfc6979_hmac_sha256_tests(); - -#ifndef USE_NUM_NONE - /* num tests */ - run_num_smalltests(); -#endif - - /* scalar tests */ - run_scalar_tests(); - - /* field tests */ - run_field_inv(); - run_field_inv_var(); - run_field_inv_all_var(); - run_field_misc(); - run_field_convert(); - run_sqr(); - run_sqrt(); - - /* group tests */ - run_ge(); - run_group_decompress(); - - /* ecmult tests */ - run_wnaf(); - run_point_times_order(); - run_ecmult_chain(); - run_ecmult_constants(); - run_ecmult_gen_blind(); - run_ecmult_const_tests(); - run_ec_combine(); - - /* endomorphism tests */ -#ifdef USE_ENDOMORPHISM - run_endomorphism_tests(); -#endif - - /* EC point parser test */ - run_ec_pubkey_parse_test(); - - /* EC key edge cases */ - run_eckey_edge_case_test(); - -#ifdef ENABLE_MODULE_ECDH - /* ecdh tests */ - run_ecdh_tests(); -#endif - - /* ecdsa tests */ - run_random_pubkeys(); - run_ecdsa_der_parse(); - run_ecdsa_sign_verify(); - run_ecdsa_end_to_end(); - run_ecdsa_edge_cases(); -#ifdef ENABLE_OPENSSL_TESTS - run_ecdsa_openssl(); -#endif - -#ifdef ENABLE_MODULE_SCHNORR - /* Schnorr tests */ - run_schnorr_tests(); -#endif - -#ifdef ENABLE_MODULE_RECOVERY - /* ECDSA pubkey recovery tests */ - run_recovery_tests(); -#endif - -#ifdef ENABLE_MODULE_RANGEPROOF - run_rangeproof_tests(); -#endif - - secp256k1_rand256(run32); - printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]); - - /* shutdown */ - secp256k1_context_destroy(ctx); - - printf("no problems found\n"); - return 0; -} diff --git a/external/libwally-core/src/secp256k1/src/util.h b/external/libwally-core/src/secp256k1/src/util.h deleted file mode 100644 index de4c2381e..000000000 --- a/external/libwally-core/src/secp256k1/src/util.h +++ /dev/null @@ -1,137 +0,0 @@ -/********************************************************************** - * Copyright (c) 2013-2015 Pieter Wuille, Gregory Maxwell * - * Distributed under the MIT software license, see the accompanying * - * file COPYING or http://www.opensource.org/licenses/mit-license.php.* - **********************************************************************/ - -#ifndef _SECP256K1_UTIL_H_ -#define _SECP256K1_UTIL_H_ - -#if defined HAVE_CONFIG_H -#include "libsecp256k1-config.h" -#endif - -#include -#include -#include - -typedef struct { - void (*fn)(const char *text, void* data); - const void* data; -} secp256k1_callback; - -static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) { - cb->fn(text, (void*)cb->data); -} - -#ifdef DETERMINISTIC -#define TEST_FAILURE(msg) do { \ - fprintf(stderr, "%s\n", msg); \ - abort(); \ -} while(0); -#else -#define TEST_FAILURE(msg) do { \ - fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ - abort(); \ -} while(0) -#endif - -#ifdef HAVE_BUILTIN_EXPECT -#define EXPECT(x,c) __builtin_expect((x),(c)) -#else -#define EXPECT(x,c) (x) -#endif - -#ifdef DETERMINISTIC -#define CHECK(cond) do { \ - if (EXPECT(!(cond), 0)) { \ - TEST_FAILURE("test condition failed"); \ - } \ -} while(0) -#else -#define CHECK(cond) do { \ - if (EXPECT(!(cond), 0)) { \ - TEST_FAILURE("test condition failed: " #cond); \ - } \ -} while(0) -#endif - -/* Like assert(), but when VERIFY is defined, and side-effect safe. */ -#ifdef VERIFY -#define VERIFY_CHECK CHECK -#define VERIFY_SETUP(stmt) do { stmt; } while(0) -#else -#define VERIFY_CHECK(cond) do { (void)(cond); } while(0) -#define VERIFY_SETUP(stmt) -#endif - -static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) { - void *ret = malloc(size); - if (ret == NULL) { - secp256k1_callback_call(cb, "Out of memory"); - } - return ret; -} - -/* Extract the sign of an int64, take the abs and return a uint64, constant time. */ -SECP256K1_INLINE static int secp256k1_sign_and_abs64(uint64_t *out, int64_t in) { - uint64_t mask0, mask1; - int ret; - ret = in < 0; - mask0 = ret + ~((uint64_t)0); - mask1 = ~mask0; - *out = (uint64_t)in; - *out = (*out & mask0) | ((~*out + 1) & mask1); - return ret; -} - -SECP256K1_INLINE static int secp256k1_clz64_var(uint64_t x) { - int ret; - if (!x) { - return 64; - } -# if defined(HAVE_BUILTIN_CLZLL) - ret = __builtin_clzll(x); -# else - /*FIXME: debruijn fallback. */ - for (ret = 0; ((x & (1ULL << 63)) == 0); x <<= 1, ret++); -# endif - return ret; - -} - -/* Macro for restrict, when available and not in a VERIFY build. */ -#if defined(SECP256K1_BUILD) && defined(VERIFY) -# define SECP256K1_RESTRICT -#else -# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) -# if SECP256K1_GNUC_PREREQ(3,0) -# define SECP256K1_RESTRICT __restrict__ -# elif (defined(_MSC_VER) && _MSC_VER >= 1400) -# define SECP256K1_RESTRICT __restrict -# else -# define SECP256K1_RESTRICT -# endif -# else -# define SECP256K1_RESTRICT restrict -# endif -#endif - -#if defined(_WIN32) -# define I64FORMAT "I64d" -# define I64uFORMAT "I64u" -#else -# define I64FORMAT "lld" -# define I64uFORMAT "llu" -#endif - -#if defined(HAVE___INT128) -# if defined(__GNUC__) -# define SECP256K1_GNUC_EXT __extension__ -# else -# define SECP256K1_GNUC_EXT -# endif -SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; -#endif - -#endif diff --git a/external/libwally-core/src/sign.c b/external/libwally-core/src/sign.c deleted file mode 100644 index c275c30cb..000000000 --- a/external/libwally-core/src/sign.c +++ /dev/null @@ -1,292 +0,0 @@ -#include "internal.h" -#include -#include "secp256k1/include/secp256k1_schnorr.h" -#include "ccan/ccan/build_assert/build_assert.h" -#include - -#define EC_FLAGS_TYPES (EC_FLAG_ECDSA | EC_FLAG_SCHNORR) -#define EC_FLAGS_ALL (EC_FLAG_ECDSA | EC_FLAG_SCHNORR) - -#define MSG_ALL_FLAGS (BITCOIN_MESSAGE_FLAG_HASH) - -static const char MSG_PREFIX[] = "\x18" "Bitcoin Signed Message:\n"; - -/* LCOV_EXCL_START */ -/* Check assumptions we expect to hold true */ -static void assert_assumptions(void) -{ - BUILD_ASSERT(sizeof(secp256k1_ecdsa_signature) == EC_SIGNATURE_LEN); -} -/* LCOV_EXCL_STOP */ - -static bool is_valid_ec_type(uint32_t flags) -{ - return ((flags & EC_FLAGS_TYPES) == EC_FLAG_ECDSA) || - ((flags & EC_FLAGS_TYPES) == EC_FLAG_SCHNORR); -} - - -int wally_ec_private_key_verify(const unsigned char *priv_key, size_t priv_key_len) -{ - const secp256k1_context *ctx = secp_ctx(); - - if (!ctx) - return WALLY_ENOMEM; - - if (!priv_key || priv_key_len != EC_PRIVATE_KEY_LEN) - return WALLY_EINVAL; - - return secp256k1_ec_seckey_verify(ctx, priv_key) ? WALLY_OK : WALLY_EINVAL; -} - -int wally_ec_public_key_from_private_key(const unsigned char *priv_key, size_t priv_key_len, - unsigned char *bytes_out, size_t len) -{ - secp256k1_pubkey pub; - size_t len_in_out = EC_PUBLIC_KEY_LEN; - const secp256k1_context *ctx = secp_ctx(); - bool ok; - - if (!ctx) - return WALLY_ENOMEM; - - ok = priv_key && priv_key_len == EC_PRIVATE_KEY_LEN && - bytes_out && len == EC_PUBLIC_KEY_LEN && - pubkey_create(ctx, &pub, priv_key) && - pubkey_serialize(ctx, bytes_out, &len_in_out, &pub, PUBKEY_COMPRESSED) && - len_in_out == EC_PUBLIC_KEY_LEN; - - if (!ok && bytes_out) - clear(bytes_out, len); - clear(&pub, sizeof(pub)); - return ok ? WALLY_OK : WALLY_EINVAL; -} - -int wally_ec_public_key_decompress(const unsigned char *pub_key, size_t pub_key_len, - unsigned char *bytes_out, size_t len) -{ - secp256k1_pubkey pub; - size_t len_in_out = EC_PUBLIC_KEY_UNCOMPRESSED_LEN; - const secp256k1_context *ctx = secp_ctx(); - bool ok; - - if (!ctx) - return WALLY_ENOMEM; - - ok = pub_key && pub_key_len == EC_PUBLIC_KEY_LEN && - bytes_out && len == EC_PUBLIC_KEY_UNCOMPRESSED_LEN && - pubkey_parse(ctx, &pub, pub_key, pub_key_len) && - pubkey_serialize(ctx, bytes_out, &len_in_out, &pub, PUBKEY_UNCOMPRESSED) && - len_in_out == EC_PUBLIC_KEY_UNCOMPRESSED_LEN; - - if (!ok && bytes_out) - clear(bytes_out, len); - clear(&pub, sizeof(pub)); - return ok ? WALLY_OK : WALLY_EINVAL; -} - -int wally_ec_sig_normalize(const unsigned char *sig_in, size_t sig_in_len, - unsigned char *bytes_out, size_t len) -{ - secp256k1_ecdsa_signature sig, sig_low; - const secp256k1_context *ctx = secp_ctx(); - bool ok; - - if (!ctx) - return WALLY_ENOMEM; - - ok = sig_in && sig_in_len == EC_SIGNATURE_LEN && - bytes_out && len == EC_SIGNATURE_LEN && - secp256k1_ecdsa_signature_parse_compact(ctx, &sig, sig_in); - - if (ok) { - /* Note no error is returned, just whether the sig was changed */ - secp256k1_ecdsa_signature_normalize(ctx, &sig_low, &sig); - - ok = secp256k1_ecdsa_signature_serialize_compact(ctx, bytes_out, - &sig_low); - } - - if (!ok && bytes_out) - clear(bytes_out, len); - clear_n(2, &sig, sizeof(sig), &sig_low, sizeof(sig_low)); - return ok ? WALLY_OK : WALLY_EINVAL; -} - -int wally_ec_sig_to_der(const unsigned char *sig_in, size_t sig_in_len, - unsigned char *bytes_out, size_t len, size_t *written) -{ - secp256k1_ecdsa_signature sig; - size_t len_in_out = len; - const secp256k1_context *ctx = secp_ctx(); - bool ok; - - if (written) - *written = 0; - - if (!ctx) - return WALLY_ENOMEM; - - ok = sig_in && sig_in_len == EC_SIGNATURE_LEN && - bytes_out && len == EC_SIGNATURE_DER_MAX_LEN && written && - secp256k1_ecdsa_signature_parse_compact(ctx, &sig, sig_in) && - secp256k1_ecdsa_signature_serialize_der(ctx, bytes_out, - &len_in_out, &sig); - - if (!ok && bytes_out) - clear(bytes_out, len); - if (ok) - *written = len_in_out; - clear(&sig, sizeof(sig)); - return ok ? WALLY_OK : WALLY_EINVAL; -} - -int wally_ec_sig_from_der(const unsigned char *bytes_in, size_t len_in, - unsigned char *bytes_out, size_t len) -{ - secp256k1_ecdsa_signature sig; - const secp256k1_context *ctx = secp_ctx(); - bool ok; - - if (!ctx) - return WALLY_ENOMEM; - - ok = bytes_in && len_in && bytes_out && len == EC_SIGNATURE_LEN && - secp256k1_ecdsa_signature_parse_der(ctx, &sig, bytes_in, len_in) && - secp256k1_ecdsa_signature_serialize_compact(ctx, bytes_out, &sig); - - if (!ok && bytes_out) - clear(bytes_out, len); - clear(&sig, sizeof(sig)); - return ok ? WALLY_OK : WALLY_EINVAL; -} - -int wally_ec_sig_from_bytes(const unsigned char *priv_key, size_t priv_key_len, - const unsigned char *bytes_in, size_t len_in, - uint32_t flags, - unsigned char *bytes_out, size_t len) -{ - wally_ec_nonce_t nonce_fn = wally_ops()->ec_nonce_fn; - const secp256k1_context *ctx = secp_ctx(); - - if (!priv_key || priv_key_len != EC_PRIVATE_KEY_LEN || - !bytes_in || len_in != EC_MESSAGE_HASH_LEN || - !is_valid_ec_type(flags) || flags & ~EC_FLAGS_ALL || - !bytes_out || len != EC_SIGNATURE_LEN) - return WALLY_EINVAL; - - if (!ctx) - return WALLY_ENOMEM; - - if (flags & EC_FLAG_SCHNORR) { - if (!secp256k1_schnorr_sign(ctx, bytes_out, bytes_in, - priv_key, nonce_fn, NULL)) - return WALLY_EINVAL; /* Failed to sign */ - return WALLY_OK; - } else { - secp256k1_ecdsa_signature sig; - - if (!secp256k1_ecdsa_sign(ctx, &sig, bytes_in, priv_key, nonce_fn, NULL)) { - clear(&sig, sizeof(sig)); - if (secp256k1_ec_seckey_verify(ctx, priv_key)) - return WALLY_ERROR; /* Nonce function failed */ - return WALLY_EINVAL; /* invalid priv_key */ - } - - /* Note this function is documented as never failing */ - secp256k1_ecdsa_signature_serialize_compact(ctx, bytes_out, &sig); - clear(&sig, sizeof(sig)); - } - return WALLY_OK; -} - -int wally_ec_sig_verify(const unsigned char *pub_key, size_t pub_key_len, - const unsigned char *bytes_in, size_t len_in, - uint32_t flags, - const unsigned char *sig_in, size_t sig_in_len) -{ - secp256k1_pubkey pub; - secp256k1_ecdsa_signature sig; - const secp256k1_context *ctx = secp_ctx(); - bool ok; - - if (!pub_key || pub_key_len != EC_PUBLIC_KEY_LEN || - !bytes_in || len_in != EC_MESSAGE_HASH_LEN || - !is_valid_ec_type(flags) || flags & ~EC_FLAGS_ALL || - !sig_in || sig_in_len != EC_SIGNATURE_LEN) - return WALLY_EINVAL; - - if (!ctx) - return WALLY_ENOMEM; - - ok = pubkey_parse(ctx, &pub, pub_key, pub_key_len); - - if (flags & EC_FLAG_SCHNORR) - ok = ok && secp256k1_schnorr_verify(ctx, sig_in, bytes_in, &pub); - else - ok = ok && secp256k1_ecdsa_signature_parse_compact(ctx, &sig, sig_in) && - secp256k1_ecdsa_verify(ctx, &sig, bytes_in, &pub); - - clear_n(2, &pub, sizeof(pub), &sig, sizeof(sig)); - return ok ? WALLY_OK : WALLY_EINVAL; -} - -static inline size_t varint_len(size_t len_in) { - return len_in < 0xfd ? 1u : 3u; -} - -int wally_format_bitcoin_message(const unsigned char *bytes_in, size_t len_in, - uint32_t flags, - unsigned char *bytes_out, size_t len, - size_t *written) -{ - unsigned char buf[256], *msg_buf = bytes_out, *out; - const bool do_hash = (flags & BITCOIN_MESSAGE_FLAG_HASH); - size_t msg_len; - - if (written) - *written = 0; - - if (!bytes_in || !len_in || len_in > BITCOIN_MESSAGE_MAX_LEN || - (flags & ~MSG_ALL_FLAGS) || !bytes_out || !written) - return WALLY_EINVAL; - - msg_len = sizeof(MSG_PREFIX) - 1 + varint_len(len_in) + len_in; - *written = do_hash ? SHA256_LEN : msg_len; - - if (len < *written) - return WALLY_OK; /* Not enough output space, return required size */ - - if (do_hash) { - /* Ensure we have a suitable temporary buffer to serialise into */ - msg_buf = buf; - if (msg_len > sizeof(buf)) { - msg_buf = wally_malloc(msg_len); - if (!msg_buf) { - *written = 0; - return WALLY_ENOMEM; - } - } - } - - /* Serialise the message */ - out = msg_buf; - memcpy(out, MSG_PREFIX, sizeof(MSG_PREFIX) - 1); - out += sizeof(MSG_PREFIX) - 1; - if (len_in < 0xfd) - *out++ = len_in; - else { - *out++ = 0xfd; - *out++ = len_in & 0xff; - *out++ = len_in >> 8; - } - memcpy(out, bytes_in, len_in); - - if (do_hash) { - wally_sha256d(msg_buf, msg_len, bytes_out, SHA256_LEN); - clear(msg_buf, msg_len); - if (msg_buf != buf) - wally_free(msg_buf); - } - return WALLY_OK; -} diff --git a/external/libwally-core/src/swig_java/jni_extra.java_in b/external/libwally-core/src/swig_java/jni_extra.java_in deleted file mode 100644 index e2402f157..000000000 --- a/external/libwally-core/src/swig_java/jni_extra.java_in +++ /dev/null @@ -1,104 +0,0 @@ - - // Support methods for the JNI class - - public final static byte[] aes(byte[] jarg1, byte[] jarg2, long jarg3) { - return aes(jarg1, jarg2, jarg3, null); - } - - public final static byte[] bip32_key_get_chain_code(Object jarg1) { - return bip32_key_get_chain_code(jarg1, null); - } - - public final static byte[] bip32_key_get_parent160(Object jarg1) { - return bip32_key_get_parent160(jarg1, null); - } - - public final static byte[] bip32_key_get_priv_key(Object jarg1) { - return bip32_key_get_priv_key(jarg1, null); - } - - public final static byte[] bip32_key_get_hash160(Object jarg1) { - return bip32_key_get_hash160(jarg1, null); - } - - public final static byte[] bip32_key_get_pub_key(Object jarg1) { - return bip32_key_get_pub_key(jarg1, null); - } - - public final static byte[] bip32_key_serialize(Object jarg1, long jarg2) { - return bip32_key_serialize(jarg1, jarg2, null); - } - - public final static byte[] bip38_raw_from_private_key(byte[] jarg1, byte[] jarg2, long jarg3) { - return bip38_raw_from_private_key(jarg1, jarg2, jarg3, null); - } - - public final static byte[] bip38_to_private_key(String jarg1, byte[] jarg2, long jarg3) { - return bip38_to_private_key(jarg1, jarg2, jarg3, null); - } - - public final static byte[] sha256(byte[] jarg1) { - return sha256(jarg1, null); - } - - public final static byte[] sha256d(byte[] jarg1) { - return sha256d(jarg1, null); - } - - public final static byte[] sha512(byte[] jarg1) { - return sha512(jarg1, null); - } - - public final static byte[] hash160(byte[] jarg1) { - return hash160(jarg1, null); - } - - public final static byte[] hex_to_bytes(String jarg1) { - final byte[] ret = new byte[jarg1.length() / 2]; - if (hex_to_bytes(jarg1, ret) != ret.length) - throw new IllegalArgumentException("invalid hex string length"); - return ret; - } - - public final static byte[] hmac_sha256(byte[] jarg1, byte[] jarg2) { - return hmac_sha256(jarg1, jarg2, null); - } - - public final static byte[] hmac_sha512(byte[] jarg1, byte[] jarg2) { - return hmac_sha512(jarg1, jarg2, null); - } - - public final static byte[] pbkdf2_hmac_sha256(byte[] jarg1, byte[] jarg2, long jarg3, long jarg4) { - return pbkdf2_hmac_sha256(jarg1, jarg2, jarg3, jarg4, null); - } - - public final static byte[] pbkdf2_hmac_sha512(byte[] jarg1, byte[] jarg2, long jarg3, long jarg4) { - return pbkdf2_hmac_sha512(jarg1, jarg2, jarg3, jarg4, null); - } - - public final static byte[] ec_public_key_from_private_key(byte[] jarg1) { - return ec_public_key_from_private_key(jarg1, null); - } - - public final static byte[] ec_sig_from_bytes(byte[] jarg1, byte[] jarg2, long jarg3) { - return ec_sig_from_bytes(jarg1, jarg2, jarg3, null); - } - - public final static byte[] ec_sig_normalize(byte[] jarg1) { - return ec_sig_normalize(jarg1, null); - } - - public final static byte[] ec_sig_from_der(byte[] jarg1) { - return ec_sig_from_der(jarg1, null); - } - - public final static byte[] format_bitcoin_message(byte[] jarg1, long jarg2) { - int msg_len = SHA256_LEN;; - if ((jarg2 & BITCOIN_MESSAGE_FLAG_HASH) == 0) - msg_len = 25 + jarg1.length + (jarg1.length < 253 ? 1 : 3); - final byte[] ret = new byte[msg_len]; - if (format_bitcoin_message(jarg1, jarg2, ret) != ret.length) - throw new IllegalArgumentException("Invalid formatted message"); - return ret; - } -} diff --git a/external/libwally-core/src/swig_java/src/com/blockstream/test/test_bip32.java b/external/libwally-core/src/swig_java/src/com/blockstream/test/test_bip32.java deleted file mode 100644 index edab50b78..000000000 --- a/external/libwally-core/src/swig_java/src/com/blockstream/test/test_bip32.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.blockstream.test; - -import com.blockstream.libwally.Wally; -import static com.blockstream.libwally.Wally.BIP32_FLAG_KEY_PRIVATE; -import static com.blockstream.libwally.Wally.BIP32_VER_MAIN_PRIVATE; - -public class test_bip32 { - - final byte[] mSeed; - - public test_bip32() { - mSeed = h("000102030405060708090a0b0c0d0e0f"); - } - - public void test() { - final Object seedKey = Wally.bip32_key_from_seed(mSeed, BIP32_VER_MAIN_PRIVATE, 0); - - final String hex = "0488ade4000000000000000000873dff81c02f525623fd1fe5167eac3a55" + - "a049de3d314bb42ee227ffed37d50800e8f32e723decf4051aefac8e2c93c9c5b214313817c" + - "db01a1494b917c8436b35"; - final Object unserialized = Wally.bip32_key_unserialize(h(hex)); - - final byte[] newSerialized = Wally.bip32_key_serialize(unserialized, BIP32_FLAG_KEY_PRIVATE); - if (!h(newSerialized).equals(hex)) - throw new RuntimeException("BIP32 serialization did not round-trip correctly"); - - final Object derivedKey = Wally.bip32_key_from_parent(seedKey, 0, BIP32_FLAG_KEY_PRIVATE); - final String derivedChainCode = h(Wally.bip32_key_get_chain_code(derivedKey)); - if (derivedChainCode.length() != 64) - throw new RuntimeException("BIP32 incorrect chain code"); - if (Wally.bip32_key_get_depth(derivedKey) != 1) - throw new RuntimeException("BIP32 incorrect depth"); - - Object initKey = Wally.bip32_key_init(Wally.bip32_key_get_version(derivedKey), - Wally.bip32_key_get_depth(derivedKey), - Wally.bip32_key_get_child_num(derivedKey), - Wally.bip32_key_get_chain_code(derivedKey), - Wally.bip32_key_get_pub_key(derivedKey), - Wally.bip32_key_get_priv_key(derivedKey), - Wally.bip32_key_get_hash160(derivedKey), - Wally.bip32_key_get_parent160(derivedKey)); - - final byte[] derivedSerialized = Wally.bip32_key_serialize(derivedKey, BIP32_FLAG_KEY_PRIVATE); - final byte[] initSerialized = Wally.bip32_key_serialize(initKey, BIP32_FLAG_KEY_PRIVATE); - - if (!h(initSerialized).equals(h(derivedSerialized))) - throw new RuntimeException("BIP32 initialisation by member failed"); - - Wally.bip32_key_free(initKey); - Wally.bip32_key_free(derivedKey); - Wally.bip32_key_free(unserialized); - Wally.bip32_key_free(seedKey); - } - - private String h(final byte[] bytes) { return Wally.hex_from_bytes(bytes); } - private byte[] h(final String hex) { return Wally.hex_to_bytes(hex); } - - public static void main(final String[] args) { - final test_bip32 t = new test_bip32(); - t.test(); - } -} diff --git a/external/libwally-core/src/swig_java/src/com/blockstream/test/test_mnemonic.java b/external/libwally-core/src/swig_java/src/com/blockstream/test/test_mnemonic.java deleted file mode 100644 index 8954f8af0..000000000 --- a/external/libwally-core/src/swig_java/src/com/blockstream/test/test_mnemonic.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.blockstream.test; - -import java.security.SecureRandom; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import com.blockstream.libwally.Wally; -import static com.blockstream.libwally.Wally.BIP39_ENTROPY_LEN_256; -import static com.blockstream.libwally.Wally.BIP39_SEED_LEN_512; - -public class test_mnemonic { - - private final SecureRandom sr = new SecureRandom(); - private final Object wl; - - public test_mnemonic(final String lang) { - this.wl = Wally.bip39_get_wordlist(lang); - } - - public static String[] getLanguages() { - return Wally.bip39_get_languages().split(" "); - } - - public String generate(final int strength) { - final byte[] seed = new byte[strength]; - sr.nextBytes(seed); - return toMnemonic(seed); - } - - public String generate() { - return generate(BIP39_ENTROPY_LEN_256); - } - - public byte[] toEntropy(final String mnemonics) { - final byte[] buf = new byte[BIP39_ENTROPY_LEN_256]; - return Arrays.copyOf(buf, Wally.bip39_mnemonic_to_bytes( - wl, mnemonics, buf)); - } - - public String toMnemonic(final byte[] data) { - return Wally.bip39_mnemonic_from_bytes(wl, data); - } - - public boolean check(final String mnemonic) { - try { - Wally.bip39_mnemonic_validate(wl, mnemonic); - return true; - } catch (final Exception e) { - return false; - } - } - - public byte[] toSeed(final String mnemonic, final String passphrase) { - final byte[] buf = new byte[BIP39_SEED_LEN_512]; - Wally.bip39_mnemonic_to_seed(mnemonic, passphrase, buf); - return buf; - } - - private static final Map testMap; - static { - final String m = - "legal winner thank year wave sausage worth useful legal winner thank yellow"; - final Map aMap = new HashMap<>(); - aMap.put(m, new byte[]{}); - aMap.put(m, null); - aMap.put("gibberish", new byte[BIP39_ENTROPY_LEN_256]); - aMap.put("", new byte[BIP39_ENTROPY_LEN_256]); - aMap.put(null, new byte[BIP39_ENTROPY_LEN_256]); - testMap = Collections.unmodifiableMap(aMap); - } - - public static void main(final String[] args) { - for (final String lang : getLanguages()) { - final test_mnemonic m = new test_mnemonic(lang); - final String phrase = m.generate(); - if (!m.check(phrase) || - m.check(String.format("%s foo", phrase)) || - !Arrays.equals(m.toEntropy(phrase), m.toEntropy(phrase)) || - !m.toMnemonic(m.toEntropy(phrase)).equals(phrase) || - Arrays.equals(m.toSeed(phrase, "foo"), m.toSeed(phrase, "bar"))) - throw new RuntimeException("Mnemonic failed basic verification"); - } - - for(final Map.Entry entry : testMap.entrySet()) - try { - Wally.bip39_mnemonic_to_bytes(null, entry.getKey(), entry.getValue()); - throw new RuntimeException("Mnemonic failed basic verification"); - } catch (final IllegalArgumentException e) { - // pass - } - final byte[] data = new byte[BIP39_ENTROPY_LEN_256]; - - try { - Wally.bip39_mnemonic_from_bytes(null, data); - throw new RuntimeException("Mnemonic failed basic verification"); - } catch (final IllegalArgumentException e) { - // pass - } - - try { - Wally.bip39_mnemonic_from_bytes(new Object(), data); - throw new RuntimeException("Mnemonic failed basic verification"); - } catch (final IllegalArgumentException e) { - // pass - } - } -} diff --git a/external/libwally-core/src/swig_java/swig.i b/external/libwally-core/src/swig_java/swig.i deleted file mode 100644 index 2a521ec9b..000000000 --- a/external/libwally-core/src/swig_java/swig.i +++ /dev/null @@ -1,354 +0,0 @@ -%module wallycore -%{ -#include "../include/wally_core.h" -#include "../include/wally_bip32.h" -#include "bip32_int.h" -#include "../include/wally_bip38.h" -#include "../include/wally_bip39.h" -#include "../include/wally_crypto.h" -#include - -static int check_result(JNIEnv *jenv, int result) -{ - switch (result) { - case WALLY_OK: - break; - case WALLY_EINVAL: - SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, "Invalid argument"); - break; - case WALLY_ENOMEM: - SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "Out of memory"); - break; - default: /* WALLY_ERROR */ - SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "Failed"); - break; - } - return result; -} - -static int int_cast(JNIEnv *jenv, size_t value) { - if (value > INT_MAX) - SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Invalid length"); - return (int)value; -} - -static uint32_t uint32_cast(JNIEnv *jenv, jlong value) { - if (value < 0 || value > UINT_MAX) - SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Invalid uint32_t"); - return (uint32_t)value; -} - -/* Use a static class to hold our opaque pointers */ -#define OBJ_CLASS "com/blockstream/libwally/Wally$Obj" - -/* Create and return a java object to hold an opaque pointer */ -static jobject create_obj(JNIEnv *jenv, void *p, int id) { - jclass clazz; - jmethodID ctor; - - if (!(clazz = (*jenv)->FindClass(jenv, OBJ_CLASS))) - return NULL; - if (!(ctor = (*jenv)->GetMethodID(jenv, clazz, "", "(JI)V"))) - return NULL; - return (*jenv)->NewObject(jenv, clazz, ctor, (jlong)(uintptr_t)p, id); -} - -/* Fetch an opaque pointer from a java object */ -static void *get_obj(JNIEnv *jenv, jobject obj, int id) { - jclass clazz; - jmethodID getter; - void *ret; - - if (!obj || !(clazz = (*jenv)->GetObjectClass(jenv, obj))) - return NULL; - getter = (*jenv)->GetMethodID(jenv, clazz, "get_id", "()I"); - if (!getter || (*jenv)->CallIntMethod(jenv, obj, getter) != id || - (*jenv)->ExceptionOccurred(jenv)) - return NULL; - getter = (*jenv)->GetMethodID(jenv, clazz, "get", "()J"); - if (!getter) - return NULL; - ret = (void *)(uintptr_t)((*jenv)->CallLongMethod(jenv, obj, getter)); - return (*jenv)->ExceptionOccurred(jenv) ? NULL : ret; -} - -static void* get_obj_or_throw(JNIEnv *jenv, jobject obj, int id, const char *name) { - void *ret = get_obj(jenv, obj, id); - if (!ret) - SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, name); - return ret; -} - -static unsigned char* malloc_or_throw(JNIEnv *jenv, size_t len) { - unsigned char *p = (unsigned char *)malloc(len); - if (!p) - SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "Out of memory"); - return p; -} - -static jbyteArray create_array(JNIEnv *jenv, const unsigned char* p, size_t len) { - jbyteArray ret = (*jenv)->NewByteArray(jenv, len); - if (ret) - (*jenv)->SetByteArrayRegion(jenv, ret, 0, len, (const jbyte*)p); - return ret; -} - -#define member_size(struct_, member) sizeof(((struct struct_ *)0)->member) -%} - -%javaconst(1); -%ignore wally_free_string; -%ignore wally_bzero; - -%pragma(java) jniclasscode=%{ - private static boolean loadLibrary() { - try { - System.loadLibrary("wallycore"); - return true; - } catch (final UnsatisfiedLinkError e) { - System.err.println("Native code library failed to load.\n" + e); - return false; - } - } - - private static final boolean enabled = loadLibrary(); - public static boolean isEnabled() { - return enabled; - } - - static final class Obj { - private final transient long ptr; - private final int id; - private Obj(final long ptr, final int id) { this.ptr = ptr; this.id = id; } - private long get() { return ptr; } - private int get_id() { return id; } - } -%} - -/* Raise an exception whenever a function fails */ -%exception { - $action - check_result(jenv, result); -} - -/* Don't use our int return value except for exception checking */ -%typemap(out) int %{ -%} - -/* Output parameters indicating how many bytes were written/sizes are - * converted into return values. */ -%typemap(in,noblock=1,numinputs=0) size_t *written(size_t sz) { - sz = 0; $1 = ($1_ltype)&sz; -} -%typemap(in,noblock=1,numinputs=0) size_t *output(size_t sz) { - sz = 0; $1 = ($1_ltype)&sz; -} -%typemap(argout,noblock=1) size_t* { - $result = int_cast(jenv, *$1); -} - -/* Output strings are converted to native Java strings and returned */ -%typemap(in,noblock=1,numinputs=0) char **output(char *temp = 0) { - $1 = &temp; -} -%typemap(argout,noblock=1) (char **output) { - if ($1) { - $result = (*jenv)->NewStringUTF(jenv, *$1); - wally_free_string(*$1); - } else - $result = NULL; -} - -/* uint32_t input arguments are taken as longs and cast with range checking */ -%typemap(in) uint32_t { - $1 = uint32_cast(jenv, $input); -} - -/* uint62_t input arguments are taken as longs and cast unchecked. This means - * callers need to take care with treating negative values correctly */ -%typemap(in) uint64_t { - $1 = (uint64_t)($input); -} - -/* Treat uint32_t/uint64_t arrays like strings of ints */ -%define %java_int_array(INTTYPE, JNITYPE, JTYPE, GETFN, RELEASEFN) -%typemap(jni) (INTTYPE *STRING, size_t LENGTH) "JNITYPE" -%typemap(jtype) (INTTYPE *STRING, size_t LENGTH) "JTYPE[]" -%typemap(jstype) (INTTYPE *STRING, size_t LENGTH) "JTYPE[]" -%typemap(javain) (INTTYPE *STRING, size_t LENGTH) "$javainput" -%typemap(freearg) (INTTYPE *STRING, size_t LENGTH) "" -%typemap(in) (INTTYPE *STRING, size_t LENGTH) { - $1 = $input ? (INTTYPE *) JCALL2(GETFN, jenv, $input, 0) : 0; - $2 = $input ? (size_t) JCALL1(GetArrayLength, jenv, $input) : 0; -} -%typemap(argout) (INTTYPE *STRING, size_t LENGTH) { - if ($input) JCALL3(RELEASEFN, jenv, $input, (j##JTYPE *)$1, 0); -} -%enddef - -%java_int_array(uint32_t, jintArray, int, GetIntArrayElements, ReleaseIntArrayElements) -%java_int_array(uint64_t, jlongArray, long, GetLongArrayElements, ReleaseLongArrayElements) - -/* Input buffers with lengths are passed as arrays */ -%apply(char *STRING, size_t LENGTH) { (const unsigned char *bytes_in, size_t len_in) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *chain_code, size_t chain_code_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *hash160, size_t hash160_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *iv, size_t iv_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *key, size_t key_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *pass, size_t pass_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *parent160, size_t parent160_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *priv_key, size_t priv_key_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *pub_key, size_t pub_key_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *salt, size_t salt_len) }; -%apply(char *STRING, size_t LENGTH) { (const unsigned char *sig_in, size_t sig_in_len) }; - -/* Output buffers */ -%apply(char *STRING, size_t LENGTH) { (unsigned char *bytes_out, size_t len) }; -%apply(char *STRING, size_t LENGTH) { (unsigned char *bytes_in_out, size_t len) }; -%apply(char *STRING, size_t LENGTH) { (unsigned char *salt_in_out, size_t salt_len) }; - -%apply(uint32_t *STRING, size_t LENGTH) { (const uint32_t *child_num_in, size_t child_num_len) } - -%typemap(in, numinputs=0) uint64_t *value_out (uint64_t val) { - val = 0; $1 = ($1_ltype)&val; -} -%typemap(argout) uint64_t* value_out{ - $result = (jlong)*$1; -} - -/* Opaque types are converted to/from an internal object holder class */ -%define %java_opaque_struct(NAME, ID) -%typemap(in, numinputs=0) const struct NAME **output (const struct NAME * w) { - w = 0; $1 = ($1_ltype)&w; -} -%typemap(argout) const struct NAME ** { - if (*$1) - $result = create_obj(jenv, *$1, ID); -} -%typemap (in) const struct NAME * { - $1 = (struct NAME *)get_obj_or_throw(jenv, $input, ID, "NAME"); - if (!$1) - return $null; -} -%typemap(jtype) const struct NAME * "Object" -%typemap(jni) const struct NAME * "jobject" -%enddef - -/* Change a functions return type to match its output type mapping */ -%define %return_decls(FUNC, JTYPE, JNITYPE) -%typemap(jstype) int FUNC "JTYPE" -%typemap(jtype) int FUNC "JTYPE" -%typemap(jni) int FUNC "JNITYPE" -%rename("%(strip:[wally_])s") FUNC; -%enddef - -%define %returns_void__(FUNC) -%return_decls(FUNC, void, void) -%enddef -%define %returns_size_t(FUNC) -%return_decls(FUNC, int, jint) -%enddef -%define %returns_uint64(FUNC) -%return_decls(FUNC, long, jlong) -%enddef -%define %returns_string(FUNC) -%return_decls(FUNC, String, jstring) -%enddef -%define %returns_struct(FUNC, STRUCT) -%return_decls(FUNC, Object, jobject) -%enddef -%define %returns_array_(FUNC, ARRAYARG, LENARG, LEN) -%return_decls(FUNC, byte[], jbyteArray) -%exception FUNC { - int skip = 0; - jresult = NULL; - if (!jarg ## ARRAYARG) { - arg ## LENARG = LEN; - arg ## ARRAYARG = malloc_or_throw(jenv, LEN); - if (!arg ## ARRAYARG) - skip = 1; /* Exception set by malloc_or_throw */ - } - if (!skip) { - $action - if (check_result(jenv, result) == WALLY_OK && !jarg ## ARRAYARG) - jresult = create_array(jenv, arg ## ARRAYARG, LEN); - if (!jarg ## ARRAYARG) { - wally_bzero(arg ## ARRAYARG, LEN); - free(arg ## ARRAYARG); - } - } -} -%enddef - - -/* Our wrapped opaque types */ -%java_opaque_struct(words, 1) -%java_opaque_struct(ext_key, 2) - - -/* Our wrapped functions return types */ -%returns_void__(bip32_key_free); -%returns_struct(bip32_key_from_parent_alloc, ext_key); -%rename("bip32_key_from_parent") bip32_key_from_parent_alloc; -%returns_struct(bip32_key_from_parent_path_alloc, ext_key); -%rename("bip32_key_from_parent_path") bip32_key_from_parent_path_alloc; -%returns_struct(bip32_key_from_seed_alloc, ext_key); -%rename("bip32_key_from_seed") bip32_key_from_seed_alloc; -%returns_array_(bip32_key_get_chain_code, 2, 3, member_size(ext_key, chain_code)); -%returns_size_t(bip32_key_get_child_num); -%returns_size_t(bip32_key_get_depth); -%returns_array_(bip32_key_get_hash160, 2, 3, member_size(ext_key, hash160)); -%returns_array_(bip32_key_get_parent160, 2, 3, member_size(ext_key, parent160)); -%returns_array_(bip32_key_get_priv_key, 2, 3, member_size(ext_key, priv_key) - 1); -%returns_array_(bip32_key_get_pub_key, 2, 3, member_size(ext_key, pub_key)); -%returns_size_t(bip32_key_get_version); -%returns_struct(bip32_key_init_alloc, ext_key); -%rename("bip32_key_init") bip32_key_init_alloc; -%returns_array_(bip32_key_serialize, 3, 4, BIP32_SERIALIZED_LEN); -%returns_struct(bip32_key_unserialize_alloc, ext_key); -%rename("bip32_key_unserialize") bip32_key_unserialize_alloc; -%returns_array_(bip38_raw_from_private_key, 6, 7, BIP38_SERIALIZED_LEN); -%returns_string(bip38_from_private_key); -%returns_array_(bip38_raw_to_private_key, 6, 7, 32); -%returns_array_(bip38_to_private_key, 5, 6, 32); -%returns_string(bip39_get_languages); -%returns_struct(bip39_get_wordlist, words); -%returns_string(bip39_get_word); -%returns_string(bip39_mnemonic_from_bytes); -%returns_size_t(bip39_mnemonic_to_bytes); -%returns_void__(bip39_mnemonic_validate); -%returns_size_t(bip39_mnemonic_to_seed); -%returns_array_(wally_aes, 6, 7, AES_BLOCK_LEN); -%returns_size_t(wally_aes_cbc); -%returns_string(wally_base58_from_bytes); -%returns_size_t(wally_base58_to_bytes); -%returns_size_t(wally_base58_get_length); -%returns_void__(wally_ec_private_key_verify); -%returns_array_(wally_ec_public_key_decompress, 3, 4, EC_PUBLIC_KEY_UNCOMPRESSED_LEN); -%returns_array_(wally_ec_public_key_from_private_key, 3, 4, EC_PUBLIC_KEY_LEN); -%returns_array_(wally_ec_sig_from_bytes, 6, 7, EC_SIGNATURE_LEN); -%returns_array_(wally_ec_sig_normalize, 3, 4, EC_SIGNATURE_LEN); -%returns_array_(wally_ec_sig_from_der, 3, 4, EC_SIGNATURE_LEN); -%returns_size_t(wally_ec_sig_to_der); -%returns_void__(wally_ec_sig_verify); -%returns_size_t(wally_format_bitcoin_message); -%returns_string(wally_hex_from_bytes); -%returns_size_t(wally_hex_to_bytes); -%returns_size_t(wally_format_bitcoin_message); -%returns_void__(wally_scrypt); -%returns_array_(wally_sha256, 3, 4, SHA256_LEN); -%returns_array_(wally_sha256d, 3, 4, SHA256_LEN); -%returns_array_(wally_sha512, 3, 4, SHA512_LEN); -%returns_array_(wally_hash160, 3, 4, HASH160_LEN); -%returns_array_(wally_hmac_sha256, 5, 6, HMAC_SHA256_LEN); -%returns_array_(wally_hmac_sha512, 5, 6, HMAC_SHA512_LEN); -%returns_array_(wally_pbkdf2_hmac_sha256, 7, 8, PBKDF2_HMAC_SHA256_LEN); -%returns_array_(wally_pbkdf2_hmac_sha512, 7, 8, PBKDF2_HMAC_SHA512_LEN); -%returns_void__(wally_secp_randomize); - -%include "../include/wally_core.h" -%include "../include/wally_bip32.h" -%include "bip32_int.h" -%include "../include/wally_bip38.h" -%include "../include/wally_bip39.h" -%include "../include/wally_crypto.h" diff --git a/external/libwally-core/src/swig_python/contrib/mnemonic.py b/external/libwally-core/src/swig_python/contrib/mnemonic.py deleted file mode 100644 index ba7e91a31..000000000 --- a/external/libwally-core/src/swig_python/contrib/mnemonic.py +++ /dev/null @@ -1,67 +0,0 @@ -"""A wallycore version of https://github.com/trezor/python-mnemonic""" -import wallycore - -BIP39_ENTROPY_LEN_128 = wallycore.BIP39_ENTROPY_LEN_128 -BIP39_ENTROPY_LEN_160 = wallycore.BIP39_ENTROPY_LEN_160 -BIP39_ENTROPY_LEN_192 = wallycore.BIP39_ENTROPY_LEN_192 -BIP39_ENTROPY_LEN_224 = wallycore.BIP39_ENTROPY_LEN_224 -BIP39_ENTROPY_LEN_256 = wallycore.BIP39_ENTROPY_LEN_256 - -class Mnemonic(object): - - def __init__(self, language): - self.wordlist = wallycore.bip39_get_wordlist(language) - - - @staticmethod - def list_languages(): - return wallycore.bip39_get_languages().split() - - - def generate(self, strength = wallycore.BIP39_ENTROPY_LEN_128): - from os import urandom - return self.to_mnemonic(bytearray(urandom(strength))) - - - def to_entropy(self, words): - if isinstance(words, list): - words = ' '.join(words) - buf = bytearray(BIP39_ENTROPY_LEN_256) - length = wallycore.bip39_mnemonic_to_bytes(self.wordlist, words, buf) - return bytearray(buf)[0:length] - - - def to_mnemonic(self, data): - return wallycore.bip39_mnemonic_from_bytes(self.wordlist, data) - - - def check(self, mnemonic): - wallycore.bip39_mnemonic_validate(self.wordlist, mnemonic) - - - def to_seed(self, mnemonic, passphrase = ''): - buf = bytearray(wallycore.BIP39_SEED_LEN_512) - wallycore.bip39_mnemonic_to_seed(mnemonic, passphrase, buf) - return buf - - -if __name__ == "__main__": - # Just make sure the basics work - for lang in Mnemonic.list_languages(): - m = Mnemonic(lang) - phrase = m.generate() - m.check(phrase) - try: - m.generate(BIP39_ENTROPY_LEN_256 - 1) - assert False - except: - pass - try: - m.check(phrase + ' foo') - assert False - except: - pass - assert m.to_entropy(phrase) == m.to_entropy(phrase.split()) - assert m.to_mnemonic(m.to_entropy(phrase)) == phrase - assert m.to_seed(phrase, 'foo') != m.to_seed(phrase, 'bar') - diff --git a/external/libwally-core/src/swig_python/python_extra.py_in b/external/libwally-core/src/swig_python/python_extra.py_in deleted file mode 100644 index 2b42ec177..000000000 --- a/external/libwally-core/src/swig_python/python_extra.py_in +++ /dev/null @@ -1,65 +0,0 @@ -# Support functions for the SWIG python wrapper - -def _wrap_bin(fn, length, resize=False): - """ Wrap functions that take an output buffer to create/return it """ - def wrapped(*args): - #assert type(args[0]) is not unicode - buf = bytearray(length(*args) if callable(length) else length) - ret = fn(*list(args)+[buf]) - if resize: - return buf[0:ret] # Truncate buf to bytes written - return (ret, buf) if ret is not None else buf - return wrapped - -_unwrapped_hex_to_bytes = hex_to_bytes -def hex_to_bytes(hex_str): - hex_str = hex_str.encode('ascii') - buf = bytearray(len(hex_str) / 2) - _unwrapped_hex_to_bytes(bytes(hex_str), buf) - return buf - -sha256 = _wrap_bin(sha256, SHA256_LEN) -sha256d = _wrap_bin(sha256d, SHA256_LEN) -sha512 = _wrap_bin(sha512, SHA512_LEN) -hash160 = _wrap_bin(hash160, HASH160_LEN) -hmac_sha256 = _wrap_bin(hmac_sha256, HMAC_SHA256_LEN) -hmac_sha512 = _wrap_bin(hmac_sha512, HMAC_SHA512_LEN) - -bip32_key_serialize = _wrap_bin(bip32_key_serialize, BIP32_SERIALIZED_LEN) -bip32_key_get_chain_code = _wrap_bin(bip32_key_get_chain_code, 32) -bip32_key_get_priv_key = _wrap_bin(bip32_key_get_priv_key, 32) -bip32_key_get_pub_key = _wrap_bin(bip32_key_get_pub_key, 33) -bip32_key_get_parent160 = _wrap_bin(bip32_key_get_parent160, HASH160_LEN) -bip32_key_get_hash160 = _wrap_bin(bip32_key_get_hash160, HASH160_LEN) - -bip38_raw_from_private_key = _wrap_bin(bip38_raw_from_private_key, BIP38_SERIALIZED_LEN) -bip38_raw_to_private_key = _wrap_bin(bip38_raw_to_private_key, 32); -bip38_to_private_key = _wrap_bin(bip38_raw_to_private_key, 32); -bip39_mnemonic_to_seed512 = _wrap_bin(bip39_mnemonic_to_seed, BIP39_SEED_LEN_512) - -pbkdf2_hmac_sha256 = _wrap_bin(pbkdf2_hmac_sha256, PBKDF2_HMAC_SHA256_LEN) -pbkdf2_hmac_sha512 = _wrap_bin(pbkdf2_hmac_sha512, PBKDF2_HMAC_SHA512_LEN) - -ec_public_key_decompress = _wrap_bin(ec_public_key_decompress, EC_PUBLIC_KEY_UNCOMPRESSED_LEN) -ec_public_key_from_private_key = _wrap_bin(ec_public_key_from_private_key, EC_PUBLIC_KEY_LEN) -ec_sig_from_bytes = _wrap_bin(ec_sig_from_bytes, EC_SIGNATURE_LEN) -ec_sig_from_der = _wrap_bin(ec_sig_from_der, EC_SIGNATURE_LEN) -ec_sig_normalize = _wrap_bin(ec_sig_normalize, EC_SIGNATURE_LEN) -ec_sig_to_der = _wrap_bin(ec_sig_to_der, EC_SIGNATURE_DER_MAX_LEN, resize=True) - -def base58check_from_bytes(buf): - return base58_from_bytes(buf, BASE58_FLAG_CHECKSUM) - -def _base58_len_fn(base58, flags): - return len(base58) + (4 if (flags & BASE58_FLAG_CHECKSUM) else 0) -base58_to_bytes = _wrap_bin(base58_to_bytes, _base58_len_fn, resize=True) - -def base58check_to_bytes(base58): - return base58_to_bytes(base58, BASE58_FLAG_CHECKSUM) - -def _format_bitcoin_message_len_fn(msg, flags): - if flags & BITCOIN_MESSAGE_FLAG_HASH: - return SHA256_LEN - msg_len = len(msg) - return 25 + msg_len + (1 if msg_len < 253 else 3) -format_bitcoin_message = _wrap_bin(format_bitcoin_message, _format_bitcoin_message_len_fn, resize=True) diff --git a/external/libwally-core/src/swig_python/swig.i b/external/libwally-core/src/swig_python/swig.i deleted file mode 100644 index 6924d24ee..000000000 --- a/external/libwally-core/src/swig_python/swig.i +++ /dev/null @@ -1,188 +0,0 @@ -%module wallycore -%{ -#define SWIG_FILE_WITH_INIT -#include -#include "../include/wally_core.h" -#include "../include/wally_bip32.h" -#include "bip32_int.h" -#include "../include/wally_bip38.h" -#include "../include/wally_bip39.h" -#include "../include/wally_crypto.h" -#include "../internal.h" - -#undef malloc -#undef free -#define malloc(size) wally_malloc(size) -#define free(ptr) wally_free(ptr) - -static int check_result(int result) -{ - switch (result) { - case WALLY_OK: - break; - case WALLY_EINVAL: - PyErr_SetString(PyExc_ValueError, "Invalid argument"); - break; - case WALLY_ENOMEM: - PyErr_SetString(PyExc_MemoryError, "Out of memory"); - break; - default: /* WALLY_ERROR */ - PyErr_SetString(PyExc_RuntimeError, "Failed"); - break; - } - return result; -} - -#define capsule_cast(obj, name) \ - (struct name *)PyCapsule_GetPointer(obj, "struct " #name " *") - -static void destroy_words(PyObject *obj) { (void)obj; } -static void destroy_ext_key(PyObject *obj) { - struct ext_key *contained = capsule_cast(obj, ext_key); - if (contained) - bip32_key_free(contained); -} - -#define MAX_LOCAL_STACK 256u -%} - -%include pybuffer.i -%include exception.i - -/* Raise an exception whenever a function fails */ -%exception{ - $action - if (check_result(result)) - SWIG_fail; -}; - -/* Return None if we didn't throw instead of 0 */ -%typemap(out) int %{ - Py_IncRef(Py_None); - $result = Py_None; -%} - -%define %pybuffer_nullable_binary(TYPEMAP, SIZE) -%typemap(in) (TYPEMAP, SIZE) - (int res, Py_ssize_t size = 0, const void *buf = 0) { - if ($input == Py_None) - $2 = 0; - else { - res = PyObject_AsReadBuffer($input, &buf, &size); - if (res<0) { - PyErr_Clear(); - %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); - } - $1 = ($1_ltype) buf; - $2 = ($2_ltype) (size / sizeof($*1_type)); - } -} -%enddef - -/* Input buffers with lengths are passed as python buffers */ -%pybuffer_nullable_binary(const unsigned char *bytes_in, size_t len_in); -%pybuffer_binary(const unsigned char *chain_code, size_t chain_code_len); -%pybuffer_nullable_binary(const unsigned char *hash160, size_t hash160_len); -%pybuffer_binary(const unsigned char *iv, size_t iv_len); -%pybuffer_binary(const unsigned char *key, size_t key_len); -%pybuffer_binary(const unsigned char *pass, size_t pass_len); -%pybuffer_nullable_binary(const unsigned char *parent160, size_t parent160_len); -%pybuffer_nullable_binary(const unsigned char *priv_key, size_t priv_key_len); -%pybuffer_nullable_binary(const unsigned char *pub_key, size_t pub_key_len); -%pybuffer_binary(const unsigned char *salt, size_t salt_len); -%pybuffer_binary(const unsigned char *sig_in, size_t sig_in_len); -%pybuffer_mutable_binary(unsigned char *bytes_out, size_t len); -%pybuffer_mutable_binary(unsigned char *bytes_in_out, size_t len); -%pybuffer_mutable_binary(unsigned char *salt_in_out, size_t salt_len); - -/* Output integer values are converted into return values. */ -%typemap(in, numinputs=0) size_t *written (size_t sz) { - sz = 0; $1 = ($1_ltype)&sz; -} -%typemap(argout) size_t* written { - Py_DecRef($result); - $result = PyInt_FromSize_t(*$1); -} - -/* Output strings are converted to native python strings and returned */ -%typemap(in, numinputs=0) char** (char* txt) { - txt = NULL; - $1 = ($1_ltype)&txt; -} -%typemap(argout) char** { - if (*$1 != NULL) { - Py_DecRef($result); - $result = PyString_FromString(*$1); - wally_free_string(*$1); - } -} - -/* Opaque types are passed along as capsules */ -%define %py_opaque_struct(NAME) -%typemap(in, numinputs=0) const struct NAME **output (struct NAME * w) { - w = 0; $1 = ($1_ltype)&w; -} -%typemap(argout) const struct NAME ** { - if (*$1 != NULL) { - Py_DecRef($result); - $result = PyCapsule_New(*$1, "struct NAME *", destroy_ ## NAME); - } -} -%typemap (in) const struct NAME * { - $1 = PyCapsule_GetPointer($input, "struct NAME *"); -} -%enddef - -/* Integer arrays */ -%define %py_int_array(INTTYPE, INTMAX, PNAME, LNAME) -%typemap(in) (const INTTYPE *PNAME, size_t LNAME) (INTTYPE tmp_buf[MAX_LOCAL_STACK/sizeof(INTTYPE)]) { - size_t i; - if (!PyList_Check($input)) { - check_result(WALLY_EINVAL); - SWIG_fail; - } - $2 = PyList_Size($input); - $1 = tmp_buf; - if ($2 * sizeof(INTTYPE) > sizeof(tmp_buf)) - if (!($1 = (INTTYPE *) wally_malloc(($2) * sizeof(INTTYPE)))) { - check_result(WALLY_ENOMEM); - SWIG_fail; - } - for (i = 0; i < $2; ++i) { - PyObject *item = PyList_GET_ITEM($input, i); - unsigned long long v; - if (!SWIG_IsOK(SWIG_AsVal_unsigned_SS_long_SS_long(item, &v)) || v > INTMAX) { - PyErr_SetString(PyExc_OverflowError, "Invalid unsigned integer"); - SWIG_fail; - } - $1[i] = (INTTYPE)v; - } -} -%typemap(freearg) (const INTTYPE *PNAME, size_t LNAME) { - if ($1 && $1 != tmp_buf$argnum) - wally_free($1); -} -%enddef -%py_int_array(uint32_t, 0xffffffffull, child_num_in, child_num_len) -%py_int_array(uint64_t, 0xffffffffffffffffull, values, values_len) - -%py_opaque_struct(words); -%py_opaque_struct(ext_key); - -/* Tell SWIG what uint32_t/uint64_t mean */ -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -%rename("bip32_key_from_parent") bip32_key_from_parent_alloc; -%rename("bip32_key_from_parent_path") bip32_key_from_parent_path_alloc; -%rename("bip32_key_from_seed") bip32_key_from_seed_alloc; -%rename("bip32_key_init") bip32_key_init_alloc; -%rename("bip32_key_unserialize") bip32_key_unserialize_alloc; -%rename("%(regex:/^wally_(.+)/\\1/)s", %$isfunction) ""; - -%include "../include/wally_core.h" -%include "../include/wally_bip32.h" -%include "bip32_int.h" -%include "../include/wally_bip38.h" -%include "../include/wally_bip39.h" -%include "../include/wally_crypto.h" diff --git a/external/libwally-core/src/swig_python/wallycore/README b/external/libwally-core/src/swig_python/wallycore/README deleted file mode 100644 index 60ab85ad9..000000000 --- a/external/libwally-core/src/swig_python/wallycore/README +++ /dev/null @@ -1 +0,0 @@ -https://github.com/jgriffiths/libwally-core diff --git a/external/libwally-core/src/test/test_aes.py b/external/libwally-core/src/test/test_aes.py deleted file mode 100755 index 2a4a376a5..000000000 --- a/external/libwally-core/src/test/test_aes.py +++ /dev/null @@ -1,97 +0,0 @@ -import unittest -from util import * - -cases = [ - # AES test vectors from FIPS 197. - [ 128, "000102030405060708090a0b0c0d0e0f", - "00112233445566778899aabbccddeeff", - "69c4e0d86a7b0430d8cdb78070b4c55a" ], - [ 192, "000102030405060708090a0b0c0d0e0f1011121314151617", - "00112233445566778899aabbccddeeff", - "dda97ca4864cdfe06eaf70a0ec0d7191" ], - [ 256, "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", - "00112233445566778899aabbccddeeff", - "8ea2b7ca516745bfeafc49904b496089" ], - # AES-ECB test vectors from NIST sp800-38a. - [ 128, "2b7e151628aed2a6abf7158809cf4f3c", - "6bc1bee22e409f96e93d7e117393172a", - "3ad77bb40d7a3660a89ecaf32466ef97" ], - [ 128, "2b7e151628aed2a6abf7158809cf4f3c", - "ae2d8a571e03ac9c9eb76fac45af8e51", - "f5d3d58503b9699de785895a96fdbaaf" ], - [ 128, "2b7e151628aed2a6abf7158809cf4f3c", - "30c81c46a35ce411e5fbc1191a0a52ef", - "43b1cd7f598ece23881b00e3ed030688" ], - [ 128, "2b7e151628aed2a6abf7158809cf4f3c", - "f69f2445df4f9b17ad2b417be66c3710", - "7b0c785e27e8ad3f8223207104725dd4" ], - [ 192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", - "6bc1bee22e409f96e93d7e117393172a", - "bd334f1d6e45f25ff712a214571fa5cc" ], - [ 192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", - "ae2d8a571e03ac9c9eb76fac45af8e51", - "974104846d0ad3ad7734ecb3ecee4eef" ], - [ 192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", - "30c81c46a35ce411e5fbc1191a0a52ef", - "ef7afd2270e2e60adce0ba2face6444e" ], - [ 192, "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", - "f69f2445df4f9b17ad2b417be66c3710", - "9a4b41ba738d6c72fb16691603c18e0e" ], - [ 256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", - "6bc1bee22e409f96e93d7e117393172a", - "f3eed1bdb5d2a03c064b5a7e3db181f8" ], - [ 256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", - "ae2d8a571e03ac9c9eb76fac45af8e51", - "591ccb10d410ed26dc5ba74a31362870" ], - [ 256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", - "30c81c46a35ce411e5fbc1191a0a52ef", - "b6ed21b99ca6f4f9f153e7b1beafed1d" ], - [ 256, "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", - "f69f2445df4f9b17ad2b417be66c3710", - "23304b7a39f9f3ff067d8d8f9e24ecc7" ], -] - -class AESTests(unittest.TestCase): - - ENCRYPT, DECRYPT = 1, 2 - - def test_aes(self): - - for c in cases: - key, plain, cypher = [make_cbuffer(s)[0] for s in c[1:]] - key_bytes = { 128: 16, 192: 24, 256: 32}[c[0]] - self.assertEqual(len(key), key_bytes) - - for p, f, o in [(plain, self.ENCRYPT, cypher), - (cypher, self.DECRYPT, plain)]: - - out_buf, out_len = make_cbuffer('00' * len(o)) - ret = wally_aes(key, len(key), p, len(p), f, out_buf, out_len) - self.assertEqual(ret, 0) - self.assertEqual(h(out_buf), h(o)) - - - def get_cbc_cases(self): - lines = [] - with open(root_dir + 'src/data/aes-cbc-pkcs7.txt', 'r') as f: - for l in f.readlines(): - if len(l.strip()) and not l.startswith('#'): - lines.append(l.strip().split('=')[1]) - return [lines[x:x+4] for x in range(0, len(lines), 4)] - - def test_aes_cbc(self): - for c in self.get_cbc_cases(): - plain, key, iv, cypher = [make_cbuffer(s)[0] for s in c] - - for p, f, o in [(plain, self.ENCRYPT, cypher), - (cypher, self.DECRYPT, plain)]: - - out_buf, out_len = make_cbuffer('00' * len(o)) - ret, written = wally_aes_cbc(key, len(key), iv, len(iv), - p, len(p), f, out_buf, out_len) - self.assertEqual((ret, written), (0, len(o))) - self.assertEqual(h(out_buf), h(o)) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_base58.py b/external/libwally-core/src/test/test_base58.py deleted file mode 100755 index 5cd45bbb4..000000000 --- a/external/libwally-core/src/test/test_base58.py +++ /dev/null @@ -1,154 +0,0 @@ -import unittest -from util import * - -class AddressCase(object): - def __init__(self, lines): - # https://github.com/ThePiachu/Bitcoin-Unit-Tests/blob/master/Address - self.ripemd_network = lines[4] - self.checksummed = lines[8] - self.base58 = lines[9] - -class Base58Tests(unittest.TestCase): - - FLAG_CHECKSUM = 0x1 - CHECKSUM_LEN = 4 - - def setUp(self): - if not hasattr(self, 'cases'): - # Test cases from https://github.com/ThePiachu/Bitcoin-Unit-Tests/ - self.cases = [] - cur = [] - with open(root_dir + 'src/data/address_vectors.txt', 'r') as f: - for l in f.readlines(): - if len(l.strip()): - cur.append(l.strip()) - else: - self.cases.append(AddressCase(cur)) - cur = [] - - def encode(self, hex_in, flags): - buf, buf_len = make_cbuffer(hex_in) - ret, base58 = wally_base58_from_bytes(buf, buf_len, flags) - self.assertEqual(ret, WALLY_EINVAL if base58 is None else WALLY_OK) - return base58 - - def decode(self, str_in, flags): - buf, buf_len = make_cbuffer('00' * 1024) - ret, buf_len = wally_base58_to_bytes(utf8(str_in), flags, buf, buf_len) - self.assertEqual(ret, WALLY_OK) - self.assertNotEqual(buf_len, 0) - # Check that just computing the size returns us the actual size - ret, bin_len = wally_base58_get_length(utf8(str_in)) - self.assertEqual(ret, WALLY_OK) - if flags == self.FLAG_CHECKSUM: - bin_len -= self.CHECKSUM_LEN - self.assertEqual(bin_len, buf_len) - return h(buf)[0:buf_len * 2].upper() - - - def test_address_vectors(self): - """Tests for encoding and decoding with and without checksums""" - - for c in self.cases: - # Checksummed should match directly in base 58 - base58 = self.encode(c.checksummed, 0) - self.assertEqual(base58, c.base58) - # Decode it and make sure it matches checksummed again - decoded = self.decode(c.base58, 0) - self.assertEqual(decoded, utf8(c.checksummed)) - - # Compute the checksum in the call - base58 = self.encode(c.ripemd_network, self.FLAG_CHECKSUM) - self.assertEqual(base58, c.base58) - - # Decode without checksum validation/stripping, should match - # checksummed value - decoded = self.decode(c.base58, 0) - self.assertEqual(decoded, utf8(c.checksummed)) - - # Decode with checksum validation/stripping and compare - # to original ripemd + network - decoded = self.decode(c.base58, self.FLAG_CHECKSUM) - self.assertEqual(decoded, utf8(c.ripemd_network)) - - - def test_to_bytes(self): - buf, buf_len = make_cbuffer('00' * 1024) - - # Bad input base58 strings - for bad in [ '', # Empty string can't be represented - '0', # Forbidden ASCII character - 'x0', # Forbidden ASCII character, internal - '\x80', # High bit set - 'x\x80x', # High bit set, internal - ]: - ret, _ = wally_base58_to_bytes(utf8(bad), 0, buf, buf_len) - self.assertEqual(ret, WALLY_EINVAL) - - # Bad checksummed base58 strings - for bad in [ # libbase58: decode-b58c-fail - '19DXstMaV43WpYg4ceREiiTv2UntmoiA9a', - # libbase58: decode-b58c-toolong - '1119DXstMaV43WpYg4ceREiiTv2UntmoiA9a', - # libbase58: decode-b58c-tooshort - '111111111111111111114oLvT2']: - ret, _ = wally_base58_to_bytes(utf8(bad), self.FLAG_CHECKSUM, buf, buf_len) - self.assertEqual(ret, WALLY_EINVAL) - - for base58 in ['BXvDbH', '16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM']: - ret, out_len = wally_base58_get_length(utf8(base58)) - # Output buffer too small returns OK and the number of bytes required - ret, bin_len = wally_base58_to_bytes(utf8(base58), 0, buf, out_len - 1) - self.assertEqual((ret, bin_len), (WALLY_OK, out_len)) - # Unknown flags - ret, _ = wally_base58_to_bytes(utf8(base58), 0x7, buf, buf_len) - self.assertEqual(ret, WALLY_EINVAL) - - # If we ask for checksum validation/removal the output buffer - # must have room for a checksum. - ret, bin_len = wally_base58_to_bytes(utf8('1'), self.FLAG_CHECKSUM, - buf, self.CHECKSUM_LEN) - self.assertEqual(ret, WALLY_EINVAL) - - # Leading ones become zeros - for i in range(1, 10): - self.assertEqual(self.decode('1' * i, 0), utf8('00' * i)) - - # Vectors from https://github.com/bitcoinj/bitcoinj/ - self.assertEqual(self.decode('16Ho7Hs', 0), utf8('00CEF022FA')) - self.assertEqual(self.decode('4stwEBjT6FYyVV', self.FLAG_CHECKSUM), - utf8('45046252208D')) - base58 = '93VYUMzRG9DdbRP72uQXjaWibbQwygnvaCu9DumcqDjGybD864T' - ret = self.decode(base58, self.FLAG_CHECKSUM) - expected = 'EFFB309E964684B54E6069F146E2CD6DA' \ - 'E936B711A7A98DF4097156B9FC9B344EB' - self.assertEqual(ret, utf8(expected)) - - - def test_from_bytes(self): - - # Leading zeros become ones - for i in range(1, 10): - self.assertEqual(self.encode('00' * i, 0), '1' * i) - - # Invalid flags - self.assertEqual(self.encode('00', 0x7), None) - - buf, buf_len = make_cbuffer('00' * 8) - - FAIL_RET = (WALLY_EINVAL, None) - # O length buffer, no checksum -> NULL - self.assertEqual(wally_base58_from_bytes(buf, 0, 0), FAIL_RET) - - # O length buffer, append checksum -> NULL - self.assertEqual(wally_base58_from_bytes(buf, 0, self.FLAG_CHECKSUM), FAIL_RET) - - # Vectors from https://github.com/bitcoinj/bitcoinj/ - self.assertEqual(self.encode('00CEF022FA', 0), '16Ho7Hs') - self.assertEqual(self.encode('45046252208D', self.FLAG_CHECKSUM), - '4stwEBjT6FYyVV') - - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_bip32.py b/external/libwally-core/src/test/test_bip32.py deleted file mode 100755 index e4ac90a1f..000000000 --- a/external/libwally-core/src/test/test_bip32.py +++ /dev/null @@ -1,283 +0,0 @@ -import unittest -from util import * - -VER_MAIN_PUBLIC = 0x0488B21E -VER_MAIN_PRIVATE = 0x0488ADE4 -VER_TEST_PUBLIC = 0x043587CF -VER_TEST_PRIVATE = 0x04358394 - -FLAG_KEY_PRIVATE, FLAG_KEY_PUBLIC, FLAG_SKIP_HASH, = 0x0, 0x1, 0x2 -ALL_DEFINED_FLAGS = FLAG_KEY_PRIVATE | FLAG_KEY_PUBLIC | FLAG_SKIP_HASH -BIP32_SERIALIZED_LEN = 78 - -# These vectors are expressed in binary rather than base 58. The spec base 58 -# representation just obfuscates the data we are validating. For example, the -# chain codes in pub/priv results can be seen as equal in the hex data only. -# -# The vector results are the serialized resulting extended key using either the -# contained public or private key. This is not to be confused with private or -# public derivation - these vectors only derive privately. -vec_1 = { - 'seed': '000102030405060708090a0b0c0d0e0f', - - 'm': { - FLAG_KEY_PUBLIC: '0488B21E000000000000000000873DFF' - '81C02F525623FD1FE5167EAC3A55A049' - 'DE3D314BB42EE227FFED37D5080339A3' - '6013301597DAEF41FBE593A02CC513D0' - 'B55527EC2DF1050E2E8FF49C85C2AB473B21', - - FLAG_KEY_PRIVATE: '0488ADE4000000000000000000873DFF' - '81C02F525623FD1FE5167EAC3A55A049' - 'DE3D314BB42EE227FFED37D50800E8F3' - '2E723DECF4051AEFAC8E2C93C9C5B214' - '313817CDB01A1494B917C8436B35E77E9D71' - }, - - 'm/0H': { - FLAG_KEY_PUBLIC: '0488B21E013442193E8000000047FDAC' - 'BD0F1097043B78C63C20C34EF4ED9A11' - '1D980047AD16282C7AE6236141035A78' - '4662A4A20A65BF6AAB9AE98A6C068A81' - 'C52E4B032C0FB5400C706CFCCC56B8B9C580', - - FLAG_KEY_PRIVATE: '0488ADE4013442193E8000000047FDAC' - 'BD0F1097043B78C63C20C34EF4ED9A11' - '1D980047AD16282C7AE623614100EDB2' - 'E14F9EE77D26DD93B4ECEDE8D16ED408' - 'CE149B6CD80B0715A2D911A0AFEA0A794DEC' - }, - - 'm/0H/1': { - FLAG_KEY_PUBLIC: '0488B21E025C1BD648000000012A7857' - '631386BA23DACAC34180DD1983734E44' - '4FDBF774041578E9B6ADB37C1903501E' - '454BF00751F24B1B489AA925215D66AF' - '2234E3891C3B21A52BEDB3CD711C6F6E2AF7', - - FLAG_KEY_PRIVATE: '0488ADE4025C1BD648000000012A7857' - '631386BA23DACAC34180DD1983734E44' - '4FDBF774041578E9B6ADB37C19003C6C' - 'B8D0F6A264C91EA8B5030FADAA8E538B' - '020F0A387421A12DE9319DC93368B34BC442' - }, - - 'm/0H/1/2H': { - FLAG_KEY_PUBLIC: '0488B21E03BEF5A2F98000000204466B' - '9CC8E161E966409CA52986C584F07E9D' - 'C81F735DB683C3FF6EC7B1503F0357BF' - 'E1E341D01C69FE5654309956CBEA5168' - '22FBA8A601743A012A7896EE8DC2A5162AFA', - - FLAG_KEY_PRIVATE: '0488ADE403BEF5A2F98000000204466B' - '9CC8E161E966409CA52986C584F07E9D' - 'C81F735DB683C3FF6EC7B1503F00CBCE' - '0D719ECF7431D88E6A89FA1483E02E35' - '092AF60C042B1DF2FF59FA424DCA25814A3A' - } -} - -class BIP32Tests(unittest.TestCase): - - NULL_HASH160 = '00' * 20 - SERIALIZED_LEN = 4 + 1 + 4 + 4 + 32 + 33 - - def unserialize_key(self, buf, buf_len): - key_out = ext_key() - ret = bip32_key_unserialize(buf, buf_len, byref(key_out)) - return ret, key_out - - def get_test_master_key(self, vec): - seed, seed_len = make_cbuffer(vec['seed']) - master = ext_key() - ret = bip32_key_from_seed(seed, seed_len, - VER_MAIN_PRIVATE, 0, byref(master)) - self.assertEqual(ret, WALLY_OK) - return master - - def get_test_key(self, vec, path, flags): - buf, buf_len = make_cbuffer(vec[path][flags]) - ret, key_out = self.unserialize_key(buf, self.SERIALIZED_LEN) - self.assertEqual(ret, WALLY_OK) - return key_out - - def derive_key(self, parent, child_num, flags): - key_out = ext_key() - ret = bip32_key_from_parent(byref(parent), child_num, - flags, byref(key_out)) - self.assertEqual(ret, WALLY_OK) - - # Verify that path derivation matches also - p_key_out = self.derive_key_by_path(parent, [child_num], flags) - self.compare_keys(p_key_out, key_out, flags) - return key_out - - def path_to_c(self, path): - c_path = (c_uint * len(path))() - for i, n in enumerate(path): - c_path[i] = n - return c_path - - def derive_key_by_path(self, parent, path, flags, expected=WALLY_OK): - key_out = ext_key() - c_path = self.path_to_c(path) - ret = bip32_key_from_parent_path(byref(parent), c_path, len(path), - flags, byref(key_out)) - self.assertEqual(ret, expected) - return key_out - - def compare_keys(self, key, expected, flags): - self.assertEqual(h(key.chain_code), h(expected.chain_code)) - key_name = 'pub_key' if (flags & FLAG_KEY_PUBLIC) else 'priv_key' - expected_cmp = getattr(expected, key_name) - key_cmp = getattr(key, key_name) - self.assertEqual(h(key_cmp), h(expected_cmp)) - self.assertEqual(key.depth, expected.depth) - self.assertEqual(key.child_num, expected.child_num) - self.assertEqual(h(key.chain_code), h(expected.chain_code)) - # These would be more useful tests if there were any public - # derivation test vectors - # We can only compare the first 4 bytes of the parent fingerprint - # Since that is all thats serialized. - # FIXME: Implement bip32_key_set_parent and test it here - b32 = lambda k: h(k)[0:8] - if flags & FLAG_SKIP_HASH: - self.assertEqual(h(key.hash160), utf8(self.NULL_HASH160)) - self.assertEqual(b32(key.parent160), utf8(self.NULL_HASH160[0:8])) - else: - self.assertEqual(h(key.hash160), h(expected.hash160)) - self.assertEqual(b32(key.parent160), b32(expected.parent160)) - - - def test_serialisation(self): - - # Try short, correct, long lengths. Trimming 8 chars is the correct - # length because the vector value contains 4 check bytes at the end. - for trim, expected in [(0, WALLY_EINVAL), (8, WALLY_OK), (16, WALLY_EINVAL)]: - serialized_hex = vec_1['m'][FLAG_KEY_PRIVATE][0:-trim] - buf, buf_len = make_cbuffer(serialized_hex) - ret, key_out = self.unserialize_key(buf, buf_len) - self.assertEqual(ret, expected) - if ret == 0: - # Check this key serializes back to the same representation - # FIXME: Add full test cases for the serialisation code including errors - buf, buf_len = make_cbuffer('0' * len(serialized_hex)) - ret = bip32_key_serialize(key_out, FLAG_KEY_PRIVATE, - buf, buf_len) - self.assertEqual(ret, WALLY_OK) - self.assertEqual(h(buf).upper(), utf8(serialized_hex)) - - # Check correct and incorrect version numbers as well - # as mismatched key types and versions - ver_cases = [(VER_MAIN_PUBLIC, FLAG_KEY_PUBLIC, WALLY_OK), - (VER_MAIN_PUBLIC, FLAG_KEY_PRIVATE, WALLY_EINVAL), - (VER_MAIN_PRIVATE, FLAG_KEY_PUBLIC, WALLY_EINVAL), - (VER_MAIN_PRIVATE, FLAG_KEY_PRIVATE, WALLY_OK), - (VER_TEST_PUBLIC, FLAG_KEY_PUBLIC, WALLY_OK), - (VER_TEST_PUBLIC , FLAG_KEY_PRIVATE, WALLY_EINVAL), - (VER_TEST_PRIVATE, FLAG_KEY_PUBLIC, WALLY_EINVAL), - (VER_TEST_PRIVATE, FLAG_KEY_PRIVATE, WALLY_OK), - (0x01111111, FLAG_KEY_PUBLIC, WALLY_EINVAL), - (0x01111111, FLAG_KEY_PRIVATE, WALLY_EINVAL)] - - for ver, flags, expected in ver_cases: - no_ver = vec_1['m'][flags][8:-8] - v_str = '0' + hex(ver)[2:] - buf, buf_len = make_cbuffer(v_str + no_ver) - ret, _ = self.unserialize_key(buf, buf_len) - self.assertEqual(ret, expected) - - - def test_key_from_seed(self): - - seed, seed_len = make_cbuffer(vec_1['seed']) - key_out = ext_key() - - # Only private key versions can be used - ver_cases = [(VER_MAIN_PUBLIC, 0, WALLY_EINVAL), - (VER_MAIN_PRIVATE, 0, WALLY_OK), - (VER_TEST_PUBLIC, 0, WALLY_EINVAL), - (VER_TEST_PRIVATE, 0, WALLY_OK), - (VER_TEST_PRIVATE, FLAG_KEY_PUBLIC, WALLY_EINVAL), - (VER_TEST_PRIVATE, FLAG_SKIP_HASH, WALLY_OK)] - for ver, flags, expected in ver_cases: - ret = bip32_key_from_seed(seed, seed_len, ver, flags, byref(key_out)) - self.assertEqual(ret, expected) - - - def test_bip32_vectors(self): - - # BIP32 Test vector 1 - master = self.get_test_master_key(vec_1) - - # Chain m: - for flags in [FLAG_KEY_PUBLIC, FLAG_KEY_PRIVATE]: - expected = self.get_test_key(vec_1, 'm', flags) - self.compare_keys(master, expected, flags) - - derived = master - for path, i in [('m/0H', 0x80000000), - ('m/0H/1', 1), - ('m/0H/1/2H', 0x80000002)]: - - # Derive a public and private child. Verify that the private child - # contains the public and private published vectors. Verify that - # the public child matches the public vector and has no private - # key. Finally, check that the child holds the correct parent hash. - parent160 = derived.hash160 - derived_pub = self.derive_key(derived, i, FLAG_KEY_PUBLIC) - derived = self.derive_key(derived, i, FLAG_KEY_PRIVATE) - for flags in [FLAG_KEY_PUBLIC, FLAG_KEY_PRIVATE]: - expected = self.get_test_key(vec_1, path, flags) - self.compare_keys(derived, expected, flags) - if flags & FLAG_KEY_PUBLIC: - self.compare_keys(derived_pub, expected, flags) - # A neutered private key is indicated by - # BIP32_FLAG_KEY_PUBLIC (0x1) as its first byte. - self.assertEqual(h(derived_pub.priv_key), utf8('01' + '00' * 32)) - self.assertEqual(h(derived.parent160), h(parent160)) - - def create_master_pub_priv(self): - - # Start with BIP32 Test vector 1 - master = self.get_test_master_key(vec_1) - # Derive the same child public and private keys from master - priv = self.derive_key(master, 1, FLAG_KEY_PRIVATE) - pub = self.derive_key(master, 1, FLAG_KEY_PUBLIC) - return master, pub, priv - - def test_public_derivation_identities(self): - - master, pub, priv = self.create_master_pub_priv() - # From the private child we can derive public and private keys - priv_pub = self.derive_key(priv, 1, FLAG_KEY_PUBLIC) - priv_priv = self.derive_key(priv, 1, FLAG_KEY_PRIVATE) - # From the public child we can only derive a public key - pub_pub = self.derive_key(pub, 1, FLAG_KEY_PUBLIC) - - # Verify that trying to derive a private key doesn't work - key_out = ext_key() - ret = bip32_key_from_parent(byref(pub), 1, - FLAG_KEY_PRIVATE, byref(key_out)) - self.assertEqual(ret, WALLY_EINVAL) - - # Now our identities: - # The children share the same public key - self.assertEqual(h(pub.pub_key), h(priv.pub_key)) - # The grand-children share the same public key - self.assertEqual(h(priv_pub.pub_key), h(priv_priv.pub_key)) - self.assertEqual(h(priv_pub.pub_key), h(pub_pub.pub_key)) - # The children and grand-children do not share the same public key - self.assertNotEqual(h(pub.pub_key), h(priv_pub.pub_key)) - - # Test path derivation with multiple child elements - for flags, expected in [(FLAG_KEY_PUBLIC, pub_pub), - (FLAG_KEY_PRIVATE, priv_priv), - (FLAG_KEY_PUBLIC | FLAG_SKIP_HASH, pub_pub), - (FLAG_KEY_PRIVATE | FLAG_SKIP_HASH, priv_priv)]: - path_derived = self.derive_key_by_path(master, [1, 1], flags) - self.compare_keys(path_derived, expected, flags) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_bip38.py b/external/libwally-core/src/test/test_bip38.py deleted file mode 100755 index bb0a64ab8..000000000 --- a/external/libwally-core/src/test/test_bip38.py +++ /dev/null @@ -1,97 +0,0 @@ -import unittest -from util import * - -K_MAIN, K_TEST, K_COMP, K_EC, K_CHECK, K_RAW, K_ORDER = 0, 7, 256, 512, 1024, 2048, 4096 - -# BIP38 Vectors from -# https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki -cases = [ - [ 'CBF4B9F70470856BB4F40F80B87EDB90865997FFEE6DF315AB166D713AF433A5', - 'TestingOneTwoThree', - K_MAIN, - '6PRVWUbkzzsbcVac2qwfssoUJAN1Xhrg6bNk8J7Nzm5H7kxEbn2Nh2ZoGg' ], - [ '09C2686880095B1A4C249EE3AC4EEA8A014F11E6F986D0B5025AC1F39AFBD9AE', - 'Satoshi', - K_MAIN, - '6PRNFFkZc2NZ6dJqFfhRoFNMR9Lnyj7dYGrzdgXXVMXcxoKTePPX1dWByq' ], - [ '64EEAB5F9BE2A01A8365A579511EB3373C87C40DA6D2A25F05BDA68FE077B66E', - unhexlify('cf9300f0909080f09f92a9'), - K_MAIN, - '6PRW5o9FLp4gJDDVqJQKJFTpMvdsSGJxMYHtHaQBF3ooa8mwD69bapcDQn' ], - [ 'CBF4B9F70470856BB4F40F80B87EDB90865997FFEE6DF315AB166D713AF433A5', - 'TestingOneTwoThree', - K_MAIN + K_COMP, - '6PYNKZ1EAgYgmQfmNVamxyXVWHzK5s6DGhwP4J5o44cvXdoY7sRzhtpUeo' ], - [ '09C2686880095B1A4C249EE3AC4EEA8A014F11E6F986D0B5025AC1F39AFBD9AE', - 'Satoshi', - K_MAIN + K_COMP, - '6PYLtMnXvfG3oJde97zRyLYFZCYizPU5T3LwgdYJz1fRhh16bU7u6PPmY7' ], - # Raw vectors - [ '09C2686880095B1A4C249EE3AC4EEA8A014F11E6F986D0B5025AC1F39AFBD9AE', - 'Satoshi', - K_MAIN + K_COMP + K_RAW, - '0142E00B76EA60B62F66F0AF93D8B5380652AF51D1A3902EE00726CCEB70CA636B5B57CE6D3E2F' ], - [ '3CBC4D1E5C5248F81338596C0B1EE025FBE6C112633C357D66D2CE0BE541EA18', - 'jon', - K_MAIN + K_COMP + K_RAW + K_ORDER, - '0142E09F8EE6E3A2FFCB13A99AA976AEDA5A2002ED3DF97FCB9957CD863357B55AA2072D3EB2F9' ], -] - - -class BIP38Tests(unittest.TestCase): - - def from_priv(self, priv_key, passwd, flags): - priv, p_len = make_cbuffer(priv_key) - if flags > K_RAW: - out_buf, out_len = make_cbuffer('00' * 39) - ret = bip38_raw_from_private_key(priv, p_len, passwd, len(passwd), - flags, out_buf, out_len) - return ret, h(out_buf).upper() - else: - return bip38_from_private_key(priv, p_len, passwd, len(passwd), flags) - - def to_priv(self, bip38, passwd, flags): - priv, priv_len = make_cbuffer('00' * 32) - bip38 = utf8(bip38) - if flags > K_RAW: - raw, raw_len = make_cbuffer(bip38) - ret = bip38_raw_to_private_key(raw, raw_len, passwd, len(passwd), - flags, priv, priv_len) - else: - ret = bip38_to_private_key(bip38, passwd, len(passwd), flags, - priv, priv_len) - return ret, priv - - - def test_bip38(self): - - for case in cases: - priv_key, passwd, flags, expected = case - passwd = utf8(passwd) if type(passwd) is not bytes else passwd - ret, bip38 = self.from_priv(priv_key, passwd, flags) - self.assertEqual(ret, WALLY_OK) - bip38 = bip38.decode('utf-8') if type(bip38) is bytes else bip38 - self.assertEqual(bip38, expected) - - ret, new_priv_key = self.to_priv(bip38, passwd, flags) - self.assertEqual(ret, WALLY_OK) - self.assertEqual(h(new_priv_key).upper(), utf8(priv_key)) - ret, new_priv_key = self.to_priv(bip38, '', flags + K_CHECK) - self.assertEqual(ret, WALLY_OK) - - - def test_bip38_invalid(self): - priv_key = 'CBF4B9F70470856BB4F40F80B87EDB90865997FFEE6DF315AB166D713AF433A5' - passwd = utf8('TestingInvalidFlags') - K_RES1 = 0x10 # BIP38_FLAG_RESERVED1 - - for flags, expected in [(0, WALLY_OK), - (K_RES1, WALLY_EINVAL), - (K_RAW, WALLY_OK), - (K_RAW+K_RES1, WALLY_EINVAL)]: - ret, _ = self.from_priv(priv_key, passwd, K_MAIN + flags) - self.assertEqual(ret, expected) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_bip39.py b/external/libwally-core/src/test/test_bip39.py deleted file mode 100755 index 95f8100f2..000000000 --- a/external/libwally-core/src/test/test_bip39.py +++ /dev/null @@ -1,123 +0,0 @@ -import unittest -from util import * -import json - - -class BIP39Tests(unittest.TestCase): - - cases = None - langs = { 'en': 'english', - 'es': 'spanish', - 'fr': 'french', - 'it': 'italian', - 'jp': 'japanese', - 'zhs': 'chinese_simplified', - 'zht': 'chinese_traditional' } - - def get_wordlist(self, lang): - out = c_void_p() - bip39_get_wordlist(lang, byref(out)) - return out - - def setUp(self): - if self.cases is None: - with open(root_dir + 'src/data/wordlists/vectors.json', 'r') as f: - cases = json.load(f)['english'] - conv = lambda case: [utf8(x) for x in case] - self.cases = [conv(case) for case in cases] - - gwl = lambda lang: self.get_wordlist(utf8(lang)) - self.wordlists = {l: gwl(l) for l in list(self.langs.keys())} - - - def test_all_langs(self): - - ret, all_langs = bip39_get_languages() - self.assertEqual(ret, 0) - all_langs = all_langs.split() - - for lang in all_langs: - self.assertTrue(lang in self.langs) - - self.assertEqual(len(all_langs), len(list(self.langs.keys()))) - - - def test_bip39_wordlists(self): - - for lang, wl in self.wordlists.items(): - self.assertIsNotNone(wl) - - def_wl = self.get_wordlist(None) - en_wl = self.wordlists['en'] - self.assertEqual(def_wl.value, en_wl.value) - - - def test_all_lookups(self): - - for lang in list(self.langs.keys()): - wl = self.wordlists[lang] - words_list, _ = load_words(self.langs[lang]) - for i in range(2048): - ret, word = bip39_get_word(wl, i) - word = word.encode('utf-8') - self.assertEqual(ret, 0) - self.assertEqual(word, utf8(words_list[i])) - if wordlist_lookup_word is not None: - idx = wordlist_lookup_word(wl, word) - self.assertEqual(i, idx - 1) - - self.assertEqual(bip39_get_word(wl, 2048), (WALLY_EINVAL, None)) - - - def test_bip39_vectors(self): - """Test conversion to and from the BIP39 specification vectors""" - wl = self.get_wordlist(None) - - for case in self.cases: - hex_input, mnemonic = case[0], case[1] - buf, buf_len = make_cbuffer(hex_input) - - ret, result = bip39_mnemonic_from_bytes(wl, buf, buf_len) - self.assertEqual(ret, 0) - result = utf8(result) - self.assertEqual(result, mnemonic) - self.assertEqual(bip39_mnemonic_validate(wl, mnemonic), 0) - - out_buf = create_string_buffer(buf_len) - ret, rlen = bip39_mnemonic_to_bytes(wl, result, out_buf, buf_len) - self.assertEqual(ret, 0) - self.assertEqual(rlen, buf_len) - self.assertEqual(buf, out_buf.raw) - - - def test_288(self): - """ Test a 288 bit (27 word) mnemonic phrase """ - mnemonic = 'panel jaguar rib echo witness mean please festival ' \ - 'issue item notable divorce conduct page tourist ' \ - 'west off salmon ghost grit kitten pull marine toss ' \ - 'dirt oak gloom' - self.assertEqual(bip39_mnemonic_validate(None, utf8(mnemonic)), 0) - - out_buf = create_string_buffer(36) - ret, rlen = bip39_mnemonic_to_bytes(None, utf8(mnemonic), out_buf, 36) - self.assertEqual(ret, 0) - self.assertEqual(rlen, 36) - expected = '9F8EE6E3A2FFCB13A99AA976AEDA5A2002ED' \ - '3DF97FCB9957CD863357B55AA2072D3EB2F9' - self.assertEqual(h(out_buf).upper(), utf8(expected)) - - - def test_mnemonic_to_seed(self): - - for case in self.cases: - mnemonic, seed = case[1], case[2] - - buf = create_string_buffer(64) - ret, count = bip39_mnemonic_to_seed(mnemonic, b'TREZOR', buf, 64) - self.assertEqual(ret, 0) - self.assertEqual(count, 64) - self.assertEqual(h(buf), seed) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_hash.py b/external/libwally-core/src/test/test_hash.py deleted file mode 100755 index 9f511bf30..000000000 --- a/external/libwally-core/src/test/test_hash.py +++ /dev/null @@ -1,112 +0,0 @@ -import unittest -from util import * -from ctypes import create_string_buffer - -# NIST cases from http://www.di-mgt.com.au/sha_testvectors.html -# SHA-256d vectors from https://www.dlitz.net/crypto/shad256-test-vectors/SHAd256_Test_Vectors.txt -sha2_cases = { - 'abc': - ['ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad', - 'ddaf35a193617aba cc417349ae204131 12e6fa4e89a97ea2 0a9eeee64b55d39a' - '2192992a274fc1a8 36ba3c23a3feebbd 454d4423643ce80e 2a9ac94fa54ca49f', - '4f8b42c22dd3729b519ba6f68d2da7cc5b2d606d05daed5ad5128cc03e6c6358'], - - '': - ['e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855', - 'cf83e1357eefb8bd f1542850d66d8007 d620e4050b5715dc 83f4a921d36ce9ce' - '47d0d13c5d85f2b0 ff8318d2877eec2f 63b931bd47417a81 a538327af927da3e', - '5df6e0e2761359d30a8275058e299fcc0381534545f55cf43e41983f5d4c9456' ], - - 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq': - ['248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1', - '204a8fc6dda82f0a 0ced7beb8e08a416 57c16ef468b228a8 279be331a703c335' - '96fd15c13b1b07f9 aa1d3bea57789ca0 31ad85c7a71dd703 54ec631238ca3445', - '0cffe17f68954dac3a84fb1458bd5ec99209449749b2b308b7cb55812f9563af'], - - 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn' - 'hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu': - ['cf5b16a7 78af8380 036ce59e 7b049237 0b249b11 e8f07a51 afac4503 7afee9d1', - '8e959b75dae313da 8cf4f72814fc143f 8f7779c6eb9f7fa1 7299aeadb6889018' - '501d289e4900f7e4 331b99dec4b5433a c7d329eeb6dd2654 5e96e55b874be909', - None], - - 'a' * 1000000: - ['cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0', - 'e718483d0ce76964 4e2e42c7bc15b463 8e1f98b13b204428 5632a803afa973eb' - 'de0ff244877ea60a 4cb0432ce577c31b eb009c5c2c49aa2e 4eadb217ad8cc09b', - '80d1189477563e1b5206b2749f1afe4807e5705e8bd77887a60187a712156688'], -} - -hash160_cases = [ - # https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses - [ '0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B235' - '22CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6', - '010966776006953D5567439E5E39F86A0D273BEE' ], - # Randomly generated cases from https://gobittest.appspot.com/Address - [ '045B3B9D153DDB9A9630C7C4F00A56212A3FCAD062E8014C3E95BF9DDBD651B37' - 'FFC78E532BC15096F1BAF889B503228324485CCF02BA954F431D4B5BAE731070D', - '5CE3425A868F365E06272EA5472D344CC8D14E56' ], - [ '048DED2821E449EA2AD863A35972A97120074EF6A73C0D5DF97BF20538EF173EC' - '33E75210F7B5977BDD2939850B3EA3791049C83DF4F66296F935FDF38BD80C2AC', - 'AFF2B47861A205E3AB67B2042C3F44F1C9283868' ], - [ '042125CC51DD979091CBA34E71A4B419708267566E72F68EB5891F70E90774A34' - '171C1C95F54DE84BC11CBC0E6BD4792D5C17C5C3A26F99A9D136AADB66463AD58', - '53190BD5877616554E72253D4CDD2D37E1AA0D73' ], -] - -class HashTests(unittest.TestCase): - - SHA256_LEN, SHA512_LEN, HASH160_LEN = 32, 64, 20 - - def make_outbuf(self, fn, aligned=True): - buf_len = self.SHA256_LEN - if fn == wally_sha512: - buf_len = self.SHA512_LEN - elif fn == wally_hash160: - buf_len = self.HASH160_LEN - offset = 0 if aligned else 1 - buf = create_string_buffer(buf_len + offset) - return byref(buf, offset), buf_len - - - def do_hash(self, fn, hex_in, aligned=True): - buf, buf_len = self.make_outbuf(fn, aligned) - in_bytes, in_bytes_len = make_cbuffer(hex_in) - ret = fn(in_bytes, in_bytes_len, buf, buf_len) - self.assertEqual(ret, WALLY_OK) - ret, result = wally_hex_from_bytes(buf, buf_len) - self.assertEqual(ret, WALLY_OK) - return utf8(result) - - - def test_sha_vectors(self): - for in_msg, values in sha2_cases.items(): - msg = h(utf8(in_msg)) - for i, fn in enumerate([wally_sha256, wally_sha512, wally_sha256d]): - if values[i] is not None: - for aligned in [True, False]: - result = self.do_hash(fn, msg, aligned) - expected = utf8(values[i].replace(' ', '')) - self.assertEqual(result, expected) - - - def test_hash160_vectors(self): - for msg, expected in hash160_cases: - for aligned in [True, False]: - result = self.do_hash(wally_hash160, utf8(msg), aligned) - self.assertEqual(result, utf8(expected.lower())) - - - def test_invalid_args(self): - in_bytes, in_bytes_len = make_cbuffer(h(utf8('abc'))) - for fn in [wally_sha256, wally_sha512, wally_sha256d, wally_hash160]: - buf, buf_len = self.make_outbuf(fn) - for args in [(None, in_bytes_len, buf, buf_len), - (in_bytes, in_bytes_len, None, buf_len), - (in_bytes, in_bytes_len, buf, buf_len + 1)]: - self.assertEqual(fn(args[0], args[1], args[2], args[3]), - WALLY_EINVAL) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_hex.py b/external/libwally-core/src/test/test_hex.py deleted file mode 100755 index 79d54183e..000000000 --- a/external/libwally-core/src/test/test_hex.py +++ /dev/null @@ -1,52 +0,0 @@ -import unittest -from util import * - -class HexTests(unittest.TestCase): - - def test_hex_to_bytes(self): - LEN = 4 - buf, buf_len = make_cbuffer('00' * LEN) - - for i in range(256): - for s in ("%02X" % i, "%02x" % i): # Upper/Lower - ret, written = wally_hex_to_bytes(utf8(s * LEN), buf, buf_len) - self.assertEqual((ret, written), (WALLY_OK, LEN)) - - # Bad inputs - for (s, b, l) in [(None, buf, buf_len), - (utf8('00'), None, buf_len), - (utf8('000'), buf, buf_len), - (utf8('00'), buf, 0)]: - ret, written = wally_hex_to_bytes(s, b, l) - self.assertEqual((ret, written), (WALLY_EINVAL, 0)) - - for l in (1, # Too small, returns the required length - LEN): # Too large, returns length written - ret, written = wally_hex_to_bytes(utf8('0000'), buf, l) - self.assertEqual((ret, written), (WALLY_OK, 2)) - - # Empty string - ret, written = wally_hex_to_bytes(utf8(''), buf, buf_len) - self.assertEqual((ret, written), (WALLY_OK, 0)) - - - def test_hex_from_bytes(self): - LEN = 4 - - for i in range(256): - s = "%02x" % i * LEN - buf, buf_len = make_cbuffer(s) - ret, retstr = wally_hex_from_bytes(buf, buf_len) - self.assertEqual((ret, retstr), (WALLY_OK, s)) - - # Bad input - ret, written = wally_hex_from_bytes(None, buf_len) - self.assertEqual((ret, written), (WALLY_EINVAL, None)) - - # Empty buffer - ret, written = wally_hex_from_bytes(buf, 0) - self.assertEqual((ret, written), (WALLY_OK, '')) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_hmac.py b/external/libwally-core/src/test/test_hmac.py deleted file mode 100755 index 31fe932d8..000000000 --- a/external/libwally-core/src/test/test_hmac.py +++ /dev/null @@ -1,95 +0,0 @@ -import unittest -from util import * -from ctypes import create_string_buffer - -# HMAC vectors from https://tools.ietf.org/html/rfc4231 -hmac_cases = [ - ['0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', '4869205468657265', - - 'b0344c61d8db38535ca8afceaf0bf12b 881dc200c9833da726e9376c2e32cff7', - '87aa7cdea5ef619d4ff0b4241a1d6cb0 2379f4e2ce4ec2787ad0b30545e17cde' - 'daa833b7d6b8a702038b274eaea3f4e4 be9d914eeb61f1702e696c203a126854'], - - ['4a656665', '7768617420646f2079612077616e7420666f72206e6f7468696e673f', - - '5bdcc146bf60754e6a042426089575c7 5a003f089d2739839dec58b964ec3843', - '164b7a7bfcf819e2e395fbe73b56e0a3 87bd64222e831fd610270cd7ea250554' - '9758bf75c05a994a6d034f65f8f0e6fd caeab1a34d4a6b4b636e070a38bce737'], - - ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd' - 'dddddddddddddddddddddddddddddddddddd', - - '773ea91e36800e46854db8ebd09181a7 2959098b3ef8c122d9635514ced565fe', - 'fa73b0089d56a284efb0f0756c890be9 b1b5dbdd8ee81a3655f83e33b2279d39' - 'bf3e848279a722c806b485a47e67c807 b946a337bee8942674278859e13292fb'], - - ['0102030405060708090a0b0c0d0e0f10111213141516171819', - 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' - 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd', - - '82558a389a443c0ea4cc819899f2083a 85f0faa3e578f8077a2e3ff46729665b', - 'b0ba465637458c6990e5a8c5f61d4af7 e576d97ff94b872de76f8050361ee3db' - 'a91ca5c11aa25eb4d679275cc5788063 a5f19741120c4f2de2adebeb10a298dd'], - - ['0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', - '546573742057697468205472756e636174696f6e', - - 'a3b6167473100ee06e0c796c2955552b', - '415fad6271580a531d4179bc891d87a6'], - - ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - 'aaaaaa', - '54657374205573696e67204c6172676572205468616e20426c6f636b2d53697a' - '65204b6579202d2048617368204b6579204669727374', - - '60e431591ee0b67f0d8a26aacbf5b77f 8e0bc6213728c5140546040f0ee37f54', - '80b24263c7c1a3ebb71493c1dd7be8b4 9b46d1f41b4aeec1121b013783f8f352' - '6b56d037e05f2598bd0fd2215d6a1e52 95e64f73f63f0aec8b915a985d786598'], - - ['aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' - 'aaaaaa', - '5468697320697320612074657374207573696e672061206c6172676572207468' - '616e20626c6f636b2d73697a65206b657920616e642061206c61726765722074' - '68616e20626c6f636b2d73697a6520646174612e20546865206b6579206e6565' - '647320746f20626520686173686564206265666f7265206265696e6720757365' - '642062792074686520484d414320616c676f726974686d2e', - - '9b09ffa71b942fcb27635fbcd5b0e944 bfdc63644f0713938a7f51535c3a35e2', - 'e37b6a775dc87dbaa4dfa9f96e5e3ffd debd71f8867289865df5a32d20cdc944' - 'b6022cac3c4982b10d5eeb55c3e4de15 134676fb6de0446065c97440fa8c6a58'] -] - -class HMACTests(unittest.TestCase): - - def doHMAC(self, fn, key_in, msg_in): - key, key_len = make_cbuffer(key_in) - msg, msg_len = make_cbuffer(msg_in) - buf_len = 64 if fn == wally_hmac_sha512 else 32 - buf = create_string_buffer(buf_len) - ret = fn(key, key_len, msg, msg_len, buf, buf_len) - return ret, h(buf) - - - def test_vectors(self): - - for test in hmac_cases: - k, msg = test[0], test[1] - for fn, expected in [(wally_hmac_sha256, test[2]), - (wally_hmac_sha512, test[3])]: - ret, result = self.doHMAC(fn, k, msg) - self.assertEqual(ret, 0) - expected = utf8(expected.replace(' ', '')) - # Note we truncate the result as one of the test vectors has - # a truncated result in the RFC - self.assertEqual(result[0:len(expected)], expected) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_mnemonic.py b/external/libwally-core/src/test/test_mnemonic.py deleted file mode 100755 index 637b24bc3..000000000 --- a/external/libwally-core/src/test/test_mnemonic.py +++ /dev/null @@ -1,36 +0,0 @@ -import unittest -from util import * - -class MnemonicTests(unittest.TestCase): - - words_list, wl = None, None - - def setUp(self): - if self.wl is None and wordlist_init is not None: - self.words_list, words = load_words('english') - self.wl = wordlist_init(utf8(words)) - - - @internal_only() - def test_mnemonic(self): - - LEN = 16 - PHRASES = LEN * 8 // 11 # 11 bits per phrase - PHRASES_BYTES = (PHRASES * 11 + 7) // 8 # Bytes needed to store - self.assertEqual(LEN, PHRASES_BYTES) - - buf = create_string_buffer(LEN) - - # Test round tripping - for i in range(len(self.words_list) - PHRASES): - phrase = utf8(' '.join(self.words_list[i : i + PHRASES])) - - ret, written = mnemonic_to_bytes(self.wl, phrase, buf, LEN) - self.assertEqual(ret, 0) - self.assertEqual(written, PHRASES_BYTES) - generated = mnemonic_from_bytes(self.wl, buf, LEN) - self.assertEqual(phrase, generated) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_pbkdf2.py b/external/libwally-core/src/test/test_pbkdf2.py deleted file mode 100755 index a20f01a9d..000000000 --- a/external/libwally-core/src/test/test_pbkdf2.py +++ /dev/null @@ -1,91 +0,0 @@ -import unittest -from util import * -from binascii import unhexlify - -PBKDF2_HMAC_SHA256_LEN, PBKDF2_HMAC_SHA512_LEN = 32, 64 -FLAG_BLOCK_RESERVED = 0x1 - -class PBKDF2Case(object): - def __init__(self, items): - # Format: HMAC_SHA_TYPE, PASSWORD, SALT, COST, EXPECTED - self.typ = int(items[0]) - assert self.typ in [256, 512] - self.passwd = unhexlify(items[1]) - self.salt = items[2] - self.cost = int(items[3]) - self.expected, self.expected_len = make_cbuffer(items[4]) - - -class PBKDF2Tests(unittest.TestCase): - - def setUp(self): - if not hasattr(self, 'wally_pbkdf2_hmac_sha256'): - self.cases = [] - with open(root_dir + 'src/data/pbkdf2_hmac_sha_vectors.txt', 'r') as f: - for l in f.readlines(): - l = l.strip() - if len(l) == 0 or l.startswith('#'): - continue - self.cases.append(PBKDF2Case(l.split(','))) - - - def test_pbkdf2_hmac_sha(self): - - # Some test vectors are nuts (e.g. 2097152 cost), so only run the - # first few. set these to -1 to run the whole suite (only needed - # when refactoring the impl) - num_crazy_256, num_crazy_512 = 8, 8 - - for case in self.cases: - - if case.typ == 256: - fn = wally_pbkdf2_hmac_sha256 - mult = PBKDF2_HMAC_SHA256_LEN - if case.cost > 100: - if num_crazy_256 == 0: - continue - num_crazy_256 -= 1 - else: - fn = wally_pbkdf2_hmac_sha512 - mult = PBKDF2_HMAC_SHA512_LEN - if case.cost > 100: - if num_crazy_512 == 0: - continue - num_crazy_512 -= 1 - - out_buf, out_len = make_cbuffer('00' * case.expected_len) - if case.expected_len % mult != 0: - # We only support output multiples of the hmac length - continue - - # Test both providing extra bytes and having them allocated for us - for flags in [0, FLAG_BLOCK_RESERVED]: - extra_bytes = '00000000' if flags else '' - salt, salt_len = make_cbuffer(case.salt + extra_bytes) - - ret = fn(case.passwd, len(case.passwd), salt, salt_len, - flags, case.cost, out_buf, out_len) - - self.assertEqual(ret, 0) - self.assertEqual(h(out_buf), h(case.expected)) - - - def _pbkdf2_hmac_sha_malloc_fail(self, fn, len): - fake_buf, fake_len = make_cbuffer('aabbccdd') - out_buf, out_len = make_cbuffer('00' * len) - ret = fn(fake_buf, fake_len, fake_buf, fake_len, 0, 1, out_buf, out_len) - self.assertEqual(ret, WALLY_ENOMEM) - - - @malloc_fail([1]) - def test_pbkdf2_hmac_sha256_malloc(self): - self._pbkdf2_hmac_sha_malloc_fail(wally_pbkdf2_hmac_sha256, PBKDF2_HMAC_SHA256_LEN) - - - @malloc_fail([1]) - def test_pbkdf2_hmac_sha512_malloc(self): - self._pbkdf2_hmac_sha_malloc_fail(wally_pbkdf2_hmac_sha512, PBKDF2_HMAC_SHA512_LEN) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_scrypt.py b/external/libwally-core/src/test/test_scrypt.py deleted file mode 100755 index 1c065d6d2..000000000 --- a/external/libwally-core/src/test/test_scrypt.py +++ /dev/null @@ -1,55 +0,0 @@ -import unittest -from util import * - -# Test cases from -# https://tools.ietf.org/html/draft-josefsson-scrypt-kdf-04 -cases = [ - ["", "", - 16, 1, 1, 64, - '77 d6 57 62 38 65 7b 20 3b 19 ca 42 c1 8a 04 97' - 'f1 6b 48 44 e3 07 4a e8 df df fa 3f ed e2 14 42' - 'fc d0 06 9d ed 09 48 f8 32 6a 75 3a 0f c8 1f 17' - 'e8 d3 e0 fb 2e 0d 36 28 cf 35 e2 0c 38 d1 89 06'], - - ['password', 'NaCl', - 1024, 8, 16, 64, - 'fd ba be 1c 9d 34 72 00 78 56 e7 19 0d 01 e9 fe' - '7c 6a d7 cb c8 23 78 30 e7 73 76 63 4b 37 31 62' - '2e af 30 d9 2e 22 a3 88 6f f1 09 27 9d 98 30 da' - 'c7 27 af b9 4a 83 ee 6d 83 60 cb df a2 cc 06 40'], - - ['pleaseletmein', 'SodiumChloride', - 16384, 8, 1, 64, - '70 23 bd cb 3a fd 73 48 46 1c 06 cd 81 fd 38 eb' - 'fd a8 fb ba 90 4f 8e 3e a9 b5 43 f6 54 5d a1 f2' - 'd5 43 29 55 61 3f 0f cf 62 d4 97 05 24 2a 9a f9' - 'e6 1e 85 dc 0d 65 1e 40 df cf 01 7b 45 57 58 87'], - - ['pleaseletmein', 'SodiumChloride', - 1048576, 8, 1, 64, - '21 01 cb 9b 6a 51 1a ae ad db be 09 cf 70 f8 81' - 'ec 56 8d 57 4a 2f fd 4d ab e5 ee 98 20 ad aa 47' - '8e 56 fd 8f 4b a5 d0 9f fa 1c 6d 92 7c 40 f4 c3' - '37 30 40 49 e8 a9 52 fb cb f4 5c 6f a7 7a 41 a4'] -] - -class ScryptTests(unittest.TestCase): - - def test_scrypt(self): - - for c in cases: - passwd, salt, cost, block, parallel, length, expected = c - passwd = utf8(passwd) - salt = utf8(salt) - expected = expected.replace(' ', '') - assert len(expected) == length * 2 - out_buf, out_len = make_cbuffer('0' * len(expected)) - - ret = wally_scrypt(passwd, len(passwd), salt, len(salt), - cost, block, parallel, out_buf, out_len) - self.assertEqual(ret, 0) - self.assertEqual(h(out_buf), utf8(expected)) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_sign.py b/external/libwally-core/src/test/test_sign.py deleted file mode 100755 index 42836b002..000000000 --- a/external/libwally-core/src/test/test_sign.py +++ /dev/null @@ -1,183 +0,0 @@ -import unittest -from util import * -from hashlib import sha256 - -FLAG_ECDSA, FLAG_SCHNORR = 1, 2 -EX_PRIV_KEY_LEN, EC_PUBIC_KEY_LEN, EC_PUBIC_KEY_UNCOMPRESSED_LEN = 32, 33, 65 -EC_SIGNATURE_LEN, EC_SIGNATURE_DER_MAX_LEN = 64, 72 -BITCOIN_MESSAGE_HASH_FLAG = 1 - -class SignTests(unittest.TestCase): - - def get_sign_cases(self): - lines = [] - with open(root_dir + 'src/data/ecdsa_secp256k1_vectors.txt', 'r') as f: - for l in f.readlines(): - if len(l.strip()) and not l.startswith('#'): - lines.append(self.cbufferize(l.strip().split(','))) - return lines - - def cbufferize(self, values): - conv = lambda v: make_cbuffer(v)[0] if type(v) is str else v - return [conv(v) for v in values] - - def sign(self, priv_key, msg, flags, out_buf, out_len=None): - blen = lambda b: 0 if b is None else len(b) - if out_len is None: - out_len = blen(out_buf) - return wally_ec_sig_from_bytes(priv_key, blen(priv_key), - msg, blen(msg), flags, out_buf, out_len) - - - def test_sign_and_verify(self): - sig, sig2 = self.cbufferize(['00' * EC_SIGNATURE_LEN] * 2) - der, der_len = make_cbuffer('00' * EC_SIGNATURE_DER_MAX_LEN) - - for case in self.get_sign_cases(): - priv_key, msg, nonce, r, s = case - - if wally_ec_private_key_verify(priv_key, len(priv_key)) != WALLY_OK: - # Some test vectors have invalid private keys which other - # libraries allow. secp fails these keys so don't test them. - continue - - # Sign - set_fake_ec_nonce(nonce) - ret = self.sign(priv_key, msg, FLAG_ECDSA, sig) - self.assertEqual(ret, WALLY_OK) - self.assertEqual(h(r), h(sig[0:32])) - self.assertEqual(h(s), h(sig[32:64])) - - # Check signature conversions - ret, written = wally_ec_sig_to_der(sig, len(sig), der, der_len) - self.assertEqual(ret, WALLY_OK) - ret = wally_ec_sig_from_der(der, written, sig2, len(sig2)) - self.assertEqual((ret, h(sig)), (WALLY_OK, h(sig2))) - ret = wally_ec_sig_normalize(sig2, len(sig2), sig, len(sig)) - self.assertEqual((ret, h(sig)), (WALLY_OK, h(sig2))) # All sigs low-s - - # Verify - pub_key, _ = make_cbuffer('00' * 33) - ret = wally_ec_public_key_from_private_key(priv_key, len(priv_key), - pub_key, len(pub_key)) - self.assertEqual(ret, WALLY_OK) - ret = wally_ec_sig_verify(pub_key, len(pub_key), msg, len(msg), - FLAG_ECDSA, sig, len(sig)) - self.assertEqual(ret, WALLY_OK) - - - set_fake_ec_nonce(None) - - - def test_invalid_inputs(self): - out_buf, out_len = make_cbuffer('00' * EC_SIGNATURE_LEN) - - priv_key, msg = self.cbufferize(['11' * 32, '22' * 32]) - priv_bad, msg_bad = self.cbufferize(['FF' * 32, '22' * 33]) - FLAGS_BOTH = FLAG_ECDSA | FLAG_SCHNORR - - # Signing - cases = [(None, msg, FLAG_ECDSA), # Null priv_key - (('11' * 33), msg, FLAG_ECDSA), # Wrong priv_key len - (priv_bad, msg, FLAG_ECDSA), # Bad private key - (priv_key, None, FLAG_ECDSA), # Null message - (priv_key, msg_bad, FLAG_ECDSA), # Wrong message len - (priv_key, msg, 0), # No flags set - (priv_key, msg, FLAGS_BOTH), # Mutually exclusive - (priv_key, msg, 0x4)] # Unknown flag - - for priv_key, msg, flags in cases: - ret = self.sign(priv_key, msg, flags, out_buf) - self.assertEqual(ret, WALLY_EINVAL) - - for o, o_len in [(None, 32), (out_buf, -1)]: # Null out, Wrong out len - ret = self.sign(priv_key, msg, FLAG_ECDSA, o, o_len) - self.assertEqual(ret, WALLY_EINVAL) - - # wally_ec_private_key_verify - for pk, pk_len in [(None, len(priv_key)), # Null priv_key - (priv_key, 10), # Wrong priv_key len - (priv_bad, len(priv_key))]: # Bad private key - self.assertEqual(wally_ec_private_key_verify(pk, pk_len), WALLY_EINVAL) - - # wally_ec_public_key_decompress - sig, _ = make_cbuffer('13' * EC_SIGNATURE_LEN) - out_buf, out_len = make_cbuffer('00' * EC_PUBIC_KEY_UNCOMPRESSED_LEN) - - cases = [(None, len(sig), out_buf, out_len), # Null sig - (sig, 15, out_buf, out_len), # Wrong sig len - (sig, len(sig), None, out_len), # Null out - (sig, len(sig), out_buf, 15)] # Wrong out len - - for s, s_len, o, o_len in cases: - ret, written = wally_ec_sig_to_der(s, s_len, o, o_len) - self.assertEqual((ret, written), (WALLY_EINVAL, 0)) - - # wally_ec_sig_to_der - sig, _ = make_cbuffer('13' * EC_SIGNATURE_LEN) - out_buf, out_len = make_cbuffer('00' * EC_SIGNATURE_DER_MAX_LEN) - - cases = [(None, len(sig), out_buf, out_len), # Null sig - (sig, 15, out_buf, out_len), # Wrong sig len - (sig, len(sig), None, out_len), # Null out - (sig, len(sig), out_buf, 15)] # Wrong out len - - for s, s_len, o, o_len in cases: - ret, written = wally_ec_sig_to_der(s, s_len, o, o_len) - self.assertEqual((ret, written), (WALLY_EINVAL, 0)) - - # wally_ec_public_key_from_private_key - out_buf, out_len = make_cbuffer('00' * EC_PUBIC_KEY_LEN) - cases = [(None, len(priv_key), out_buf, len(out_buf)), # Null priv_key - (priv_key, 10, out_buf, len(out_buf)), # Wrong priv_key len - (priv_bad, len(priv_key), out_buf, len(out_buf)), # Bad private key - (priv_key, len(priv_key), None, len(out_buf)), # Null out - (priv_key, len(priv_key), out_buf, 10)] # Wrong out len - - for pk, pk_len, o, o_len in cases: - ret = wally_ec_public_key_from_private_key(pk, pk_len, o, o_len); - self.assertEqual(ret, WALLY_EINVAL) - - - def test_format_message(self): - PREFIX, MAX_LEN = b'\x18Bitcoin Signed Message:\n', 64 * 1024 - 64 - out_buf, out_len = make_cbuffer('00' * 64 * 1024) - cases = [(b'a', b'\x01'), - (b'aaa', b'\x03'), - (b'a' * 252, b'\xfc'), - (b'a' * 253, b'\xfd\xfd\x00'), - (b'a' * 254, b'\xfd\xfe\x00'), - (b'a' * 255, b'\xfd\xff\x00'), - (b'a' * 256, b'\xfd\x00\x01'), - (b'a' * 257, b'\xfd\x01\x01'), - (b'a' * MAX_LEN, b'\xfd\xc0\xff')] - for msg, varint, in cases: - fn = lambda flags, ol: wally_format_bitcoin_message(msg, len(msg), flags, - out_buf, ol) - for flags in (0, BITCOIN_MESSAGE_HASH_FLAG): - expected = PREFIX + varint + msg - if flags: - expected = sha256(sha256(expected).digest()).digest() - - ret, written = fn(flags, out_len) - self.assertEqual((ret, written), (WALLY_OK, len(expected))) - self.assertEqual(out_buf[:written], expected) - - ret, written = fn(flags, 1) # Short length - self.assertEqual((ret, written), (WALLY_OK, len(expected))) - - - # Invalid cases - msg = 'a' - cases = [(None, len(msg), 0, out_buf, out_len), # Null message - (msg, 0, 0, out_buf, out_len), # Zero length message - (msg, MAX_LEN + 1, 0, out_buf, out_len), # Message too large - (msg, len(msg), 2, out_buf, out_len), # Bad flags - (msg, len(msg), 0, None, out_len)] # Null output - for msg, msg_len, flags, o, o_len in cases: - ret, written = wally_format_bitcoin_message(msg, msg_len, flags, o, o_len) - self.assertEqual(ret, WALLY_EINVAL) - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/test_wordlist.py b/external/libwally-core/src/test/test_wordlist.py deleted file mode 100755 index 9263ab745..000000000 --- a/external/libwally-core/src/test/test_wordlist.py +++ /dev/null @@ -1,54 +0,0 @@ -import unittest -from util import * - -class Wordlist: - - def __init__(self, words): - - self.wl = wordlist_init(utf8(words)) - self.lookup_word = lambda w: wordlist_lookup_word(self.wl, w) - self.lookup_index = lambda i: wordlist_lookup_index(self.wl, i) - - def free(self): - if self.is_valid(): - wordlist_free(self.wl) - self.wl = None - - def is_valid(self): - return self.wl is not None - - - -class WordlistTests(unittest.TestCase): - - words_list = None - - def setUp(self): - if self.words_list is None and wordlist_init is not None: - self.words_list, _ = load_words('english') - - @internal_only() - def test_wordlist(self): - - for n in range(17): - # Build a wordlist of n words - test_list = self.words_list[0 : n] - - wl = Wordlist(' '.join(test_list)) - self.assertTrue(wl.is_valid()) - - for idx, word in enumerate(test_list): - w = utf8(word) - # Verify lookup by word and index - self.assertEqual(idx + 1, wl.lookup_word(w)) - check_word = utf8(self.words_list[n + 1]) - self.assertEqual(wl.lookup_word(check_word), 0) - self.assertEqual(wl.lookup_index(idx), w) - # Lookup of a non-present word - self.assertIsNone(wl.lookup_index(n + 1)) - - wl.free() - - -if __name__ == '__main__': - unittest.main() diff --git a/external/libwally-core/src/test/util.py b/external/libwally-core/src/test/util.py deleted file mode 100755 index f04b9bcb7..000000000 --- a/external/libwally-core/src/test/util.py +++ /dev/null @@ -1,224 +0,0 @@ -from ctypes import * -from binascii import hexlify, unhexlify -from os.path import isfile -from os import urandom -import platform -import sys - -# Allow to run from any sub dir -SO_EXT = 'dylib' if platform.system() == 'Darwin' else 'so' -for depth in [0, 1, 2]: - root_dir = '../' * depth - if isfile(root_dir + 'src/.libs/libwallycore.' + SO_EXT): - break - -libwally = CDLL(root_dir + 'src/.libs/libwallycore.' + SO_EXT) - -wally_free_string = libwally.wally_free_string -wally_free_string.restype, wally_free_string.argtypes = None, [c_char_p] - -WALLY_OK, WALLY_ERROR, WALLY_EINVAL, WALLY_ENOMEM = 0, -1, -2, -3 - -_malloc_fn_t = CFUNCTYPE(c_void_p, c_ulong) -_ec_nonce_fn_t = CFUNCTYPE(c_int, c_void_p, c_void_p, c_void_p, c_void_p, c_void_p, c_uint) - -class operations(Structure): - _fields_ = [('malloc_fn', _malloc_fn_t), - ('free_fn', c_void_p), - ('ec_nonce_fn', _ec_nonce_fn_t)] - -class ext_key(Structure): - _fields_ = [('chain_code', c_ubyte * 32), - ('parent160', c_ubyte * 20), - ('depth', c_ubyte), - ('pad1', c_ubyte * 10), - ('priv_key', c_ubyte * 33), - ('child_num', c_uint), - ('hash160', c_ubyte * 20), - ('version', c_uint), - ('pad2', c_ubyte * 3), - ('pub_key', c_ubyte * 33)] - -# Sentinel classes for returning output parameters -class c_char_p_p_class(object): - pass -c_char_p_p = c_char_p_p_class() -class c_ulong_p_class(object): - pass -c_ulong_p = c_ulong_p_class() - -# ctypes is missing this for some reason -c_uint_p = POINTER(c_uint) - -for f in ( - ('wordlist_init', c_void_p, [c_char_p]), - ('wordlist_lookup_word', c_ulong, [c_void_p, c_char_p]), - ('wordlist_lookup_index', c_char_p, [c_void_p, c_ulong]), - ('wordlist_free', None, [c_void_p]), - ('mnemonic_from_bytes', c_char_p, [c_void_p, c_void_p, c_ulong]), - ('mnemonic_to_bytes', c_int, [c_void_p, c_char_p, c_void_p, c_ulong, c_ulong_p]), - ('wally_base58_from_bytes', c_int, [c_void_p, c_ulong, c_uint, c_char_p_p]), - ('wally_base58_get_length', c_int, [c_char_p, c_ulong_p]), - ('wally_base58_to_bytes', c_int, [c_char_p, c_uint, c_void_p, c_ulong, c_ulong_p]), - ('bip32_key_free', c_int, [POINTER(ext_key)]), - ('bip32_key_from_seed', c_int, [c_void_p, c_ulong, c_uint, c_uint, POINTER(ext_key)]), - ('bip32_key_serialize', c_int, [POINTER(ext_key), c_uint, c_void_p, c_ulong]), - ('bip32_key_unserialize', c_int, [c_void_p, c_uint, POINTER(ext_key)]), - ('bip32_key_from_parent', c_int, [c_void_p, c_uint, c_uint, POINTER(ext_key)]), - ('bip32_key_from_parent_path', c_int, [c_void_p, c_uint_p, c_ulong, c_uint, POINTER(ext_key)]), - ('bip38_raw_from_private_key', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_void_p, c_ulong]), - ('bip38_from_private_key', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_char_p_p]), - ('bip38_to_private_key', c_int, [c_char_p, c_void_p, c_ulong, c_uint, c_void_p, c_ulong]), - ('bip38_raw_to_private_key', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_void_p, c_ulong]), - ('bip39_get_languages', c_int, [c_char_p_p]), - ('bip39_get_wordlist', c_int, [c_char_p, POINTER(c_void_p)]), - ('bip39_get_word', c_int, [c_void_p, c_ulong, c_char_p_p]), - ('bip39_mnemonic_from_bytes', c_int, [c_void_p, c_void_p, c_ulong, c_char_p_p]), - ('bip39_mnemonic_to_bytes', c_int, [c_void_p, c_char_p, c_void_p, c_ulong, c_ulong_p]), - ('bip39_mnemonic_validate', c_int, [c_void_p, c_char_p]), - ('bip39_mnemonic_to_seed', c_int, [c_char_p, c_char_p, c_void_p, c_ulong, c_ulong_p]), - ('wally_sha256', c_int, [c_void_p, c_ulong, c_void_p, c_ulong]), - ('wally_sha256d', c_int, [c_void_p, c_ulong, c_void_p, c_ulong]), - ('wally_sha512', c_int, [c_void_p, c_ulong, c_void_p, c_ulong]), - ('wally_hash160', c_int, [c_void_p, c_ulong, c_void_p, c_ulong]), - ('wally_hex_from_bytes', c_int, [c_void_p, c_ulong, c_char_p_p]), - ('wally_hex_to_bytes', c_int, [c_char_p, c_void_p, c_ulong, c_ulong_p]), - ('wally_hmac_sha256', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_void_p]), - ('wally_hmac_sha512', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_void_p]), - ('wally_aes', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_void_p, c_ulong]), - ('wally_aes_cbc', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_void_p, c_ulong, c_ulong_p]), - ('wally_pbkdf2_hmac_sha256', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_ulong, c_void_p, c_ulong]), - ('wally_pbkdf2_hmac_sha512', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_ulong, c_void_p, c_ulong]), - ('wally_scrypt', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_uint, c_uint, c_void_p, c_ulong]), - ('wally_secp_randomize', c_int, [c_void_p, c_ulong]), - ('wally_ec_private_key_verify', c_int, [c_void_p, c_ulong]), - ('wally_ec_public_key_decompress', c_int, [c_void_p, c_ulong, c_void_p, c_ulong]), - ('wally_ec_public_key_from_private_key', c_int, [c_void_p, c_ulong, c_void_p, c_ulong]), - ('wally_ec_sig_from_bytes', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_void_p, c_ulong]), - ('wally_ec_sig_from_der', c_int, [c_void_p, c_ulong, c_void_p, c_ulong]), - ('wally_ec_sig_normalize', c_int, [c_void_p, c_ulong, c_void_p, c_ulong]), - ('wally_ec_sig_to_der', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_ulong_p]), - ('wally_ec_sig_verify', c_int, [c_void_p, c_ulong, c_void_p, c_ulong, c_uint, c_void_p, c_ulong]), - ('wally_get_operations', c_int, [POINTER(operations)]), - ('wally_set_operations', c_int, [POINTER(operations)]), - ('wally_format_bitcoin_message', c_int, [c_void_p, c_ulong, c_uint, c_void_p, c_ulong, c_ulong_p]), - ): - - def bind_fn(name, res, args): - try: - fn = getattr(libwally, name) - fn.restype, fn.argtypes = res, args - return fn - except AttributeError: - # Internal function and 'configure --enable-export-all' not used - return None - - def string_fn_wrapper(fn, *args): - # Return output string parameters directly without leaking - p = c_char_p() - new_args = [a for a in args] + [byref(p)] - ret = fn(*new_args) - ret_str = None if p.value is None else p.value.decode('utf-8') - wally_free_string(p) - return [ret_str, (ret, ret_str)][fn.restype is not None] - - def int_fn_wrapper(fn, *args): - p = c_ulong() - new_args = [a for a in args] + [byref(p)] - ret = fn(*new_args) - return [p.value, (ret, p.value)][fn.restype is not None] - - name, restype, argtypes = f - is_str_fn = type(argtypes[-1]) is c_char_p_p_class - is_int_fn = type(argtypes[-1]) is c_ulong_p_class - if is_str_fn: - argtypes[-1] = POINTER(c_char_p) - elif is_int_fn: - argtypes[-1] = POINTER(c_ulong) - fn = bind_fn(name, restype, argtypes) - def mkstr(f): return lambda *args: string_fn_wrapper(f, *args) - def mkint(f): return lambda *args: int_fn_wrapper(f, *args) - if is_str_fn: - fn = mkstr(fn) - elif is_int_fn: - fn = mkint(fn) - globals()[name] = fn - -def load_words(lang): - with open(root_dir + 'src/data/wordlists/%s.txt' % lang, 'r') as f: - words_list = [l.strip() for l in f.readlines()] - return words_list, ' '.join(words_list) - -def h(s): - return hexlify(s) - -def make_cbuffer(hex_in): - if hex_in is None: - return None, 0 - hex_len = len(hex_in) // 2 - return unhexlify(hex_in), hex_len - -is_python3 = int(sys.version[0]) >= 3 -utf8 = lambda s: s -if is_python3: - utf8 = lambda s: s.encode('utf-8') - -assert wally_secp_randomize(urandom(32), 32) == WALLY_OK, 'Random init failed' - -_original_ops = operations() -_new_ops = operations() -for ops in (_original_ops, _new_ops): - assert wally_get_operations(byref(ops)) == WALLY_OK - -# Disable internal tests if not available -def internal_only(): - def decorator(test_func): - def wrapped(*args): - if wordlist_init is None: - print (test_func.__name__ + ' disabled, use --enable-export-all to enable ') - else: - return test_func(*args) - return wrapped - return decorator - -# Support for malloc testing -_fail_malloc_at = 0 -_fail_malloc_counter = 0 - -def _failable_malloc(size): - global _fail_malloc_counter - _fail_malloc_counter += 1 - if _fail_malloc_counter == _fail_malloc_at: - return None - return _original_ops.malloc_fn(size) - -_new_ops.malloc_fn = _malloc_fn_t(_failable_malloc) - -def malloc_fail(failures): - def decorator(test_func): - def wrapped(*args): - global _fail_malloc_at, _fail_malloc_counter - for fail_at in failures: - _fail_malloc_at, _fail_malloc_counter = fail_at, 0 - test_func(*args) - _fail_malloc_at, _fail_malloc_counter = 0, 0 - return wrapped - return decorator - -# Support for signing testing -_fake_ec_nonce = None - -def set_fake_ec_nonce(nonce): - global _fake_ec_nonce - _fake_ec_nonce = nonce - -def _fake_ec_nonce_fn(nonce32, msg32, key32, algo16, data, attempt): - global _fake_ec_nonce - if _fake_ec_nonce is not None: - memmove(nonce32, _fake_ec_nonce, 32) - return 1 - return _original_ops.ec_nonce_fn(nonce32, msg32, key32, algo16, data, attempt) - -_new_ops.ec_nonce_fn = _ec_nonce_fn_t(_fake_ec_nonce_fn) - -assert wally_set_operations(byref(_new_ops)) == WALLY_OK diff --git a/external/libwally-core/src/wordlist.c b/external/libwally-core/src/wordlist.c deleted file mode 100644 index 43a17f5af..000000000 --- a/external/libwally-core/src/wordlist.c +++ /dev/null @@ -1,105 +0,0 @@ -#include "internal.h" -#include "wordlist.h" - -static int bstrcmp(const void *l, const void *r) -{ - return strcmp(l, (*(const char **)r)); -} - -/* https://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious */ -static int get_bits(size_t n) -{ - size_t bits = 0; - while (n >>= 1) - ++bits; - return bits; -} - -/* Allocate a new words structure */ -static struct words *wordlist_alloc(const char *words, size_t len) -{ - struct words *w = wally_malloc(sizeof(struct words)); - if (w) { - w->str = wally_strdup(words); - if (w->str) { - w->str_len = strlen(w->str); - w->len = len; - w->bits = get_bits(len); - w->indices = wally_malloc(len * sizeof(const char *)); - if (w->indices) - return w; - } - w->str_len = 0; - wordlist_free(w); - } - return NULL; -} - -static size_t wordlist_count(const char *words) -{ - size_t len = 1u; /* Always 1 less separator than words, so start from 1 */ - while (*words) - len += *words++ == ' '; /* FIXME: utf-8 sep */ - return len; -} - -struct words *wordlist_init(const char *words) -{ - size_t i, len = wordlist_count(words); - struct words *w = wordlist_alloc(words, len); - - if (w) { - /* Tokenise the strings into w->indices */ - const char *p = w->str; - for (len = 0; len < w->len; ++len) { - w->indices[len] = p; - while (*p && *p != ' ') /* FIXME: utf-8 sep */ - ++p; - *((char *)p) = '\0'; - ++p; - } - - w->sorted = true; - for (i = 1; i < len && w->sorted; ++i) - if (strcmp(w->indices[i - 1], w->indices[i]) > 0) - w->sorted = false; - } - return w; -} - -size_t wordlist_lookup_word(const struct words *w, const char *word) -{ - const size_t size = sizeof(const char *); - const char **found = NULL; - - if (w->sorted) - found = (const char **)bsearch(word, w->indices, w->len, size, bstrcmp); - else { - size_t i; - for (i = 0; i < w->len && !found; ++i) - if (!strcmp(word, w->indices[i])) - found = w->indices + i; - } - return found ? found - w->indices + 1u : 0u; -} - -const char *wordlist_lookup_index(const struct words *w, size_t idx) -{ - if (idx >= w->len) - return NULL; - return w->indices[idx]; -} - -void wordlist_free(struct words *w) -{ - if (w && w->str_len) { - if (w->str) { - clear((void *)w->str, w->str_len); - wally_free((void *)w->str); - } - if (w->indices) - wally_free((void *)w->indices); /* No need to clear */ - clear(w, sizeof(*w)); - wally_free(w); - } -} diff --git a/external/libwally-core/src/wordlist.h b/external/libwally-core/src/wordlist.h deleted file mode 100644 index a2887ad15..000000000 --- a/external/libwally-core/src/wordlist.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef LIBWALLY_WORDLIST_H -#define LIBWALLY_WORDLIST_H - -#include - -/** - * struct words- structure representing a parsed list of words - */ -struct words { - /* Number of words in the list */ - size_t len; - /* Number of bits representable by this word list */ - size_t bits; - /* Is the word list sorted by unicode code point order? */ - bool sorted; - /* The underlying string (tokenised, containing embedded NULs) */ - const char *str; - /* The length of str, or 0 if str points to constant storage */ - size_t str_len; - /* Pointers to the individual words */ - const char **indices; -}; - -/** - * Initialize a words structure. - * - * @text: List of words to initialize from, split by whitespace and - * NUL terminated. Must be UTF-8 encoded. - * - * The returned structure contains a copy of @text. - */ -struct words *wordlist_init(const char *text); - -/** - * Find a word in a wordlist. - * - * @w: Parsed list of words to look up in. - * @word: The word to look up. - * - * Returns 0 if not found, idx + 1 otherwise. - * @see wordlist_init. - */ -size_t wordlist_lookup_word( - const struct words *w, - const char *word); - -/** - * Return the Nth word in a wordlist. - * - * @w: Parsed list of words to look up in. - * @idx: The index to look up. - * - * Returns NULL if not found, the word otherwise. - */ -const char *wordlist_lookup_index( - const struct words *w, - size_t idx); - -/** - * wordlist_free - Free a words structure. - * @w: structure to free. - */ -void wordlist_free(struct words *w); - -#endif /* LIBWALLY_WORDLIST_H */ diff --git a/external/libwally-core/tools/autogen.sh b/external/libwally-core/tools/autogen.sh deleted file mode 100755 index ab5ef092b..000000000 --- a/external/libwally-core/tools/autogen.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec autoreconf --install --force --warnings=all diff --git a/external/libwally-core/tools/build-aux/m4/ac_pkg_swig.m4 b/external/libwally-core/tools/build-aux/m4/ac_pkg_swig.m4 deleted file mode 100644 index c9f63352d..000000000 --- a/external/libwally-core/tools/build-aux/m4/ac_pkg_swig.m4 +++ /dev/null @@ -1,155 +0,0 @@ -dnl @synopsis AC_PROG_SWIG([major.minor.micro]) -dnl -dnl This macro searches for a SWIG installation on your system. If -dnl found you should call SWIG via $(SWIG). You can use the optional -dnl first argument to check if the version of the available SWIG is -dnl greater than or equal to the value of the argument. It should have -dnl the format: N[.N[.N]] (N is a number between 0 and 999. Only the -dnl first N is mandatory.) -dnl -dnl If the version argument is given (e.g. 1.3.17), AC_PROG_SWIG checks -dnl that the swig package is this version number or higher. -dnl -dnl In configure.in, use as: -dnl -dnl AC_PROG_SWIG(1.3.17) -dnl SWIG_ENABLE_CXX -dnl SWIG_MULTI_MODULE_SUPPORT -dnl SWIG_PYTHON -dnl -dnl @category InstalledPackages -dnl @author Sebastian Huber -dnl @author Alan W. Irwin -dnl @author Rafael Laboissiere -dnl @author Andrew Collier -dnl @version 2004-09-20 -dnl @license GPLWithACException - -AC_DEFUN([AC_PROG_SWIG],[ - AC_PATH_PROG([SWIG],[swig]) - if test -z "$SWIG" ; then - AC_MSG_WARN([cannot find 'swig' program. You should look at http://www.swig.org]) - SWIG='echo "Error: SWIG is not installed. You should look at http://www.swig.org" ; false' - elif test -n "$1" ; then - AC_MSG_CHECKING([for SWIG version]) - [swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`] - AC_MSG_RESULT([$swig_version]) - if test -n "$swig_version" ; then - # Calculate the required version number components - [required=$1] - [required_major=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_major" ; then - [required_major=0] - fi - [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] - [required_minor=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_minor" ; then - [required_minor=0] - fi - [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] - [required_patch=`echo $required | sed 's/[^0-9].*//'`] - if test -z "$required_patch" ; then - [required_patch=0] - fi - # Calculate the available version number components - [available=$swig_version] - [available_major=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_major" ; then - [available_major=0] - fi - [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] - [available_minor=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_minor" ; then - [available_minor=0] - fi - [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] - [available_patch=`echo $available | sed 's/[^0-9].*//'`] - if test -z "$available_patch" ; then - [available_patch=0] - fi - if test $available_major -ne $required_major \ - -o $available_minor -ne $required_minor \ - -o $available_patch -lt $required_patch ; then - AC_MSG_WARN([SWIG version >= $1 is required. You have $swig_version. You should look at http://www.swig.org]) - SWIG='echo "Error: SWIG version >= $1 is required. You have '"$swig_version"'. You should look at http://www.swig.org" ; false' - else - AC_MSG_NOTICE([SWIG executable is '$SWIG']) - SWIG_LIB=`$SWIG -swiglib` - AC_MSG_NOTICE([SWIG library directory is '$SWIG_LIB']) - fi - else - AC_MSG_WARN([cannot determine SWIG version]) - SWIG='echo "Error: Cannot determine SWIG version. You should look at http://www.swig.org" ; false' - fi - fi - AC_SUBST([SWIG_LIB]) -]) - -# SWIG_ENABLE_CXX() -# -# Enable SWIG C++ support. This affects all invocations of $(SWIG). -AC_DEFUN([SWIG_ENABLE_CXX],[ - AC_REQUIRE([AC_PROG_SWIG]) - AC_REQUIRE([AC_PROG_CXX]) - SWIG="$SWIG -c++" -]) - -# SWIG_MULTI_MODULE_SUPPORT() -# -# Enable support for multiple modules. This effects all invocations -# of $(SWIG). You have to link all generated modules against the -# appropriate SWIG runtime library. If you want to build Python -# modules for example, use the SWIG_PYTHON() macro and link the -# modules against $(SWIG_PYTHON_LIBS). -# -AC_DEFUN([SWIG_MULTI_MODULE_SUPPORT],[ - AC_REQUIRE([AC_PROG_SWIG]) - SWIG="$SWIG -noruntime" -]) - -# SWIG_PYTHON([use-shadow-classes = {no, yes}]) -# -# Checks for Python and provides the $(SWIG_PYTHON_CPPFLAGS), -# and $(SWIG_PYTHON_OPT) output variables. -# -# $(SWIG_PYTHON_OPT) contains all necessary SWIG options to generate -# code for Python. Shadow classes are enabled unless the value of the -# optional first argument is exactly 'no'. If you need multi module -# support (provided by the SWIG_MULTI_MODULE_SUPPORT() macro) use -# $(SWIG_PYTHON_LIBS) to link against the appropriate library. It -# contains the SWIG Python runtime library that is needed by the type -# check system for example. -AC_DEFUN([SWIG_PYTHON],[ - AC_REQUIRE([AC_PROG_SWIG]) - AC_REQUIRE([AX_PYTHON_DEVEL]) - test "x$1" != "xno" || swig_shadow=" -noproxy" - AC_SUBST([SWIG_PYTHON_OPT],[-python$swig_shadow]) - AC_SUBST([SWIG_PYTHON_CPPFLAGS],[$PYTHON_CPPFLAGS]) -]) - - -dnl @synopsis AC_LIB_WAD -dnl -dnl This macro searches for installed WAD library. -dnl -AC_DEFUN([AC_LIB_WAD], -[ - AC_REQUIRE([AX_PYTHON_DEVEL]) - AC_ARG_ENABLE(wad, - AC_HELP_STRING([--enable-wad], [enable wad module]), - [ - case "${enableval}" in - no) ;; - *) if test "x${enableval}" = xyes; - then - check_wad="yes" - fi ;; - esac - ], []) - - if test -n "$check_wad"; - then - AC_CHECK_LIB(wadpy, _init, [WADPY=-lwadpy], [], $PYTHON_LDFLAGS $PYTHON_EXTRA_LIBS) - AC_SUBST(WADPY) - fi -]) diff --git a/external/libwally-core/tools/build-aux/m4/ax_check_compile_flag.m4 b/external/libwally-core/tools/build-aux/m4/ax_check_compile_flag.m4 deleted file mode 100644 index ca3639715..000000000 --- a/external/libwally-core/tools/build-aux/m4/ax_check_compile_flag.m4 +++ /dev/null @@ -1,74 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the current language's compiler -# or gives an error. (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the current language's default -# flags (e.g. CFLAGS) when the check is done. The check is thus made with -# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to -# force the compiler to issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_COMPILE_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 4 - -AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ - ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_COMPILE_FLAGS diff --git a/external/libwally-core/tools/build-aux/m4/ax_check_link_flag.m4 b/external/libwally-core/tools/build-aux/m4/ax_check_link_flag.m4 deleted file mode 100644 index eb01a6ce1..000000000 --- a/external/libwally-core/tools/build-aux/m4/ax_check_link_flag.m4 +++ /dev/null @@ -1,74 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the linker or gives an error. -# (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the linker's default flags -# when the check is done. The check is thus made with the flags: "LDFLAGS -# EXTRA-FLAGS FLAG". This can for example be used to force the linker to -# issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_LINK_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 4 - -AC_DEFUN([AX_CHECK_LINK_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl -AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ - ax_check_save_flags=$LDFLAGS - LDFLAGS="$LDFLAGS $4 $1" - AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - LDFLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_LINK_FLAGS diff --git a/external/libwally-core/tools/build-aux/m4/ax_jni_include_dir.m4 b/external/libwally-core/tools/build-aux/m4/ax_jni_include_dir.m4 deleted file mode 100644 index 1fc362761..000000000 --- a/external/libwally-core/tools/build-aux/m4/ax_jni_include_dir.m4 +++ /dev/null @@ -1,140 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_JNI_INCLUDE_DIR -# -# DESCRIPTION -# -# AX_JNI_INCLUDE_DIR finds include directories needed for compiling -# programs using the JNI interface. -# -# JNI include directories are usually in the Java distribution. This is -# deduced from the value of $JAVA_HOME, $JAVAC, or the path to "javac", in -# that order. When this macro completes, a list of directories is left in -# the variable JNI_INCLUDE_DIRS. -# -# Example usage follows: -# -# AX_JNI_INCLUDE_DIR -# -# for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS -# do -# CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" -# done -# -# If you want to force a specific compiler: -# -# - at the configure.in level, set JAVAC=yourcompiler before calling -# AX_JNI_INCLUDE_DIR -# -# - at the configure level, setenv JAVAC -# -# Note: This macro can work with the autoconf M4 macros for Java programs. -# This particular macro is not part of the original set of macros. -# -# LICENSE -# -# Copyright (c) 2008 Don Anderson -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 10 - -AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR]) -AC_DEFUN([AX_JNI_INCLUDE_DIR],[ - -JNI_INCLUDE_DIRS="" - -if test "x$JAVA_HOME" != x; then - _JTOPDIR="$JAVA_HOME" -else - if test "x$JAVAC" = x; then - JAVAC=javac - fi - AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no]) - if test "x$_ACJNI_JAVAC" = xno; then - AC_MSG_WARN([cannot find JDK; try setting \$JAVAC or \$JAVA_HOME]) - fi - _ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC") - _JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'` -fi - -case "$host_os" in - darwin*) _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` - _JINC="$_JTOPDIR/Headers";; - *) _JINC="$_JTOPDIR/include";; -esac -_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR]) -_AS_ECHO_LOG([_JINC=$_JINC]) - -# On Mac OS X 10.6.4, jni.h is a symlink: -# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h -# -> ../../CurrentJDK/Headers/jni.h. - -AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path, -[ -if test -f "$_JINC/jni.h"; then - ac_cv_jni_header_path="$_JINC" - JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" -else - _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` - if test -f "$_JTOPDIR/include/jni.h"; then - ac_cv_jni_header_path="$_JTOPDIR/include" - JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" - else - ac_cv_jni_header_path=none - fi -fi -]) - - - -# get the likely subdirectories for system specific java includes -case "$host_os" in -bsdi*) _JNI_INC_SUBDIRS="bsdos";; -darwin*) _JNI_INC_SUBDIRS="darwin";; -freebsd*) _JNI_INC_SUBDIRS="freebsd";; -linux*) _JNI_INC_SUBDIRS="linux genunix";; -osf*) _JNI_INC_SUBDIRS="alpha";; -solaris*) _JNI_INC_SUBDIRS="solaris";; -mingw*) _JNI_INC_SUBDIRS="win32";; -cygwin*) _JNI_INC_SUBDIRS="win32";; -*) _JNI_INC_SUBDIRS="genunix";; -esac - -if test "x$ac_cv_jni_header_path" != "xnone"; then - # add any subdirectories that are present - for JINCSUBDIR in $_JNI_INC_SUBDIRS - do - if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then - JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR" - fi - done -fi -]) - -# _ACJNI_FOLLOW_SYMLINKS -# Follows symbolic links on , -# finally setting variable _ACJNI_FOLLOWED -# ---------------------------------------- -AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[ -# find the include directory relative to the javac executable -_cur="$1" -while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do - AC_MSG_CHECKING([symlink for $_cur]) - _slink=`ls -ld "$_cur" | sed 's/.* -> //'` - case "$_slink" in - /*) _cur="$_slink";; - # 'X' avoids triggering unwanted echo options. - *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";; - esac - AC_MSG_RESULT([$_cur]) -done -_ACJNI_FOLLOWED="$_cur" -])# _ACJNI diff --git a/external/libwally-core/tools/build-aux/m4/ax_pthread.m4 b/external/libwally-core/tools/build-aux/m4/ax_pthread.m4 deleted file mode 100644 index 4c4051ea3..000000000 --- a/external/libwally-core/tools/build-aux/m4/ax_pthread.m4 +++ /dev/null @@ -1,485 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pthread.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) -# -# DESCRIPTION -# -# This macro figures out how to build C programs using POSIX threads. It -# sets the PTHREAD_LIBS output variable to the threads library and linker -# flags, and the PTHREAD_CFLAGS output variable to any special C compiler -# flags that are needed. (The user can also force certain compiler -# flags/libs to be tested by setting these environment variables.) -# -# Also sets PTHREAD_CC to any special C compiler that is needed for -# multi-threaded programs (defaults to the value of CC otherwise). (This -# is necessary on AIX to use the special cc_r compiler alias.) -# -# NOTE: You are assumed to not only compile your program with these flags, -# but also to link with them as well. For example, you might link with -# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS -# -# If you are only building threaded programs, you may wish to use these -# variables in your default LIBS, CFLAGS, and CC: -# -# LIBS="$PTHREAD_LIBS $LIBS" -# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" -# CC="$PTHREAD_CC" -# -# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to -# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). -# -# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the -# PTHREAD_PRIO_INHERIT symbol is defined when compiling with -# PTHREAD_CFLAGS. -# -# ACTION-IF-FOUND is a list of shell commands to run if a threads library -# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it -# is not found. If ACTION-IF-FOUND is not specified, the default action -# will define HAVE_PTHREAD. -# -# Please let the authors know if this macro fails on any platform, or if -# you have any other suggestions or comments. This macro was based on work -# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help -# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by -# Alejandro Forero Cuervo to the autoconf macro repository. We are also -# grateful for the helpful feedback of numerous users. -# -# Updated for Autoconf 2.68 by Daniel Richard G. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson -# Copyright (c) 2011 Daniel Richard G. -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 23 - -AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) -AC_DEFUN([AX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AC_PROG_SED]) -AC_LANG_PUSH([C]) -ax_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on Tru64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then - ax_pthread_save_CC="$CC" - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) - AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) - AC_MSG_RESULT([$ax_pthread_ok]) - if test "x$ax_pthread_ok" = "xno"; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - CC="$ax_pthread_save_CC" - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 -# (Note: HP C rejects this with "bad form for `-t' option") -# -pthreads: Solaris/gcc (Note: HP C also rejects) -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads and -# -D_REENTRANT too), HP C (must be checked before -lpthread, which -# is present but should not be used directly; and before -mthreads, -# because the compiler interprets this as "-mt" + "-hreads") -# -mthreads: Mingw32/gcc, Lynx/gcc -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case $host_os in - - freebsd*) - - # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) - # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) - - ax_pthread_flags="-kthread lthread $ax_pthread_flags" - ;; - - hpux*) - - # From the cc(1) man page: "[-mt] Sets various -D flags to enable - # multi-threading and also sets -lpthread." - - ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" - ;; - - openedition*) - - # IBM z/OS requires a feature-test macro to be defined in order to - # enable POSIX threads at all, so give the user a hint if this is - # not set. (We don't define these ourselves, as they can affect - # other portions of the system API in unpredictable ways.) - - AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], - [ -# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) - AX_PTHREAD_ZOS_MISSING -# endif - ], - [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) - ;; - - solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (N.B.: The stubs are missing - # pthread_cleanup_push, or rather a function called by this macro, - # so we could check for that, but who knows whether they'll stub - # that too in a future libc.) So we'll check first for the - # standard Solaris way of linking pthreads (-mt -lpthread). - - ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" - ;; -esac - -# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) - -AS_IF([test "x$GCC" = "xyes"], - [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) - -# The presence of a feature test macro requesting re-entrant function -# definitions is, on some systems, a strong hint that pthreads support is -# correctly enabled - -case $host_os in - darwin* | hpux* | linux* | osf* | solaris*) - ax_pthread_check_macro="_REENTRANT" - ;; - - aix*) - ax_pthread_check_macro="_THREAD_SAFE" - ;; - - *) - ax_pthread_check_macro="--" - ;; -esac -AS_IF([test "x$ax_pthread_check_macro" = "x--"], - [ax_pthread_check_cond=0], - [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) - -# Are we compiling with Clang? - -AC_CACHE_CHECK([whether $CC is Clang], - [ax_cv_PTHREAD_CLANG], - [ax_cv_PTHREAD_CLANG=no - # Note that Autoconf sets GCC=yes for Clang as well as GCC - if test "x$GCC" = "xyes"; then - AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], - [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ -# if defined(__clang__) && defined(__llvm__) - AX_PTHREAD_CC_IS_CLANG -# endif - ], - [ax_cv_PTHREAD_CLANG=yes]) - fi - ]) -ax_pthread_clang="$ax_cv_PTHREAD_CLANG" - -ax_pthread_clang_warning=no - -# Clang needs special handling, because older versions handle the -pthread -# option in a rather... idiosyncratic way - -if test "x$ax_pthread_clang" = "xyes"; then - - # Clang takes -pthread; it has never supported any other flag - - # (Note 1: This will need to be revisited if a system that Clang - # supports has POSIX threads in a separate library. This tends not - # to be the way of modern systems, but it's conceivable.) - - # (Note 2: On some systems, notably Darwin, -pthread is not needed - # to get POSIX threads support; the API is always present and - # active. We could reasonably leave PTHREAD_CFLAGS empty. But - # -pthread does define _REENTRANT, and while the Darwin headers - # ignore this macro, third-party headers might not.) - - PTHREAD_CFLAGS="-pthread" - PTHREAD_LIBS= - - ax_pthread_ok=yes - - # However, older versions of Clang make a point of warning the user - # that, in an invocation where only linking and no compilation is - # taking place, the -pthread option has no effect ("argument unused - # during compilation"). They expect -pthread to be passed in only - # when source code is being compiled. - # - # Problem is, this is at odds with the way Automake and most other - # C build frameworks function, which is that the same flags used in - # compilation (CFLAGS) are also used in linking. Many systems - # supported by AX_PTHREAD require exactly this for POSIX threads - # support, and in fact it is often not straightforward to specify a - # flag that is used only in the compilation phase and not in - # linking. Such a scenario is extremely rare in practice. - # - # Even though use of the -pthread flag in linking would only print - # a warning, this can be a nuisance for well-run software projects - # that build with -Werror. So if the active version of Clang has - # this misfeature, we search for an option to squash it. - - AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], - [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], - [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown - # Create an alternate version of $ac_link that compiles and - # links in two steps (.c -> .o, .o -> exe) instead of one - # (.c -> exe), because the warning occurs only in the second - # step - ax_pthread_save_ac_link="$ac_link" - ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' - ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` - ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" - ax_pthread_save_CFLAGS="$CFLAGS" - for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do - AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) - CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" - ac_link="$ax_pthread_save_ac_link" - AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], - [ac_link="$ax_pthread_2step_ac_link" - AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], - [break]) - ]) - done - ac_link="$ax_pthread_save_ac_link" - CFLAGS="$ax_pthread_save_CFLAGS" - AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" - ]) - - case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in - no | unknown) ;; - *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; - esac - -fi # $ax_pthread_clang = yes - -if test "x$ax_pthread_ok" = "xno"; then -for ax_pthread_try_flag in $ax_pthread_flags; do - - case $ax_pthread_try_flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - -mt,pthread) - AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) - PTHREAD_CFLAGS="-mt" - PTHREAD_LIBS="-lpthread" - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) - PTHREAD_CFLAGS="$ax_pthread_try_flag" - ;; - - pthread-config) - AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) - AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) - PTHREAD_LIBS="-l$ax_pthread_try_flag" - ;; - esac - - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include -# if $ax_pthread_check_cond -# error "$ax_pthread_check_macro must be defined" -# endif - static void routine(void *a) { a = 0; } - static void *start_routine(void *a) { return a; }], - [pthread_t th; pthread_attr_t attr; - pthread_create(&th, 0, start_routine, 0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) - - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" - - AC_MSG_RESULT([$ax_pthread_ok]) - AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$ax_pthread_ok" = "xyes"; then - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_CACHE_CHECK([for joinable pthread attribute], - [ax_cv_PTHREAD_JOINABLE_ATTR], - [ax_cv_PTHREAD_JOINABLE_ATTR=unknown - for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [int attr = $ax_pthread_attr; return attr /* ; */])], - [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], - []) - done - ]) - AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ - test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ - test "x$ax_pthread_joinable_attr_defined" != "xyes"], - [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], - [$ax_cv_PTHREAD_JOINABLE_ATTR], - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - ax_pthread_joinable_attr_defined=yes - ]) - - AC_CACHE_CHECK([whether more special flags are required for pthreads], - [ax_cv_PTHREAD_SPECIAL_FLAGS], - [ax_cv_PTHREAD_SPECIAL_FLAGS=no - case $host_os in - solaris*) - ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" - ;; - esac - ]) - AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ - test "x$ax_pthread_special_flags_added" != "xyes"], - [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" - ax_pthread_special_flags_added=yes]) - - AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - [ax_cv_PTHREAD_PRIO_INHERIT], - [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) - ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ - test "x$ax_pthread_prio_inherit_defined" != "xyes"], - [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) - ax_pthread_prio_inherit_defined=yes - ]) - - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" - - # More AIX lossage: compile with *_r variant - if test "x$GCC" != "xyes"; then - case $host_os in - aix*) - AS_CASE(["x/$CC"], - [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], - [#handle absolute path differently from PATH based program lookup - AS_CASE(["x$CC"], - [x/*], - [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], - [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) - ;; - esac - fi -fi - -test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" - -AC_SUBST([PTHREAD_LIBS]) -AC_SUBST([PTHREAD_CFLAGS]) -AC_SUBST([PTHREAD_CC]) - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test "x$ax_pthread_ok" = "xyes"; then - ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) - : -else - ax_pthread_ok=no - $2 -fi -AC_LANG_POP -])dnl AX_PTHREAD diff --git a/external/libwally-core/tools/build-aux/m4/ax_python_devel.m4 b/external/libwally-core/tools/build-aux/m4/ax_python_devel.m4 deleted file mode 100644 index e90bb7a11..000000000 --- a/external/libwally-core/tools/build-aux/m4/ax_python_devel.m4 +++ /dev/null @@ -1,332 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_python_devel.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PYTHON_DEVEL([version]) -# -# DESCRIPTION -# -# Note: Defines as a precious variable "PYTHON_VERSION". Don't override it -# in your configure.ac. -# -# This macro checks for Python and tries to get the include path to -# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LIBS) output -# variables. It also exports $(PYTHON_EXTRA_LIBS) and -# $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. -# -# You can search for some particular version of Python by passing a -# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please -# note that you *have* to pass also an operator along with the version to -# match, and pay special attention to the single quotes surrounding the -# version number. Don't use "PYTHON_VERSION" for this: that environment -# variable is declared as precious and thus reserved for the end-user. -# -# This macro should work for all versions of Python >= 2.1.0. As an end -# user, you can disable the check for the python version by setting the -# PYTHON_NOVERSIONCHECK environment variable to something else than the -# empty string. -# -# If you need to use this macro for an older Python version, please -# contact the authors. We're always open for feedback. -# -# LICENSE -# -# Copyright (c) 2009 Sebastian Huber -# Copyright (c) 2009 Alan W. Irwin -# Copyright (c) 2009 Rafael Laboissiere -# Copyright (c) 2009 Andrew Collier -# Copyright (c) 2009 Matteo Settenvini -# Copyright (c) 2009 Horst Knorr -# Copyright (c) 2013 Daniel Mullner -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 18 - -AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL]) -AC_DEFUN([AX_PYTHON_DEVEL],[ - # - # Allow the use of a (user set) custom python version - # - AC_ARG_VAR([PYTHON_VERSION],[The installed Python - version to use, for example '2.3'. This string - will be appended to the Python interpreter - canonical name.]) - - AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]]) - if test -z "$PYTHON"; then - AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path]) - PYTHON_VERSION="" - fi - - # - # Check for a version of Python >= 2.1.0 - # - AC_MSG_CHECKING([for a version of Python >= '2.1.0']) - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[[0]]; \ - print (ver >= '2.1.0')"` - if test "$ac_supports_python_ver" != "True"; then - if test -z "$PYTHON_NOVERSIONCHECK"; then - AC_MSG_RESULT([no]) - AC_MSG_FAILURE([ -This version of the AC@&t@_PYTHON_DEVEL macro -doesn't work properly with versions of Python before -2.1.0. You may need to re-run configure, setting the -variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG, -PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. -Moreover, to disable this check, set PYTHON_NOVERSIONCHECK -to something else than an empty string. -]) - else - AC_MSG_RESULT([skip at user request]) - fi - else - AC_MSG_RESULT([yes]) - fi - - # - # if the macro parameter ``version'' is set, honour it - # - if test -n "$1"; then - AC_MSG_CHECKING([for a version of Python $1]) - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[[0]]; \ - print (ver $1)"` - if test "$ac_supports_python_ver" = "True"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([this package requires Python $1. -If you have it installed, but it isn't the default Python -interpreter in your system path, please pass the PYTHON_VERSION -variable to configure. See ``configure --help'' for reference. -]) - PYTHON_VERSION="" - fi - fi - - # - # Check if you have distutils, else fail - # - AC_MSG_CHECKING([for the distutils Python package]) - ac_distutils_result=`$PYTHON -c "import distutils" >/dev/null 2>&1` - if test -z "$ac_distutils_result"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([cannot import Python module "distutils". -Please check your Python installation. The error was: -$ac_distutils_result]) - PYTHON_VERSION="" - fi - - # - # Check for Python include path - # - AC_MSG_CHECKING([for Python include path]) - if test -z "$PYTHON_CPPFLAGS"; then - python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc ());"` - plat_python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc (plat_specific=1));"` - if test -n "${python_path}"; then - if test "${plat_python_path}" != "${python_path}"; then - python_path="-I$python_path -I$plat_python_path" - else - python_path="-I$python_path" - fi - fi - PYTHON_CPPFLAGS=$python_path - fi - AC_MSG_RESULT([$PYTHON_CPPFLAGS]) - - # - # Check for Python library path - # - AC_MSG_CHECKING([for Python library path]) - if test -z "$PYTHON_LIBS"; then - # (makes two attempts to ensure we've got a version number - # from the interpreter) - ac_python_version=`cat<]], - [[Py_Initialize();]]) - ],[pythonexists=yes],[pythonexists=no]) - AC_LANG_POP([C]) - # turn back to default flags - CPPFLAGS="$ac_save_CPPFLAGS" - LIBS="$ac_save_LIBS" - LDFLAGS="$ac_save_LDFLAGS" - - AC_MSG_RESULT([$pythonexists]) - - if test ! "x$pythonexists" = "xyes"; then - AC_MSG_RESULT([ - Could not link test program to Python. Maybe the main Python library has been - installed in some non-standard library path. If so, pass it to configure, - via the LIBS environment variable. - Example: ./configure LIBS="-L/usr/non-standard-path/python/lib" - ============================================================================ - ERROR! - You probably have to install the development version of the Python package - for your distribution. The exact name of this package varies among them. - ============================================================================ - ]) - PYTHON_VERSION="" - PYTHON_CPPFLAGS="" - PYTHON_LIBS="" - PYTHON_SITE_PKG="" - PYTHON_EXTRA_LDFLAGS="" - PYTHON_EXTRA_LIBS="" - fi - AC_SUBST([PYTHON_CPPFLAGS]) - AC_SUBST([PYTHON_LIBS]) - AC_SUBST([PYTHON_SITE_PKG]) - AC_SUBST(PYTHON_EXTRA_LDFLAGS) - AC_SUBST(PYTHON_EXTRA_LIBS) - # - # all done! - # -]) - diff --git a/external/libwally-core/tools/build_python_eggs.sh b/external/libwally-core/tools/build_python_eggs.sh deleted file mode 100755 index 8a6461bdb..000000000 --- a/external/libwally-core/tools/build_python_eggs.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Creates tarballs with a binary egg file and setup.py for python2/3. -# After unpacking, the resulting egg file can be installed with -# python setup.py easy_install wallycore*.egg -# Like all tools/ scripts, this should be run from the project root. - -PLATFORM=$(python -c 'import platform; print(platform.system().lower())') -BITS=$(python -c 'import sys; print("64" if sys.maxsize > 2**32 else "32")') -MACHINE=$(python -c 'import platform; print(platform.machine().lower())') -NAME="wallycore-$PLATFORM-$MACHINE-$BITS" - -function build { - ./tools/cleanup.sh - virtualenv -p $1 .venv - source .venv/bin/activate - PYTHONDONTWRITEBYTECODE= $1 setup.py install - cp setup.py dist - mv dist $NAME-$1 - tar czf $NAME-$1.tar.gz $NAME-$1 - sha256sum $NAME-$1.tar.gz >$NAME-$1.tar.gz.sha256 - #gpg --armor --output $NAME-$1.tar.gz.asc --detach-sign $NAME-$1.tar.gz - rm -r $NAME-$1 - deactivate -} - -build python2 -build python3 - -./tools/cleanup.sh - diff --git a/external/libwally-core/tools/cleanup.sh b/external/libwally-core/tools/cleanup.sh deleted file mode 100755 index dec59f7d6..000000000 --- a/external/libwally-core/tools/cleanup.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -# Clean up all generated files -make -o configure distclean >/dev/null 2>&1 - -find . -name Makefile -exec rm {} \; -find . -name Makefile.in -exec rm {} \; -find . -name "*.class" -exec rm {} \; -find . -name "*.gcno" -exec rm {} \; -find . -name "*.gcda" -exec rm {} \; -find . -name "*.egg-info" -exec rm -rf {} 2>/dev/null \; - -rm -f */*~ -rm -f *~ -rm -f aclocal.m4 -rm -rf build/ -rm -f config.h.in -rm -f configure -rm -rf dist/ -rm -f src/*pyc -rm -f src/test/*pyc -rm -f src/config.h.in -rm -rf src/lcov* -rm -f src/test_clear* -rm -f src/test-suite.log -rm -f src/swig_java/swig_java_wrap.c -rm -f src/swig_java/*java -rm -f src/swig_java/*jar -rm -rf src/swig_java/src/com/blockstream/libwally -rm -f src/swig_python/wallycore.py -rm -f src/swig_python/wallycore/__init__.py -rm -f src/swig_python/swig_python_wrap.c -rm -rf src/.libs -rm -f tools/build-aux/compile -rm -f tools/build-aux/config.guess -rm -f tools/build-aux/config.sub -rm -f tools/build-aux/depcomp -rm -f tools/build-aux/install-sh -rm -f tools/build-aux/ltmain.sh -rm -f tools/build-aux/missing -rm -f tools/build-aux/m4/l*.m4 -rm -f tools/build-aux/test-driver -rm -rf autom4te.cache/ -rm -rf .venv -exit 0 diff --git a/external/libwally-core/tools/coverage.sh b/external/libwally-core/tools/coverage.sh deleted file mode 100755 index 3e67dff33..000000000 --- a/external/libwally-core/tools/coverage.sh +++ /dev/null @@ -1,17 +0,0 @@ -#/bin/bash - -# Helper to generate coverage reports. -# ./tools/coverage.sh clean : Sets coverage stats to 0. -# ./tools/coverage.sh : Calculates coverage stats, produces -# src/lcov/index.html as output. - -lcov="lcov --directory=src/ --base-directory src/" - -if [ $1 = "clean" ]; then - $lcov --zerocounters - $lcov --output-file src/lcov_base --capture --initial -else - $lcov --output-file src/lcov_result --capture --ignore-errors=gcov - $lcov --output-file src/lcov_total --add-tracefile src/lcov_base --add-tracefile src/lcov_result --ignore-errors=gcov - genhtml --demangle-cpp -o src/lcov/ src/lcov_total -fi diff --git a/external/libwally-core/tools/swigjavapost.sh b/external/libwally-core/tools/swigjavapost.sh deleted file mode 100755 index faf1feeea..000000000 --- a/external/libwally-core/tools/swigjavapost.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -sed_exe=$1 - -result="swig_java/src/com/blockstream/libwally/Wally.java" - -mkdir -p `dirname $result` - -# Merge the constants and JNI interface into Wally.java -grep -v '^}$' swig_java/wallycoreJNI.java | $sed_exe 's/wallycoreJNI/Wally/g' >$result -grep 'public final static' swig_java/wallycoreConstants.java >>$result -# Append our extra functionality -cat swig_java/jni_extra.java_in >>$result - -# Clean up -rm -f swig_java/*.java diff --git a/external/libwally-core/tools/travis_build.sh b/external/libwally-core/tools/travis_build.sh deleted file mode 100755 index 08fb73fef..000000000 --- a/external/libwally-core/tools/travis_build.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -ENABLE_SWIG_PYTHON="--enable-swig-python" -ENABLE_SWIG_JAVA="--enable-swig-java" - -if [ -n "$HOST" ]; then - USE_HOST="--host=$HOST" - if [ "$HOST" = "i686-linux-gnu" ]; then - export CC="$CC -m32" - ENABLE_SWIG_PYTHON="" - # We only disable Java because the 64 bit jvm won't run the - # tests given a 32 bit libwally.so. It compiles fine. - export ENABLE_SWIG_JAVA="" - fi -fi - -./configure --disable-dependency-tracking --enable-export-all $ENABLE_SWIG_PYTHON $ENABLE_SWIG_JAVA $USE_HOST && make && make check - diff --git a/external/libwally-core/tools/travis_install.sh b/external/libwally-core/tools/travis_install.sh deleted file mode 100755 index d5fe8d73d..000000000 --- a/external/libwally-core/tools/travis_install.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -if [ "$TRAVIS_OS_NAME" = "osx" ]; then - brew update - brew install gnu-sed - brew install swig -fi diff --git a/external/libwally-core/tools/uncrustify b/external/libwally-core/tools/uncrustify deleted file mode 100755 index 4b2028278..000000000 --- a/external/libwally-core/tools/uncrustify +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# Use uncrustify to reformat the source -if test -z "$1"; then - files=`ls src/*.c src/*.h src/ctest/*.c include/*.h | grep -v src/config.h` -else - files="$*" -fi -uncrustify --replace --no-backup -c tools/uncrustify.cfg $files diff --git a/external/libwally-core/tools/uncrustify.cfg b/external/libwally-core/tools/uncrustify.cfg deleted file mode 100644 index 53c8caa69..000000000 --- a/external/libwally-core/tools/uncrustify.cfg +++ /dev/null @@ -1,1578 +0,0 @@ -# Uncrustify 0.60 - -# -# General options -# - -# The type of line endings -newlines = auto # auto/lf/crlf/cr - -# The original size of tabs in the input -input_tab_size = 8 # number - -# The size of tabs in the output (only used if align_with_tabs=true) -output_tab_size = 8 # number - -# The ASCII value of the string escape char, usually 92 (\) or 94 (^). (Pawn) -string_escape_char = 92 # number - -# Alternate string escape char for Pawn. Only works right before the quote char. -string_escape_char2 = 0 # number - -# Allow interpreting '>=' and '>>=' as part of a template in 'void f(list>=val);'. -# If true (default), 'assert(x<0 && y>=3)' will be broken. -# Improvements to template detection may make this option obsolete. -tok_split_gte = false # false/true - -# Control what to do with the UTF-8 BOM (recommend 'remove') -utf8_bom = remove # ignore/add/remove/force - -# If the file contains bytes with values between 128 and 255, but is not UTF-8, then output as UTF-8 -utf8_byte = false # false/true - -# Force the output encoding to UTF-8 -utf8_force = false # false/true - -# -# Indenting -# - -# The number of columns to indent per level. -# Usually 2, 3, 4, or 8. -indent_columns = 4 # number - -# The continuation indent. If non-zero, this overrides the indent of '(' and '=' continuation indents. -# For FreeBSD, this is set to 4. Negative value is absolute and not increased for each ( level -indent_continue = 0 # number - -# How to use tabs when indenting code -# 0=spaces only -# 1=indent with tabs to brace level, align with spaces -# 2=indent and align with tabs, using spaces when not on a tabstop -indent_with_tabs = 0 # number - -# Comments that are not a brace level are indented with tabs on a tabstop. -# Requires indent_with_tabs=2. If false, will use spaces. -indent_cmt_with_tabs = false # false/true - -# Whether to indent strings broken by '\' so that they line up -indent_align_string = false # false/true - -# The number of spaces to indent multi-line XML strings. -# Requires indent_align_string=True -indent_xml_string = 0 # number - -# Spaces to indent '{' from level -indent_brace = 0 # number - -# Whether braces are indented to the body level -indent_braces = false # false/true - -# Disabled indenting function braces if indent_braces is true -indent_braces_no_func = false # false/true - -# Disabled indenting class braces if indent_braces is true -indent_braces_no_class = false # false/true - -# Disabled indenting struct braces if indent_braces is true -indent_braces_no_struct = false # false/true - -# Indent based on the size of the brace parent, i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc. -indent_brace_parent = false # false/true - -# Whether the 'namespace' body is indented -indent_namespace = false # false/true - -# The number of spaces to indent a namespace block -indent_namespace_level = 0 # number - -# If the body of the namespace is longer than this number, it won't be indented. -# Requires indent_namespace=true. Default=0 (no limit) -indent_namespace_limit = 0 # number - -# Whether the 'extern "C"' body is indented -indent_extern = false # false/true - -# Whether the 'class' body is indented -indent_class = false # false/true - -# Whether to indent the stuff after a leading class colon -indent_class_colon = false # false/true - -# Virtual indent from the ':' for member initializers. Default is 2 -indent_ctor_init_leading = 2 # number - -# Additional indenting for constructor initializer list -indent_ctor_init = 0 # number - -# False=treat 'else\nif' as 'else if' for indenting purposes -# True=indent the 'if' one level -indent_else_if = false # false/true - -# Amount to indent variable declarations after a open brace. neg=relative, pos=absolute -indent_var_def_blk = 0 # number - -# Indent continued variable declarations instead of aligning. -indent_var_def_cont = false # false/true - -# True: force indentation of function definition to start in column 1 -# False: use the default behavior -indent_func_def_force_col1 = false # false/true - -# True: indent continued function call parameters one indent level -# False: align parameters under the open paren -indent_func_call_param = false # false/true - -# Same as indent_func_call_param, but for function defs -indent_func_def_param = false # false/true - -# Same as indent_func_call_param, but for function protos -indent_func_proto_param = false # false/true - -# Same as indent_func_call_param, but for class declarations -indent_func_class_param = false # false/true - -# Same as indent_func_call_param, but for class variable constructors -indent_func_ctor_var_param = false # false/true - -# Same as indent_func_call_param, but for templates -indent_template_param = false # false/true - -# Double the indent for indent_func_xxx_param options -indent_func_param_double = false # false/true - -# Indentation column for standalone 'const' function decl/proto qualifier -indent_func_const = 0 # number - -# Indentation column for standalone 'throw' function decl/proto qualifier -indent_func_throw = 0 # number - -# The number of spaces to indent a continued '->' or '.' -# Usually set to 0, 1, or indent_columns. -indent_member = 0 # number - -# Spaces to indent single line ('//') comments on lines before code -indent_sing_line_comments = 0 # number - -# If set, will indent trailing single line ('//') comments relative -# to the code instead of trying to keep the same absolute column -indent_relative_single_line_comments = false # false/true - -# Spaces to indent 'case' from 'switch' -# Usually 0 or indent_columns. -indent_switch_case = 0 # number - -# Spaces to shift the 'case' line, without affecting any other lines -# Usually 0. -indent_case_shift = 0 # number - -# Spaces to indent '{' from 'case'. -# By default, the brace will appear under the 'c' in case. -# Usually set to 0 or indent_columns. -indent_case_brace = 0 # number - -# Whether to indent comments found in first column -indent_col1_comment = false # false/true - -# How to indent goto labels -# >0 : absolute column where 1 is the leftmost column -# <=0 : subtract from brace indent -indent_label = 1 # number - -# Same as indent_label, but for access specifiers that are followed by a colon -indent_access_spec = 1 # number - -# Indent the code after an access specifier by one level. -# If set, this option forces 'indent_access_spec=0' -indent_access_spec_body = false # false/true - -# If an open paren is followed by a newline, indent the next line so that it lines up after the open paren (not recommended) -indent_paren_nl = false # false/true - -# Controls the indent of a close paren after a newline. -# 0: Indent to body level -# 1: Align under the open paren -# 2: Indent to the brace level -indent_paren_close = 0 # number - -# Controls the indent of a comma when inside a paren.If TRUE, aligns under the open paren -indent_comma_paren = false # false/true - -# Controls the indent of a BOOL operator when inside a paren.If TRUE, aligns under the open paren -indent_bool_paren = false # false/true - -# If 'indent_bool_paren' is true, controls the indent of the first expression. If TRUE, aligns the first expression to the following ones -indent_first_bool_expr = false # false/true - -# If an open square is followed by a newline, indent the next line so that it lines up after the open square (not recommended) -indent_square_nl = false # false/true - -# Don't change the relative indent of ESQL/C 'EXEC SQL' bodies -indent_preserve_sql = false # false/true - -# Align continued statements at the '='. Default=True -# If FALSE or the '=' is followed by a newline, the next line is indent one tab. -indent_align_assign = true # false/true - -# Indent OC blocks at brace level instead of usual rules. -indent_oc_block = false # false/true - -# Indent OC blocks in a message relative to the parameter name. -# 0=use indent_oc_block rules, 1+=spaces to indent -indent_oc_block_msg = 0 # number - -# Minimum indent for subsequent parameters -indent_oc_msg_colon = 0 # number - -# -# Spacing options -# - -# Add or remove space around arithmetic operator '+', '-', '/', '*', etc -sp_arith = force # ignore/add/remove/force - -# Add or remove space around assignment operator '=', '+=', etc -sp_assign = force # ignore/add/remove/force - -# Add or remove space around '=' in C++11 lambda capture specifications. Overrides sp_assign -sp_cpp_lambda_assign = ignore # ignore/add/remove/force - -# Add or remove space after the capture specification in C++11 lambda. -sp_cpp_lambda_paren = ignore # ignore/add/remove/force - -# Add or remove space around assignment operator '=' in a prototype -sp_assign_default = force # ignore/add/remove/force - -# Add or remove space before assignment operator '=', '+=', etc. Overrides sp_assign. -sp_before_assign = force # ignore/add/remove/force - -# Add or remove space after assignment operator '=', '+=', etc. Overrides sp_assign. -sp_after_assign = force # ignore/add/remove/force - -# Add or remove space around assignment '=' in enum -sp_enum_assign = force # ignore/add/remove/force - -# Add or remove space before assignment '=' in enum. Overrides sp_enum_assign. -sp_enum_before_assign = force # ignore/add/remove/force - -# Add or remove space after assignment '=' in enum. Overrides sp_enum_assign. -sp_enum_after_assign = force # ignore/add/remove/force - -# Add or remove space around preprocessor '##' concatenation operator. Default=Add -sp_pp_concat = add # ignore/add/remove/force - -# Add or remove space after preprocessor '#' stringify operator. Also affects the '#@' charizing operator. -sp_pp_stringify = ignore # ignore/add/remove/force - -# Add or remove space before preprocessor '#' stringify operator as in '#define x(y) L#y'. -sp_before_pp_stringify = ignore # ignore/add/remove/force - -# Add or remove space around boolean operators '&&' and '||' -sp_bool = force # ignore/add/remove/force - -# Add or remove space around compare operator '<', '>', '==', etc -sp_compare = force # ignore/add/remove/force - -# Add or remove space inside '(' and ')' -sp_inside_paren = remove # ignore/add/remove/force - -# Add or remove space between nested parens -sp_paren_paren = remove # ignore/add/remove/force - -# Whether to balance spaces inside nested parens -sp_balance_nested_parens = false # false/true - -# Add or remove space between ')' and '{' -sp_paren_brace = force # ignore/add/remove/force - -# Add or remove space before pointer star '*' -sp_before_ptr_star = force # ignore/add/remove/force - -# Add or remove space before pointer star '*' that isn't followed by a variable name -# If set to 'ignore', sp_before_ptr_star is used instead. -sp_before_unnamed_ptr_star = ignore # ignore/add/remove/force - -# Add or remove space between pointer stars '*' -sp_between_ptr_star = remove # ignore/add/remove/force - -# Add or remove space after pointer star '*', if followed by a word. -sp_after_ptr_star = remove # ignore/add/remove/force - -# Add or remove space after a pointer star '*', if followed by a func proto/def. -sp_after_ptr_star_func = remove # ignore/add/remove/force - -# Add or remove space after a pointer star '*', if followed by an open paren (function types). -sp_ptr_star_paren = remove # ignore/add/remove/force - -# Add or remove space before a pointer star '*', if followed by a func proto/def. -sp_before_ptr_star_func = add # ignore/add/remove/force - -# Add or remove space before a reference sign '&' -sp_before_byref = ignore # ignore/add/remove/force - -# Add or remove space before a reference sign '&' that isn't followed by a variable name -# If set to 'ignore', sp_before_byref is used instead. -sp_before_unnamed_byref = ignore # ignore/add/remove/force - -# Add or remove space after reference sign '&', if followed by a word. -sp_after_byref = ignore # ignore/add/remove/force - -# Add or remove space after a reference sign '&', if followed by a func proto/def. -sp_after_byref_func = ignore # ignore/add/remove/force - -# Add or remove space before a reference sign '&', if followed by a func proto/def. -sp_before_byref_func = ignore # ignore/add/remove/force - -# Add or remove space between type and word. Default=Force -sp_after_type = force # ignore/add/remove/force - -# Add or remove space before the paren in the D constructs 'template Foo(' and 'class Foo('. -sp_before_template_paren = ignore # ignore/add/remove/force - -# Add or remove space in 'template <' vs 'template<'. -# If set to ignore, sp_before_angle is used. -sp_template_angle = ignore # ignore/add/remove/force - -# Add or remove space before '<>' -sp_before_angle = ignore # ignore/add/remove/force - -# Add or remove space inside '<' and '>' -sp_inside_angle = ignore # ignore/add/remove/force - -# Add or remove space after '<>' -sp_after_angle = ignore # ignore/add/remove/force - -# Add or remove space between '<>' and '(' as found in 'new List();' -sp_angle_paren = ignore # ignore/add/remove/force - -# Add or remove space between '<>' and a word as in 'List m;' -sp_angle_word = ignore # ignore/add/remove/force - -# Add or remove space between '>' and '>' in '>>' (template stuff C++/C# only). Default=Add -sp_angle_shift = add # ignore/add/remove/force - -# Permit removal of the space between '>>' in 'foo >' (C++11 only). Default=False -# sp_angle_shift cannot remove the space without this option. -sp_permit_cpp11_shift = false # false/true - -# Add or remove space before '(' of 'if', 'for', 'switch', and 'while' -sp_before_sparen = ignore # ignore/add/remove/force - -# Add or remove space inside if-condition '(' and ')' -sp_inside_sparen = ignore # ignore/add/remove/force - -# Add or remove space before if-condition ')'. Overrides sp_inside_sparen. -sp_inside_sparen_close = ignore # ignore/add/remove/force - -# Add or remove space before if-condition '('. Overrides sp_inside_sparen. -sp_inside_sparen_open = ignore # ignore/add/remove/force - -# Add or remove space after ')' of 'if', 'for', 'switch', and 'while' -sp_after_sparen = ignore # ignore/add/remove/force - -# Add or remove space between ')' and '{' of 'if', 'for', 'switch', and 'while' -sp_sparen_brace = ignore # ignore/add/remove/force - -# Add or remove space between 'invariant' and '(' in the D language. -sp_invariant_paren = ignore # ignore/add/remove/force - -# Add or remove space after the ')' in 'invariant (C) c' in the D language. -sp_after_invariant_paren = ignore # ignore/add/remove/force - -# Add or remove space before empty statement ';' on 'if', 'for' and 'while' -sp_special_semi = ignore # ignore/add/remove/force - -# Add or remove space before ';'. Default=Remove -sp_before_semi = remove # ignore/add/remove/force - -# Add or remove space before ';' in non-empty 'for' statements -sp_before_semi_for = ignore # ignore/add/remove/force - -# Add or remove space before a semicolon of an empty part of a for statement. -sp_before_semi_for_empty = ignore # ignore/add/remove/force - -# Add or remove space after ';', except when followed by a comment. Default=Add -sp_after_semi = add # ignore/add/remove/force - -# Add or remove space after ';' in non-empty 'for' statements. Default=Force -sp_after_semi_for = force # ignore/add/remove/force - -# Add or remove space after the final semicolon of an empty part of a for statement: for ( ; ; ). -sp_after_semi_for_empty = ignore # ignore/add/remove/force - -# Add or remove space before '[' (except '[]') -sp_before_square = ignore # ignore/add/remove/force - -# Add or remove space before '[]' -sp_before_squares = ignore # ignore/add/remove/force - -# Add or remove space inside a non-empty '[' and ']' -sp_inside_square = ignore # ignore/add/remove/force - -# Add or remove space after ',' -sp_after_comma = ignore # ignore/add/remove/force - -# Add or remove space before ',' -sp_before_comma = remove # ignore/add/remove/force - -# Add or remove space between an open paren and comma: '(,' vs '( ,' -sp_paren_comma = force # ignore/add/remove/force - -# Add or remove space before the variadic '...' when preceded by a non-punctuator -sp_before_ellipsis = ignore # ignore/add/remove/force - -# Add or remove space after class ':' -sp_after_class_colon = ignore # ignore/add/remove/force - -# Add or remove space before class ':' -sp_before_class_colon = ignore # ignore/add/remove/force - -# Add or remove space before case ':'. Default=Remove -sp_before_case_colon = remove # ignore/add/remove/force - -# Add or remove space between 'operator' and operator sign -sp_after_operator = ignore # ignore/add/remove/force - -# Add or remove space between the operator symbol and the open paren, as in 'operator ++(' -sp_after_operator_sym = ignore # ignore/add/remove/force - -# Add or remove space after C/D cast, i.e. 'cast(int)a' vs 'cast(int) a' or '(int)a' vs '(int) a' -sp_after_cast = ignore # ignore/add/remove/force - -# Add or remove spaces inside cast parens -sp_inside_paren_cast = ignore # ignore/add/remove/force - -# Add or remove space between the type and open paren in a C++ cast, i.e. 'int(exp)' vs 'int (exp)' -sp_cpp_cast_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'sizeof' and '(' -sp_sizeof_paren = ignore # ignore/add/remove/force - -# Add or remove space after the tag keyword (Pawn) -sp_after_tag = ignore # ignore/add/remove/force - -# Add or remove space inside enum '{' and '}' -sp_inside_braces_enum = ignore # ignore/add/remove/force - -# Add or remove space inside struct/union '{' and '}' -sp_inside_braces_struct = ignore # ignore/add/remove/force - -# Add or remove space inside '{' and '}' -sp_inside_braces = ignore # ignore/add/remove/force - -# Add or remove space inside '{}' -sp_inside_braces_empty = ignore # ignore/add/remove/force - -# Add or remove space between return type and function name -# A minimum of 1 is forced except for pointer return types. -sp_type_func = ignore # ignore/add/remove/force - -# Add or remove space between function name and '(' on function declaration -sp_func_proto_paren = ignore # ignore/add/remove/force - -# Add or remove space between function name and '(' on function definition -sp_func_def_paren = ignore # ignore/add/remove/force - -# Add or remove space inside empty function '()' -sp_inside_fparens = ignore # ignore/add/remove/force - -# Add or remove space inside function '(' and ')' -sp_inside_fparen = ignore # ignore/add/remove/force - -# Add or remove space inside the first parens in the function type: 'void (*x)(...)' -sp_inside_tparen = ignore # ignore/add/remove/force - -# Add or remove between the parens in the function type: 'void (*x)(...)' -sp_after_tparen_close = ignore # ignore/add/remove/force - -# Add or remove space between ']' and '(' when part of a function call. -sp_square_fparen = ignore # ignore/add/remove/force - -# Add or remove space between ')' and '{' of function -sp_fparen_brace = ignore # ignore/add/remove/force - -# Add or remove space between function name and '(' on function calls -sp_func_call_paren = ignore # ignore/add/remove/force - -# Add or remove space between function name and '()' on function calls without parameters. -# If set to 'ignore' (the default), sp_func_call_paren is used. -sp_func_call_paren_empty = ignore # ignore/add/remove/force - -# Add or remove space between the user function name and '(' on function calls -# You need to set a keyword to be a user function, like this: 'set func_call_user _' in the config file. -sp_func_call_user_paren = ignore # ignore/add/remove/force - -# Add or remove space between a constructor/destructor and the open paren -sp_func_class_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'return' and '(' -sp_return_paren = ignore # ignore/add/remove/force - -# Add or remove space between '__attribute__' and '(' -sp_attribute_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'defined' and '(' in '#if defined (FOO)' -sp_defined_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'throw' and '(' in 'throw (something)' -sp_throw_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'throw' and anything other than '(' as in '@throw [...];' -sp_after_throw = ignore # ignore/add/remove/force - -# Add or remove space between 'catch' and '(' in 'catch (something) { }' -# If set to ignore, sp_before_sparen is used. -sp_catch_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'version' and '(' in 'version (something) { }' (D language) -# If set to ignore, sp_before_sparen is used. -sp_version_paren = ignore # ignore/add/remove/force - -# Add or remove space between 'scope' and '(' in 'scope (something) { }' (D language) -# If set to ignore, sp_before_sparen is used. -sp_scope_paren = ignore # ignore/add/remove/force - -# Add or remove space between macro and value -sp_macro = ignore # ignore/add/remove/force - -# Add or remove space between macro function ')' and value -sp_macro_func = ignore # ignore/add/remove/force - -# Add or remove space between 'else' and '{' if on the same line -sp_else_brace = ignore # ignore/add/remove/force - -# Add or remove space between '}' and 'else' if on the same line -sp_brace_else = ignore # ignore/add/remove/force - -# Add or remove space between '}' and the name of a typedef on the same line -sp_brace_typedef = ignore # ignore/add/remove/force - -# Add or remove space between 'catch' and '{' if on the same line -sp_catch_brace = ignore # ignore/add/remove/force - -# Add or remove space between '}' and 'catch' if on the same line -sp_brace_catch = ignore # ignore/add/remove/force - -# Add or remove space between 'finally' and '{' if on the same line -sp_finally_brace = ignore # ignore/add/remove/force - -# Add or remove space between '}' and 'finally' if on the same line -sp_brace_finally = ignore # ignore/add/remove/force - -# Add or remove space between 'try' and '{' if on the same line -sp_try_brace = ignore # ignore/add/remove/force - -# Add or remove space between get/set and '{' if on the same line -sp_getset_brace = ignore # ignore/add/remove/force - -# Add or remove space before the '::' operator -sp_before_dc = ignore # ignore/add/remove/force - -# Add or remove space after the '::' operator -sp_after_dc = ignore # ignore/add/remove/force - -# Add or remove around the D named array initializer ':' operator -sp_d_array_colon = ignore # ignore/add/remove/force - -# Add or remove space after the '!' (not) operator. Default=Remove -sp_not = remove # ignore/add/remove/force - -# Add or remove space after the '~' (invert) operator. Default=Remove -sp_inv = remove # ignore/add/remove/force - -# Add or remove space after the '&' (address-of) operator. Default=Remove -# This does not affect the spacing after a '&' that is part of a type. -sp_addr = remove # ignore/add/remove/force - -# Add or remove space around the '.' or '->' operators. Default=Remove -sp_member = remove # ignore/add/remove/force - -# Add or remove space after the '*' (dereference) operator. Default=Remove -# This does not affect the spacing after a '*' that is part of a type. -sp_deref = remove # ignore/add/remove/force - -# Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. Default=Remove -sp_sign = remove # ignore/add/remove/force - -# Add or remove space before or after '++' and '--', as in '(--x)' or 'y++;'. Default=Remove -sp_incdec = remove # ignore/add/remove/force - -# Add or remove space before a backslash-newline at the end of a line. Default=Add -sp_before_nl_cont = add # ignore/add/remove/force - -# Add or remove space after the scope '+' or '-', as in '-(void) foo;' or '+(int) bar;' -sp_after_oc_scope = ignore # ignore/add/remove/force - -# Add or remove space after the colon in message specs -# '-(int) f:(int) x;' vs '-(int) f: (int) x;' -sp_after_oc_colon = ignore # ignore/add/remove/force - -# Add or remove space before the colon in message specs -# '-(int) f: (int) x;' vs '-(int) f : (int) x;' -sp_before_oc_colon = ignore # ignore/add/remove/force - -# Add or remove space after the colon in immutable dictionary expression -# 'NSDictionary *test = @{@"foo" :@"bar"};' -sp_after_oc_dict_colon = ignore # ignore/add/remove/force - -# Add or remove space before the colon in immutable dictionary expression -# 'NSDictionary *test = @{@"foo" :@"bar"};' -sp_before_oc_dict_colon = ignore # ignore/add/remove/force - -# Add or remove space after the colon in message specs -# '[object setValue:1];' vs '[object setValue: 1];' -sp_after_send_oc_colon = ignore # ignore/add/remove/force - -# Add or remove space before the colon in message specs -# '[object setValue:1];' vs '[object setValue :1];' -sp_before_send_oc_colon = ignore # ignore/add/remove/force - -# Add or remove space after the (type) in message specs -# '-(int)f: (int) x;' vs '-(int)f: (int)x;' -sp_after_oc_type = ignore # ignore/add/remove/force - -# Add or remove space after the first (type) in message specs -# '-(int) f:(int)x;' vs '-(int)f:(int)x;' -sp_after_oc_return_type = ignore # ignore/add/remove/force - -# Add or remove space between '@selector' and '(' -# '@selector(msgName)' vs '@selector (msgName)' -# Also applies to @protocol() constructs -sp_after_oc_at_sel = ignore # ignore/add/remove/force - -# Add or remove space between '@selector(x)' and the following word -# '@selector(foo) a:' vs '@selector(foo)a:' -sp_after_oc_at_sel_parens = ignore # ignore/add/remove/force - -# Add or remove space inside '@selector' parens -# '@selector(foo)' vs '@selector( foo )' -# Also applies to @protocol() constructs -sp_inside_oc_at_sel_parens = ignore # ignore/add/remove/force - -# Add or remove space before a block pointer caret -# '^int (int arg){...}' vs. ' ^int (int arg){...}' -sp_before_oc_block_caret = ignore # ignore/add/remove/force - -# Add or remove space after a block pointer caret -# '^int (int arg){...}' vs. '^ int (int arg){...}' -sp_after_oc_block_caret = ignore # ignore/add/remove/force - -# Add or remove space between the receiver and selector in a message. -# '[receiver selector ...]' -sp_after_oc_msg_receiver = ignore # ignore/add/remove/force - -# Add or remove space after @property. -sp_after_oc_property = ignore # ignore/add/remove/force - -# Add or remove space around the ':' in 'b ? t : f' -sp_cond_colon = ignore # ignore/add/remove/force - -# Add or remove space around the '?' in 'b ? t : f' -sp_cond_question = ignore # ignore/add/remove/force - -# Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make sense here. -sp_case_label = ignore # ignore/add/remove/force - -# Control the space around the D '..' operator. -sp_range = ignore # ignore/add/remove/force - -# Control the spacing after ':' in 'for (TYPE VAR : EXPR)' (Java) -sp_after_for_colon = ignore # ignore/add/remove/force - -# Control the spacing before ':' in 'for (TYPE VAR : EXPR)' (Java) -sp_before_for_colon = ignore # ignore/add/remove/force - -# Control the spacing in 'extern (C)' (D) -sp_extern_paren = ignore # ignore/add/remove/force - -# Control the space after the opening of a C++ comment '// A' vs '//A' -sp_cmt_cpp_start = ignore # ignore/add/remove/force - -# Controls the spaces between #else or #endif and a trailing comment -sp_endif_cmt = ignore # ignore/add/remove/force - -# Controls the spaces after 'new', 'delete', and 'delete[]' -sp_after_new = ignore # ignore/add/remove/force - -# Controls the spaces before a trailing or embedded comment -sp_before_tr_emb_cmt = ignore # ignore/add/remove/force - -# Number of spaces before a trailing or embedded comment -sp_num_before_tr_emb_cmt = 0 # number - -# Control space between a Java annotation and the open paren. -sp_annotation_paren = ignore # ignore/add/remove/force - -# -# Code alignment (not left column spaces/tabs) -# - -# Whether to keep non-indenting tabs -align_keep_tabs = false # false/true - -# Whether to use tabs for aligning -align_with_tabs = false # false/true - -# Whether to bump out to the next tab when aligning -align_on_tabstop = false # false/true - -# Whether to left-align numbers -align_number_left = false # false/true - -# Align variable definitions in prototypes and functions -align_func_params = false # false/true - -# Align parameters in single-line functions that have the same name. -# The function names must already be aligned with each other. -align_same_func_call_params = false # false/true - -# The span for aligning variable definitions (0=don't align) -align_var_def_span = 0 # number - -# How to align the star in variable definitions. -# 0=Part of the type 'void * foo;' -# 1=Part of the variable 'void *foo;' -# 2=Dangling 'void *foo;' -align_var_def_star_style = 0 # number - -# How to align the '&' in variable definitions. -# 0=Part of the type -# 1=Part of the variable -# 2=Dangling -align_var_def_amp_style = 0 # number - -# The threshold for aligning variable definitions (0=no limit) -align_var_def_thresh = 0 # number - -# The gap for aligning variable definitions -align_var_def_gap = 0 # number - -# Whether to align the colon in struct bit fields -align_var_def_colon = false # false/true - -# Whether to align any attribute after the variable name -align_var_def_attribute = false # false/true - -# Whether to align inline struct/enum/union variable definitions -align_var_def_inline = false # false/true - -# The span for aligning on '=' in assignments (0=don't align) -align_assign_span = 0 # number - -# The threshold for aligning on '=' in assignments (0=no limit) -align_assign_thresh = 0 # number - -# The span for aligning on '=' in enums (0=don't align) -align_enum_equ_span = 0 # number - -# The threshold for aligning on '=' in enums (0=no limit) -align_enum_equ_thresh = 0 # number - -# The span for aligning struct/union (0=don't align) -align_var_struct_span = 0 # number - -# The threshold for aligning struct/union member definitions (0=no limit) -align_var_struct_thresh = 0 # number - -# The gap for aligning struct/union member definitions -align_var_struct_gap = 0 # number - -# The span for aligning struct initializer values (0=don't align) -align_struct_init_span = 0 # number - -# The minimum space between the type and the synonym of a typedef -align_typedef_gap = 0 # number - -# The span for aligning single-line typedefs (0=don't align) -align_typedef_span = 0 # number - -# How to align typedef'd functions with other typedefs -# 0: Don't mix them at all -# 1: align the open paren with the types -# 2: align the function type name with the other type names -align_typedef_func = 0 # number - -# Controls the positioning of the '*' in typedefs. Just try it. -# 0: Align on typedef type, ignore '*' -# 1: The '*' is part of type name: typedef int *pint; -# 2: The '*' is part of the type, but dangling: typedef int *pint; -align_typedef_star_style = 0 # number - -# Controls the positioning of the '&' in typedefs. Just try it. -# 0: Align on typedef type, ignore '&' -# 1: The '&' is part of type name: typedef int &pint; -# 2: The '&' is part of the type, but dangling: typedef int &pint; -align_typedef_amp_style = 0 # number - -# The span for aligning comments that end lines (0=don't align) -align_right_cmt_span = 0 # number - -# If aligning comments, mix with comments after '}' and #endif with less than 3 spaces before the comment -align_right_cmt_mix = false # false/true - -# If a trailing comment is more than this number of columns away from the text it follows, -# it will qualify for being aligned. This has to be > 0 to do anything. -align_right_cmt_gap = 0 # number - -# Align trailing comment at or beyond column N; 'pulls in' comments as a bonus side effect (0=ignore) -align_right_cmt_at_col = 0 # number - -# The span for aligning function prototypes (0=don't align) -align_func_proto_span = 0 # number - -# Minimum gap between the return type and the function name. -align_func_proto_gap = 0 # number - -# Align function protos on the 'operator' keyword instead of what follows -align_on_operator = false # false/true - -# Whether to mix aligning prototype and variable declarations. -# If true, align_var_def_XXX options are used instead of align_func_proto_XXX options. -align_mix_var_proto = false # false/true - -# Align single-line functions with function prototypes, uses align_func_proto_span -align_single_line_func = false # false/true - -# Aligning the open brace of single-line functions. -# Requires align_single_line_func=true, uses align_func_proto_span -align_single_line_brace = false # false/true - -# Gap for align_single_line_brace. -align_single_line_brace_gap = 0 # number - -# The span for aligning ObjC msg spec (0=don't align) -align_oc_msg_spec_span = 0 # number - -# Whether to align macros wrapped with a backslash and a newline. -# This will not work right if the macro contains a multi-line comment. -align_nl_cont = false # false/true - -# # Align macro functions and variables together -align_pp_define_together = false # false/true - -# The minimum space between label and value of a preprocessor define -align_pp_define_gap = 0 # number - -# The span for aligning on '#define' bodies (0=don't align) -align_pp_define_span = 0 # number - -# Align lines that start with '<<' with previous '<<'. Default=true -align_left_shift = true # false/true - -# Span for aligning parameters in an Obj-C message call on the ':' (0=don't align) -align_oc_msg_colon_span = 0 # number - -# If true, always align with the first parameter, even if it is too short. -align_oc_msg_colon_first = false # false/true - -# Aligning parameters in an Obj-C '+' or '-' declaration on the ':' -align_oc_decl_colon = false # false/true - -# -# Newline adding and removing options -# - -# Whether to collapse empty blocks between '{' and '}' -nl_collapse_empty_body = false # false/true - -# Don't split one-line braced assignments - 'foo_t f = { 1, 2 };' -nl_assign_leave_one_liners = false # false/true - -# Don't split one-line braced statements inside a class xx { } body -nl_class_leave_one_liners = false # false/true - -# Don't split one-line enums: 'enum foo { BAR = 15 };' -nl_enum_leave_one_liners = false # false/true - -# Don't split one-line get or set functions -nl_getset_leave_one_liners = false # false/true - -# Don't split one-line function definitions - 'int foo() { return 0; }' -nl_func_leave_one_liners = false # false/true - -# Don't split one-line if/else statements - 'if(a) b++;' -nl_if_leave_one_liners = false # false/true - -# Don't split one-line OC messages -nl_oc_msg_leave_one_liner = false # false/true - -# Add or remove newlines at the start of the file -nl_start_of_file = ignore # ignore/add/remove/force - -# The number of newlines at the start of the file (only used if nl_start_of_file is 'add' or 'force' -nl_start_of_file_min = 0 # number - -# Add or remove newline at the end of the file -nl_end_of_file = ignore # ignore/add/remove/force - -# The number of newlines at the end of the file (only used if nl_end_of_file is 'add' or 'force') -nl_end_of_file_min = 0 # number - -# Add or remove newline between '=' and '{' -nl_assign_brace = ignore # ignore/add/remove/force - -# Add or remove newline between '=' and '[' (D only) -nl_assign_square = ignore # ignore/add/remove/force - -# Add or remove newline after '= [' (D only). Will also affect the newline before the ']' -nl_after_square_assign = ignore # ignore/add/remove/force - -# The number of blank lines after a block of variable definitions at the top of a function body -# 0 = No change (default) -nl_func_var_def_blk = 0 # number - -# The number of newlines before a block of typedefs -# 0 = No change (default) -nl_typedef_blk_start = 0 # number - -# The number of newlines after a block of typedefs -# 0 = No change (default) -nl_typedef_blk_end = 0 # number - -# The maximum consecutive newlines within a block of typedefs -# 0 = No change (default) -nl_typedef_blk_in = 0 # number - -# The number of newlines before a block of variable definitions not at the top of a function body -# 0 = No change (default) -nl_var_def_blk_start = 0 # number - -# The number of newlines after a block of variable definitions not at the top of a function body -# 0 = No change (default) -nl_var_def_blk_end = 0 # number - -# The maximum consecutive newlines within a block of variable definitions -# 0 = No change (default) -nl_var_def_blk_in = 0 # number - -# Add or remove newline between a function call's ')' and '{', as in: -# list_for_each(item, &list) { } -nl_fcall_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'enum' and '{' -nl_enum_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'struct and '{' -nl_struct_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'union' and '{' -nl_union_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'if' and '{' -nl_if_brace = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and 'else' -nl_brace_else = ignore # ignore/add/remove/force - -# Add or remove newline between 'else if' and '{' -# If set to ignore, nl_if_brace is used instead -nl_elseif_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'else' and '{' -nl_else_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'else' and 'if' -nl_else_if = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and 'finally' -nl_brace_finally = ignore # ignore/add/remove/force - -# Add or remove newline between 'finally' and '{' -nl_finally_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'try' and '{' -nl_try_brace = ignore # ignore/add/remove/force - -# Add or remove newline between get/set and '{' -nl_getset_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'for' and '{' -nl_for_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'catch' and '{' -nl_catch_brace = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and 'catch' -nl_brace_catch = ignore # ignore/add/remove/force - -# Add or remove newline between 'while' and '{' -nl_while_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'scope (x)' and '{' (D) -nl_scope_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'unittest' and '{' (D) -nl_unittest_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'version (x)' and '{' (D) -nl_version_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'using' and '{' -nl_using_brace = ignore # ignore/add/remove/force - -# Add or remove newline between two open or close braces. -# Due to general newline/brace handling, REMOVE may not work. -nl_brace_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'do' and '{' -nl_do_brace = ignore # ignore/add/remove/force - -# Add or remove newline between '}' and 'while' of 'do' statement -nl_brace_while = ignore # ignore/add/remove/force - -# Add or remove newline between 'switch' and '{' -nl_switch_brace = ignore # ignore/add/remove/force - -# Add a newline between ')' and '{' if the ')' is on a different line than the if/for/etc. -# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch, and nl_catch_brace. -nl_multi_line_cond = false # false/true - -# Force a newline in a define after the macro name for multi-line defines. -nl_multi_line_define = false # false/true - -# Whether to put a newline before 'case' statement -nl_before_case = false # false/true - -# Add or remove newline between ')' and 'throw' -nl_before_throw = ignore # ignore/add/remove/force - -# Whether to put a newline after 'case' statement -nl_after_case = false # false/true - -# Add or remove a newline between a case ':' and '{'. Overrides nl_after_case. -nl_case_colon_brace = ignore # ignore/add/remove/force - -# Newline between namespace and { -nl_namespace_brace = ignore # ignore/add/remove/force - -# Add or remove newline between 'template<>' and whatever follows. -nl_template_class = ignore # ignore/add/remove/force - -# Add or remove newline between 'class' and '{' -nl_class_brace = ignore # ignore/add/remove/force - -# Add or remove newline after each ',' in the constructor member initialization -nl_class_init_args = ignore # ignore/add/remove/force - -# Add or remove newline between return type and function name in a function definition -nl_func_type_name = ignore # ignore/add/remove/force - -# Add or remove newline between return type and function name inside a class {} -# Uses nl_func_type_name or nl_func_proto_type_name if set to ignore. -nl_func_type_name_class = ignore # ignore/add/remove/force - -# Add or remove newline between function scope and name in a definition -# Controls the newline after '::' in 'void A::f() { }' -nl_func_scope_name = ignore # ignore/add/remove/force - -# Add or remove newline between return type and function name in a prototype -nl_func_proto_type_name = ignore # ignore/add/remove/force - -# Add or remove newline between a function name and the opening '(' -nl_func_paren = ignore # ignore/add/remove/force - -# Add or remove newline between a function name and the opening '(' in the definition -nl_func_def_paren = ignore # ignore/add/remove/force - -# Add or remove newline after '(' in a function declaration -nl_func_decl_start = ignore # ignore/add/remove/force - -# Add or remove newline after '(' in a function definition -nl_func_def_start = ignore # ignore/add/remove/force - -# Overrides nl_func_decl_start when there is only one parameter. -nl_func_decl_start_single = ignore # ignore/add/remove/force - -# Overrides nl_func_def_start when there is only one parameter. -nl_func_def_start_single = ignore # ignore/add/remove/force - -# Add or remove newline after each ',' in a function declaration -nl_func_decl_args = ignore # ignore/add/remove/force - -# Add or remove newline after each ',' in a function definition -nl_func_def_args = ignore # ignore/add/remove/force - -# Add or remove newline before the ')' in a function declaration -nl_func_decl_end = ignore # ignore/add/remove/force - -# Add or remove newline before the ')' in a function definition -nl_func_def_end = ignore # ignore/add/remove/force - -# Overrides nl_func_decl_end when there is only one parameter. -nl_func_decl_end_single = ignore # ignore/add/remove/force - -# Overrides nl_func_def_end when there is only one parameter. -nl_func_def_end_single = ignore # ignore/add/remove/force - -# Add or remove newline between '()' in a function declaration. -nl_func_decl_empty = ignore # ignore/add/remove/force - -# Add or remove newline between '()' in a function definition. -nl_func_def_empty = ignore # ignore/add/remove/force - -# Whether to put each OC message parameter on a separate line -# See nl_oc_msg_leave_one_liner -nl_oc_msg_args = false # false/true - -# Add or remove newline between function signature and '{' -nl_fdef_brace = ignore # ignore/add/remove/force - -# Add or remove a newline between the return keyword and return expression. -nl_return_expr = ignore # ignore/add/remove/force - -# Whether to put a newline after semicolons, except in 'for' statements -nl_after_semicolon = false # false/true - -# Whether to put a newline after brace open. -# This also adds a newline before the matching brace close. -nl_after_brace_open = false # false/true - -# If nl_after_brace_open and nl_after_brace_open_cmt are true, a newline is -# placed between the open brace and a trailing single-line comment. -nl_after_brace_open_cmt = false # false/true - -# Whether to put a newline after a virtual brace open with a non-empty body. -# These occur in un-braced if/while/do/for statement bodies. -nl_after_vbrace_open = false # false/true - -# Whether to put a newline after a virtual brace open with an empty body. -# These occur in un-braced if/while/do/for statement bodies. -nl_after_vbrace_open_empty = false # false/true - -# Whether to put a newline after a brace close. -# Does not apply if followed by a necessary ';'. -nl_after_brace_close = false # false/true - -# Whether to put a newline after a virtual brace close. -# Would add a newline before return in: 'if (foo) a++; return;' -nl_after_vbrace_close = false # false/true - -# Control the newline between the close brace and 'b' in: 'struct { int a; } b;' -# Affects enums, unions, and structures. If set to ignore, uses nl_after_brace_close -nl_brace_struct_var = ignore # ignore/add/remove/force - -# Whether to alter newlines in '#define' macros -nl_define_macro = false # false/true - -# Whether to not put blanks after '#ifxx', '#elxx', or before '#endif' -nl_squeeze_ifdef = false # false/true - -# Add or remove blank line before 'if' -nl_before_if = ignore # ignore/add/remove/force - -# Add or remove blank line after 'if' statement -nl_after_if = ignore # ignore/add/remove/force - -# Add or remove blank line before 'for' -nl_before_for = ignore # ignore/add/remove/force - -# Add or remove blank line after 'for' statement -nl_after_for = ignore # ignore/add/remove/force - -# Add or remove blank line before 'while' -nl_before_while = ignore # ignore/add/remove/force - -# Add or remove blank line after 'while' statement -nl_after_while = ignore # ignore/add/remove/force - -# Add or remove blank line before 'switch' -nl_before_switch = ignore # ignore/add/remove/force - -# Add or remove blank line after 'switch' statement -nl_after_switch = ignore # ignore/add/remove/force - -# Add or remove blank line before 'do' -nl_before_do = ignore # ignore/add/remove/force - -# Add or remove blank line after 'do/while' statement -nl_after_do = ignore # ignore/add/remove/force - -# Whether to double-space commented-entries in struct/enum -nl_ds_struct_enum_cmt = false # false/true - -# Whether to double-space before the close brace of a struct/union/enum -# (lower priority than 'eat_blanks_before_close_brace') -nl_ds_struct_enum_close_brace = false # false/true - -# Add or remove a newline around a class colon. -# Related to pos_class_colon, nl_class_init_args, and pos_comma. -nl_class_colon = ignore # ignore/add/remove/force - -# Change simple unbraced if statements into a one-liner -# 'if(b)\n i++;' => 'if(b) i++;' -nl_create_if_one_liner = false # false/true - -# Change simple unbraced for statements into a one-liner -# 'for (i=0;i<5;i++)\n foo(i);' => 'for (i=0;i<5;i++) foo(i);' -nl_create_for_one_liner = false # false/true - -# Change simple unbraced while statements into a one-liner -# 'while (i<5)\n foo(i++);' => 'while (i<5) foo(i++);' -nl_create_while_one_liner = false # false/true - -# -# Positioning options -# - -# The position of arithmetic operators in wrapped expressions -pos_arith = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force - -# The position of assignment in wrapped expressions. -# Do not affect '=' followed by '{' -pos_assign = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force - -# The position of boolean operators in wrapped expressions -pos_bool = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force - -# The position of comparison operators in wrapped expressions -pos_compare = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force - -# The position of conditional (b ? t : f) operators in wrapped expressions -pos_conditional = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force - -# The position of the comma in wrapped expressions -pos_comma = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force - -# The position of the comma in the constructor initialization list -pos_class_comma = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force - -# The position of colons between constructor and member initialization -pos_class_colon = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force - -# -# Line Splitting options -# - -# Try to limit code width to N number of columns -code_width = 0 # number - -# Whether to fully split long 'for' statements at semi-colons -ls_for_split_full = false # false/true - -# Whether to fully split long function protos/calls at commas -ls_func_split_full = false # false/true - -# Whether to split lines as close to code_width as possible and ignore some groupings -ls_code_width = false # false/true - -# -# Blank line options -# - -# The maximum consecutive newlines -nl_max = 0 # number - -# The number of newlines after a function prototype, if followed by another function prototype -nl_after_func_proto = 0 # number - -# The number of newlines after a function prototype, if not followed by another function prototype -nl_after_func_proto_group = 0 # number - -# The number of newlines after '}' of a multi-line function body -nl_after_func_body = 0 # number - -# The number of newlines after '}' of a multi-line function body in a class declaration -nl_after_func_body_class = 0 # number - -# The number of newlines after '}' of a single line function body -nl_after_func_body_one_liner = 0 # number - -# The minimum number of newlines before a multi-line comment. -# Doesn't apply if after a brace open or another multi-line comment. -nl_before_block_comment = 0 # number - -# The minimum number of newlines before a single-line C comment. -# Doesn't apply if after a brace open or other single-line C comments. -nl_before_c_comment = 0 # number - -# The minimum number of newlines before a CPP comment. -# Doesn't apply if after a brace open or other CPP comments. -nl_before_cpp_comment = 0 # number - -# Whether to force a newline after a multi-line comment. -nl_after_multiline_comment = false # false/true - -# The number of newlines after '}' or ';' of a struct/enum/union definition -nl_after_struct = 0 # number - -# The number of newlines after '}' or ';' of a class definition -nl_after_class = 0 # number - -# The number of newlines before a 'private:', 'public:', 'protected:', 'signals:', or 'slots:' label. -# Will not change the newline count if after a brace open. -# 0 = No change. -nl_before_access_spec = 0 # number - -# The number of newlines after a 'private:', 'public:', 'protected:', 'signals:', or 'slots:' label. -# 0 = No change. -nl_after_access_spec = 0 # number - -# The number of newlines between a function def and the function comment. -# 0 = No change. -nl_comment_func_def = 0 # number - -# The number of newlines after a try-catch-finally block that isn't followed by a brace close. -# 0 = No change. -nl_after_try_catch_finally = 0 # number - -# The number of newlines before and after a property, indexer or event decl. -# 0 = No change. -nl_around_cs_property = 0 # number - -# The number of newlines between the get/set/add/remove handlers in C#. -# 0 = No change. -nl_between_get_set = 0 # number - -# Add or remove newline between C# property and the '{' -nl_property_brace = ignore # ignore/add/remove/force - -# Whether to remove blank lines after '{' -eat_blanks_after_open_brace = false # false/true - -# Whether to remove blank lines before '}' -eat_blanks_before_close_brace = false # false/true - -# How aggressively to remove extra newlines not in preproc. -# 0: No change -# 1: Remove most newlines not handled by other config -# 2: Remove all newlines and reformat completely by config -nl_remove_extra_newlines = 0 # number - -# Whether to put a blank line before 'return' statements, unless after an open brace. -nl_before_return = false # false/true - -# Whether to put a blank line after 'return' statements, unless followed by a close brace. -nl_after_return = false # false/true - -# Whether to put a newline after a Java annotation statement. -# Only affects annotations that are after a newline. -nl_after_annotation = ignore # ignore/add/remove/force - -# Controls the newline between two annotations. -nl_between_annotation = ignore # ignore/add/remove/force - -# -# Code modifying options (non-whitespace) -# - -# Add or remove braces on single-line 'do' statement -mod_full_brace_do = ignore # ignore/add/remove/force - -# Add or remove braces on single-line 'for' statement -mod_full_brace_for = ignore # ignore/add/remove/force - -# Add or remove braces on single-line function definitions. (Pawn) -mod_full_brace_function = ignore # ignore/add/remove/force - -# Add or remove braces on single-line 'if' statement. Will not remove the braces if they contain an 'else'. -mod_full_brace_if = ignore # ignore/add/remove/force - -# Make all if/elseif/else statements in a chain be braced or not. Overrides mod_full_brace_if. -# If any must be braced, they are all braced. If all can be unbraced, then the braces are removed. -mod_full_brace_if_chain = false # false/true - -# Don't remove braces around statements that span N newlines -mod_full_brace_nl = 0 # number - -# Add or remove braces on single-line 'while' statement -mod_full_brace_while = ignore # ignore/add/remove/force - -# Add or remove braces on single-line 'using ()' statement -mod_full_brace_using = ignore # ignore/add/remove/force - -# Add or remove unnecessary paren on 'return' statement -mod_paren_on_return = ignore # ignore/add/remove/force - -# Whether to change optional semicolons to real semicolons -mod_pawn_semicolon = false # false/true - -# Add parens on 'while' and 'if' statement around bools -mod_full_paren_if_bool = false # false/true - -# Whether to remove superfluous semicolons -mod_remove_extra_semicolon = false # false/true - -# If a function body exceeds the specified number of newlines and doesn't have a comment after -# the close brace, a comment will be added. -mod_add_long_function_closebrace_comment = 0 # number - -# If a switch body exceeds the specified number of newlines and doesn't have a comment after -# the close brace, a comment will be added. -mod_add_long_switch_closebrace_comment = 0 # number - -# If an #ifdef body exceeds the specified number of newlines and doesn't have a comment after -# the #endif, a comment will be added. -mod_add_long_ifdef_endif_comment = 0 # number - -# If an #ifdef or #else body exceeds the specified number of newlines and doesn't have a comment after -# the #else, a comment will be added. -mod_add_long_ifdef_else_comment = 0 # number - -# If TRUE, will sort consecutive single-line 'import' statements [Java, D] -mod_sort_import = false # false/true - -# If TRUE, will sort consecutive single-line 'using' statements [C#] -mod_sort_using = false # false/true - -# If TRUE, will sort consecutive single-line '#include' statements [C/C++] and '#import' statements [Obj-C] -# This is generally a bad idea, as it may break your code. -mod_sort_include = false # false/true - -# If TRUE, it will move a 'break' that appears after a fully braced 'case' before the close brace. -mod_move_case_break = false # false/true - -# Will add or remove the braces around a fully braced case statement. -# Will only remove the braces if there are no variable declarations in the block. -mod_case_brace = ignore # ignore/add/remove/force - -# If TRUE, it will remove a void 'return;' that appears as the last statement in a function. -mod_remove_empty_return = false # false/true - -# -# Comment modifications -# - -# Try to wrap comments at cmt_width columns -cmt_width = 0 # number - -# Set the comment reflow mode (default: 0) -# 0: no reflowing (apart from the line wrapping due to cmt_width) -# 1: no touching at all -# 2: full reflow -cmt_reflow_mode = 0 # number - -# If false, disable all multi-line comment changes, including cmt_width. keyword substitution, and leading chars. -# Default is true. -cmt_indent_multi = true # false/true - -# Whether to group c-comments that look like they are in a block -cmt_c_group = false # false/true - -# Whether to put an empty '/*' on the first line of the combined c-comment -cmt_c_nl_start = false # false/true - -# Whether to put a newline before the closing '*/' of the combined c-comment -cmt_c_nl_end = false # false/true - -# Whether to group cpp-comments that look like they are in a block -cmt_cpp_group = false # false/true - -# Whether to put an empty '/*' on the first line of the combined cpp-comment -cmt_cpp_nl_start = false # false/true - -# Whether to put a newline before the closing '*/' of the combined cpp-comment -cmt_cpp_nl_end = false # false/true - -# Whether to change cpp-comments into c-comments -cmt_cpp_to_c = false # false/true - -# Whether to put a star on subsequent comment lines -cmt_star_cont = false # false/true - -# The number of spaces to insert at the start of subsequent comment lines -cmt_sp_before_star_cont = 0 # number - -# The number of spaces to insert after the star on subsequent comment lines -cmt_sp_after_star_cont = 0 # number - -# For multi-line comments with a '*' lead, remove leading spaces if the first and last lines of -# the comment are the same length. Default=True -cmt_multi_check_last = true # false/true - -# The filename that contains text to insert at the head of a file if the file doesn't start with a C/C++ comment. -# Will substitute $(filename) with the current file's name. -cmt_insert_file_header = "" # string - -# The filename that contains text to insert at the end of a file if the file doesn't end with a C/C++ comment. -# Will substitute $(filename) with the current file's name. -cmt_insert_file_footer = "" # string - -# The filename that contains text to insert before a function implementation if the function isn't preceded with a C/C++ comment. -# Will substitute $(function) with the function name and $(javaparam) with the javadoc @param and @return stuff. -# Will also substitute $(fclass) with the class name: void CFoo::Bar() { ... } -cmt_insert_func_header = "" # string - -# The filename that contains text to insert before a class if the class isn't preceded with a C/C++ comment. -# Will substitute $(class) with the class name. -cmt_insert_class_header = "" # string - -# The filename that contains text to insert before a Obj-C message specification if the method isn't preceeded with a C/C++ comment. -# Will substitute $(message) with the function name and $(javaparam) with the javadoc @param and @return stuff. -cmt_insert_oc_msg_header = "" # string - -# If a preprocessor is encountered when stepping backwards from a function name, then -# this option decides whether the comment should be inserted. -# Affects cmt_insert_oc_msg_header, cmt_insert_func_header and cmt_insert_class_header. -cmt_insert_before_preproc = false # false/true - -# -# Preprocessor options -# - -# Control indent of preprocessors inside #if blocks at brace level 0 -pp_indent = ignore # ignore/add/remove/force - -# Whether to indent #if/#else/#endif at the brace level (true) or from column 1 (false) -pp_indent_at_level = false # false/true - -# If pp_indent_at_level=false, specifies the number of columns to indent per level. Default=1. -pp_indent_count = 1 # number - -# Add or remove space after # based on pp_level of #if blocks -pp_space = ignore # ignore/add/remove/force - -# Sets the number of spaces added with pp_space -pp_space_count = 0 # number - -# The indent for #region and #endregion in C# and '#pragma region' in C/C++ -pp_indent_region = 0 # number - -# Whether to indent the code between #region and #endregion -pp_region_indent_code = false # false/true - -# If pp_indent_at_level=true, sets the indent for #if, #else, and #endif when not at file-level -pp_indent_if = 0 # number - -# Control whether to indent the code between #if, #else and #endif when not at file-level -pp_if_indent_code = false # false/true - -# Whether to indent '#define' at the brace level (true) or from column 1 (false) -pp_define_at_level = false # false/true - -# You can force a token to be a type with the 'type' option. -# Example: -# type myfoo1 myfoo2 -# -# You can create custom macro-based indentation using macro-open, -# macro-else and macro-close. -# Example: -# macro-open BEGIN_TEMPLATE_MESSAGE_MAP -# macro-open BEGIN_MESSAGE_MAP -# macro-close END_MESSAGE_MAP -# -# You can assign any keyword to any type with the set option. -# set func_call_user _ N_ -# -# The full syntax description of all custom definition config entries -# is shown below: -# -# define custom tokens as: -# - embed whitespace in token using '' escape character, or -# put token in quotes -# - these: ' " and ` are recognized as quote delimiters -# -# type token1 token2 token3 ... -# ^ optionally specify multiple tokens on a single line -# define def_token output_token -# ^ output_token is optional, then NULL is assumed -# macro-open token -# macro-close token -# macro-else token -# set id token1 token2 ... -# ^ optionally specify multiple tokens on a single line -# ^ id is one of the names in token_enum.h sans the CT_ prefix, -# e.g. PP_PRAGMA -# -# all tokens are separated by any mix of ',' commas, '=' equal signs -# and whitespace (space, tab) -# diff --git a/external/libwally-core/tools/wordlist_cc.py b/external/libwally-core/tools/wordlist_cc.py deleted file mode 100755 index bbf32528f..000000000 --- a/external/libwally-core/tools/wordlist_cc.py +++ /dev/null @@ -1,53 +0,0 @@ -from binascii import b2a_hex -import sys - -def as_hex(s): - return ','.join([hex(c) for c in s.encode('utf8')]) - -if __name__ == "__main__": - - bits = { 2 ** x : x for x in range(12) } # Up to 4k words - wordlist = sys.argv[1] - struct_name = '%s_words' % sys.argv[2] - string_name = '%s' % sys.argv[2] - - with open(wordlist, 'r') as f: - - words = [l.strip() for l in f.readlines()] - is_sorted = sorted(words) == words - assert len(words) >= 2 - assert len(words) in bits - - lengths = [ 0 ]; - for w in words: - lengths.append(lengths[-1] + len(w.encode('utf-8')) + 1) - idxs = ['{0}+{1}'.format(string_name, n) for n in lengths] - - print('/* Generated file - do not edit! */') - print('#include ') - print() - - print('static const unsigned char %s_[] = {' % string_name) - grouped = [words[i : i + 4] for i in range(0, len(words), 4)] - for w in words: - print(' %s,0,' % as_hex(w)) - print('};') - - print('#define %s ((const char*)%s_)' % (string_name, string_name)) - - print('static const char *%s_i[] = {' % (string_name)) - grouped = [idxs[i : i + 6] for i in range(0, len(idxs), 6)] - for g in grouped: - print(' %s,' % (', '.join(g))) - print(' };') - print('#undef %s' % string_name) - - print() - print('static const struct words %s = {' % struct_name) - print(' {0},'.format(len(words))) - print(' {0},'.format(bits[len(words)])) - print(' {0},'.format(str(is_sorted).lower())) - print(' (const char *)%s_,' % string_name) - print(' 0, /* Constant string */') - print(' %s_i' % string_name) - print('};')